Derinlik öncelikli arama (Depth-first Search(DFS)) Giriş: G = (V, E), yönlü veya yönsüz. Başlangıç köşe verilmez! Çıkış: Her köşe için 2 zaman değeri, bu değerler 1 ve 2|V| arasındaki tam sayılardır d[v] = köşenin keşfedilme zamanı (discovery time (v köşesinin beyazdan griye döndüğü an) f [v] = bitiş zamanı(finishing time (v köşesinin griden siyaha döndüğü an) [v] : v nin velisi, yani v köşesi [v] nin komşusu olarak keşfedilmiştir. Renklendirme aynen BFS de olduğu gibidir.
Sözde kod(Pseudo-code) DFS(G) 1. for each vertex u V[G] 2. do color[u] white 3. [u] NIL 4. time 0 5. for each vertex u V[G] 6. do if color[u] = white 7. then DFS-Visit(u) DFS-Visit(u) color[u] GRAY White vertex u has been discovered time time + 1 d[u] time for each v Adj[u] do if color[v] = WHITE then [v] u DFS-Visit(v) color[u] BLACK Blacken u; it is finished. f[u] time time + 1 time değişkeni global değişkendir.
Örnek(DFS) u v w 1/ x y z
Örnek(DFS) u v w 1/ 2/ x y z
Örnek (DFS) u v w 1/ 2/ 3/ x y z
Örnek(DFS) u v w 1/ 2/ 4/ 3/ x y z
Örnek (DFS) u v w 1/ 2/ B 4/ 3/ x y z
Örnek(DFS) u v w 1/ 2/ B 4/5 3/ x y z
Örnek(DFS) u v w 1/ 2/ B 4/5 3/6 x y z
Örnek (DFS) u v w 1/ 2/7 B 4/5 3/6 x y z
Örnek (DFS) u v w 1/ 2/7 B F 4/5 3/6 x y z
Örnek(DFS) u v w 1/8 2/7 B F 4/5 3/6 x y z
Örnek (DFS) u v w 1/8 2/7 9/ B F 4/5 3/6 x y z
Örnek (DFS) u v w 1/8 2/7 9/ B C F 4/5 3/6 x y z
Örnek (DFS) u v w 1/8 2/7 9/ B C F 4/5 3/6 10/ x y z
Örnek (DFS) u v w 1/8 2/7 9/ B C F 4/5 3/6 10/ B x y z
Örnek (DFS) u v w 1/8 2/7 9/ B C F 4/5 3/6 10/11 B x y z
Örnek (DFS) u v w 1/8 2/7 9/12 B C F 4/5 3/6 10/11 B x y z
DFS nin zaman analizi 1-2 & 5-7 döngüleri DFS-Visit olmadan (V) zaman alır. DFS-Visit ilk defa griye boyanacak olan her köşe için çağrılır. DFS-Visit de 3-6 komutları |Adj[v]| defa çalışır. DFS-Visit toplamda vV|Adj[v]| = (E) zaman alır. DFS nin toplam zamanı (V+E) olur.
Yani d[u] < d[v] < f [u] < f [v] olamaz. Parantezlere benzer: Parantez teoremi Theorem Her u, v köşeleri için tam olarak aşağıdakilerden biri doğru olacaktır: 1. d[u] < f [u] < d[v] < f [v] veya d[v] < f [v] < d[u] < f [u] yani u ve v bir birinin soyundan değil 2. d[u] < d[v] < f [v] < f [u] yani v köşesi u nun soyundandır. 3. d[v] < d[u] < f [u] < f [v] yani u köşesi v nin soyundandır. Yani d[u] < d[v] < f [u] < f [v] olamaz. Parantezlere benzer: ( ) [ ] ( [ ] ) [ ( ) ] olabilir ( [ ) ] [ ( ] ) olamaz. Not: v köşesi u nun soyundandır ancak ve ancak d[u] < d[v] < f [v] < f [u].
Örnek(Parentez teoremi) y z s t 2/9 3/6 1/10 11/16 B F C B 4/5 7/8 12/13 14/15 C C C x w v u (s (z (y (x x) y) (w w) z) s) (t (v v) (u u) t)
Derinlik öncelikli ağaçlar (Depth-First Trees(DFT)) Üretilen alt çizge BFS de olduğundan bir az farklıdır. DFS de alt çizge G = (V, E) burada E ={([v],v) : v V ve [v] NIL}. BFS den farkı nedir? G burada derinlik öncelikli ağaçlardan (depth-first trees) oluşan derinlik öncelikli orman ( depth-first forest ) oluşturur. E de bulunan kirişlere ağaç kirişleri denir.
Kirişlerin sınıflandırılması Ağaç kirişi (Tree edge): Derinlik öncelikli ormanda (DFF) de bulunan kirişler. Geri kiriş (Back edge): (u, v), burada u köşesi v nin soyundandır v ( derinlik öncelikli ağaçta). İleri kiriş (Forward edge): (u, v), burada v köşesi u nun soyundandır ama bu kiriş ağaç kiriş değil. Çapraz kiriş (Cross edge): diğer tüm kirişler. Aynı ağacın köşeleri arasında veya farklı ağaçların köşeleri arasında olabilirler. Theorem: Eğer giriş çizgesi yönsüz bir çizge ise DFS sonucunda sadece ağaç ve geri kirişler oluşacaktır.
Topolojik sıralamada tam sıralama elde edilir. Topolojik sıralama yönlü devirsiz çizgelerde (directed acyclic graphs (DAGs)) yani G = (V, E) de : köşeleri doğrusal bir sıraya diziyor, böyle ki (u, v) kirişi varsa , u köşesi sıralamada v den önce gelmektedir. Yönlü devirsiz çizgeler(Directed acyclic graphs (DAGs)) kısmı sıralaması (partial order) olan süreçleri ifade etmek için kullanılırlar: Bu çizgelerde a köşesi b den önce ve b köşesi c den önce geliyorsa a köşesi c den öncedir diyebiliriz ama b köşesi c den önce ve a köşesi c den önce ise a ve b ile ilgili bir şey söyleyemeyiz. Topolojik sıralamada tam sıralama elde edilir.
I Topolojik sıralama 8 TOPOLOGICAL-SORT(V, E) Call DFS(V, E) to compute finishing times f[v] for each vertex v When each vertex is finished, insert it onto the front of a linked list Return the linked list of vertices B 11/ 16 17/ 18 A 12/ 15 C D 13/ 14 F 1/ 8 6/ 7 G E 9/ 10 H 2/ 5 I 3/ 4 A B C D E F G H I İşlem süresi: (V + E)
Topolojik sıralama B 11/ 16 17/ 18 A Topolojik sıralama: Köşelerin bir doğru üzerinde, tüm kirişlerin soldaki bir köşeden sağdaki bir köşeye olacak biçimde sıralanması 12/ 15 C D 13/ 14 F 1/ 8 6/ 7 G E 9/ 10 H 2/ 5 I 3/ 4 A B C D E F G H I
Kuvvetli Bağlantılı Bileşenler Yönlü bir G = (V, E) çizgesi veriliyor: Kuvvetli bağlantılı bileşen (SCC): V nin maksimum köşe içeren öğle bir C V altkümesidir ki u, v C için u v ve v u yolları vardır.
Bir çizgenin transpozu GT = G nin transpozu GT çizgesi G den tüm kirişlerin yönlerinin ters yönlendirilmesi ile oluşmuştur. GT = (V, ET), ET = {(u, v) : (v, u) E} Komşuluk listesi kullanıldığında GT yi (V + E) işlem zamanında bulabiliyoruz. 1 2 5 4 3 1 2 5 4 3
SCC bulunması Gözlem: G ve GT ikiisnin de SCC’leri aynıdır u ve v köşeleri G de birbirinden ulaşılabilirdir bu köşeler GT de biribirinden ulaşılabilirdir. Ana fikir: 2 tane DFS uygulamak: G ve GT de 1 2 5 4 3 1 2 5 4 3
a b c d e f g h b e a c d g h f a b c d e f g h Örnek Önce G de DFS uygula 13/ 14 11/ 16 1/ 10 8/ 9 b e a c d g h f 12/ 15 3/ 4 2/ 7 5/ 6 a b c d e f g h Sonra GT de G deki DFS de bitiş zamanlarının azalan sırasına göre DFS uygulama b den başla: a, e yi gez c den başla: d yi gez g den başla: f i gez h dan başla Strongly connected components: C1 = {a, b, e}, C2 = {c, d}, C3 = {f, g}, C4 = {h}
a b c d e f g h Bileşen çizgesi a b e c d f g h Bileşen çizgesi GSCC = (VSCC, ESCC): VSCC = {v1, v2, …, vk}, burada vi her bir Ci kuvvetli bağlantılı bileşen karşılık geliyor (vi, vj) ESCC kirişi vardır eğer G de x Ci and y Cj olacak biçimde (x, y) kirişi varsa Bileşen çizgesi bir DAG olur.