Algoritmalar II Ders 12 DFS algoritması. Kirişlerin sınıflandırılması. Topolojik Sıralama.Kuvvetli bağlantılı bileşenler
Derinlik öncelikli arama (Depth-First Search (DFS)) Giriş: G = (V, E) (Kaynak köşe verilmez!) Amaç: En son ziyaret edilen köşeden başlamak koşuluyla G'deki kirişleri üzerinde gezinerek V'deki her köşeyi "keşfetmek” Gezinme sırasında bir çok kaynak köşe kullanılabilir Çıkış: 2 zaman değişkeni: d[v] = keşfetme zamanı f[v] = bitiş zamanı( v’nin komşuluk listesi bitmiştir) Derinlik öncelikli orman (Depth-First Forest(DFF)) 1 2 5 4 3
Derinlik öncelikli arama (Depth-First Search (DFS)) Gizgede olabildiğince “derine” giderek arama yap Her adımda en son keşfedilen köşeden üzerinde gezinme yapılmamış kiriş üzerinden keşfedilmemiş bir köşeye gidilir (eğer mümkünse) 1 2 5 4 3 Arama bir v köşesi seçilerek başlanır ve v den ulaşılabilir tüm köşeler bitene kadar süreç devam eder. Eğer süreç bitiğinde çizgede halen keşfedilmemiş köşe kalmışsa bu defa keşfedilmemiş köşelerden birinden başlanır ve yine süreç seçilen başlangıç köşeden ulaşılabilir tüm köşeler keşfedilene kadar devam eder. DFS algoritması derinlik öncelikli orman (DFF) üretir
DFS için veri yapilari Global değişken: zaman-adım Yeni bir köşe keşfedildiğinde veya keşfi bittiğinde bir artırılır color[u] – BFS’de olduğu gibidir [u] –u köşesinin velisi d[u], f[u] – keşif ve bitiş zamanı GRİ BEYAZ SİYAH 2V d[u] f[u] 1 ≤ d[u] < f [u] ≤ 2 |V|
DFS(G) for each u V[G] do color[u] ← WHITE [u] ← NIL time ← 0 x y z for each u V[G] do color[u] ← WHITE [u] ← NIL time ← 0 do if color[u] = WHITE then DFS-VISIT(u) DFS-VISIT(u) nun çağrıldığı her u köşesi DFS ormanında yeni bir ağacın kökü olur
DFS-VISIT(u) color[u] ← GRAY 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 time ← time + 1 f[u] ← time u v w x y z time = 1 1/ u v w x y z 1/ 2/ u v w x y z
Örnek u v w x y z u v w x y z u v w x y z u v w x y z u v w x y z u v 1/ u v w x y z 1/ 2/ u v w x y z 1/ 2/ 3/ u v w x y z 1/ 2/ 4/ 3/ u v w x y z 1/ 2/ 4/ 3/ u v w x y z B 1/ 2/ 4/5 3/ u v w x y z B 1/ 2/ 4/5 3/6 u v w x y z B 1/ 2/7 4/5 3/6 u v w x y z B 1/ 2/7 4/5 3/6 u v w x y z B F
Örnek (Devam) DFS sonucu aşağıdakilere bağlıdır: 1/8 2/7 4/5 3/6 u v w x y z B F 1/8 2/7 9/ 4/5 3/6 u v w x y z B F 1/8 2/7 9/ 4/5 3/6 u v w x y z B F C 1/8 2/7 9/ 4/5 3/6 10/ u v w x y z B F C 1/8 2/7 9/ 4/5 3/6 10/ u v w x y z B F C 1/8 2/7 9/ 4/5 3/6 10/11 u v w x y z B F C 1/8 2/7 9/12 4/5 3/6 10/11 u v w x y z B F C DFS sonucu aşağıdakilere bağlıdır: DFS algoritmasının aramaya hangi köşeden başlaması ve kaynak köşelere hangi sırada devam etmesine DFS-VISIT algoritmasının komşuları ziyaret sırasına
KİRİŞ SİNİFLANDİRMA Ağaç kirişi (Rengi BEYAZ iken keşfedilen köşelere bağlanan girişler): (u, v) ağaç kirişidir eğer v köşesine ilk defa (u, v) kirişi ile gidilmişse Geri kiriş (Back edge) (Rengi GRİ iken tekrar ziyaret edilen köşelere bağlanan kirişler): (u, v), geri kiriştir eğer u dan v köşesine gidildiğinde v köşesi artık DFS ormanında bulunan bir ağaçta varsa Yönlü çizgelerde öz-döngü kirişleri de geri kirişlerdir 1/ u v w x y z 1/ 2/ 4/ 3/ u v w x y z B
KİRİŞ SİNİFLANDİRMA İleri kiriş(Forward edge) (u köşesinden ziyaret edildiğinde rengi SİYAH olan ve d[u] < d[v] koşulunu sağlayan v köşeleri) (u, v) kirişi ileri kiriştir eğer 1)ağaç kirişi değilse ve 2)DFS ormanındaki bir ağaçta v köşesi u köşesinin soyundan geliyorsa, yani v köşesi u köşesinin torunu, torunun çocuğu ve b. ise Çapraz kiriş (Cross edge) (u köşesinden ziyaret edildiğinde rengi SİYAH olan ve d[u] > d[v] koşulunu sağlayan v köşeleri) DFS ormanında bulunan aynı bir ağacın iki köşesi arasında ( bu durumda bu köşelerin hiçbiri diğerinin soyundan gelmez) veya farklı iki ağacın köşeleri arasında olabilir 1/ 2/7 4/5 3/6 u v w x y z B F 1/8 2/7 9/ 4/5 3/6 u v w x y z B F C
DFS(G) Zaman analizi for each u V[G] do color[u] ← WHITE (V) [u] ← NIL time ← 0 do if color[u] = WHITE then DFS-VISIT(u) (V) – defa DFS-VISIT çağrılacaktır
DFS-VISIT(u) zaman analizi color[u] ← GRAY 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 time ← time + 1 f[u] ← time DFS-VISIT her köşe için bir defa çağrılır Her döngü |Adj[v]| defa döner Toplam:ΣvV |Adj[v]| + (V) = (V + E) (E)
Topolojik siralama Yönlü ve döngüsüz bir G = (V, E) çizgesinin köşelerini bir doğru üzerinde öyle yerleştirebiliriz ki eğer çizgede (u, v) kirişi varsa doğru üzerinde u köşesi v den önce gelir. Bu tür bir sıralamaya topolojik sıralama denir.
Topolojik siralama TOPOLOGICAL-SORT(V, E) Running time: (V + E) Her v köşesi için f[v] yi hesaplamak için DFS(V, E) cağır Köşeleri bitiş zamanlarının azalan sırası ile sırala ve bir bağlı listeye yerleştir Çizgedeki kirişleri bu listede göster H 11/ 16 17/ 18 İ 12/ 15 G F 13/ 14 D 1/ 8 6/ 7 C E 9/ 10 B 2/ 5 A 3/ 4 İ H G F E D C B A Running time: (V + E)
Topological Sort H 11/ 16 17/ 18 İ 12/ 15 G F 13/ 14 C 1/ 8 6/ 7 D E 9/ 10 B 2/ 5 A 3/ 4 İ H G F E D C B A
Kuvvetli Bağlantili Bileşenler Yönlü bir çizge verilmiş olsun:G = (V, E): C V olan ve her u, v C için u v ve v u yollarının var olduğu maksimum elemanlı <C> alt çizgesine G nin kuvvetli bağlantılı bir bileşeni (strongly connected component (SCC) ) denir.
Çizgenin transpozu GT = G nin transposu GT çizgesinin kirişlerinin tümü G nin kirişlerinin yönünün ters yöne değiştirilmesi ile oluşmuştur GT = (V, ET), ET = {(u, v) : (v, u) E} GT yi (V + E) işlem zamanında oluşturabiliriz. 1 2 5 4 3 1 2 5 4 3
Kuvvetli bağlantılı bileşenleri bulma Gözlem: G ve GT kuvvetli bağlantılı bileşenleri aynıdır. u ve v köşeleri G de birbirinden ulaşılabilirdir bu köşeler GT de de birbirinden ulaşılabilirdir. Yönlü döngüsüz G = (V, E) de kuvvetli bağlantılı bileşenleri bulmak için : G ve GT de DFS uygulamak yeterlidir 1 2 5 4 3 1 2 5 4 3
Örnek a b c d e f g h DFS G de ve bitiş zamanlarına göre sırala 13/ 14 11/ 16 1/ 10 8/ 9 b 16 e 15 a 14 c 10 d 9 g 7 h 6 f 4 12/ 15 3/ 4 2/ 7 5/ 6 a b c d e f g h DFS GT: b de başla: a, e keşfet c de başla: d yi keşfet g de başla: f yi keşfet h de başla Kuvvetli bağlantılı bileşenler: C1 = {a, b, e}, C2 = {c, d}, C3 = {f, g}, C4 = {h}