Traversierung Durchlaufen eines Graphen, bei dem jeder vom gewählten Startknoten erreichbare Knoten (bzw. jede Kante) genau 1-mal aufgesucht wird. Jeweils ADS: Algorithmen und Datenstrukturen 2 nächster besuchter Knoten hat mindestens einen Nachbarn in der zuvor Teil 3 besuchten Knotenmenge. Generische Lösungsmöglichkeit für Graphen Prof. Peter F. Stadler & Sebastian Will G = (V , E ): FOREACH v in V DO {markiere v als unbearbeitet}; B={s}; // Menge besuchter Knoten, anfangs = Startknoten s markiere s als bearbeitet; WHILE es gibt unbearbeiteten Knoten v' mit (v,v') in E und v in B { B = B + {v'}; markiere v';} Bioinformatik/IZBI Institut für Informatik & Interdisziplinäres Zentrum für Bioinformatik Universität Leipzig 23. April 2014 Realisierungen unterscheiden sich bezüglich Verwaltung der noch abzuarbeitenden Knotenmenge und Auswahl der jeweils nächsten Kante. 1 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) Breiten- und Tiefendurchlauf ADS 2, V3 23. April 2014 2 / 16 Breitensuche (BFS) Breitendurchlauf (Breadth First Search, BFS) ausgehend von Startknoten werden zunächst alle direkt erreichbaren Knoten bearbeitet, n Schritten von u erreichbar ist, erst, wenn n − 1 Schritten erreichbar sind. gerichteter Graph G = (V , E ); Startknoten s; Q sei danach die über mindestens zwei Kanten vom Startknoten Bearbeite einen Knoten, der in erreichbaren Knoten, dann die über drei Kanten usw. alle Knoten abgearbeitet wurden, die in es werden also erst die Nachbarn besucht, bevor zu den Kindern gegangen wird. FIFO-Warteschlange. kann mit FIFO-Datenstruktur für noch zu bearbeitende Knoten realisiert werden. Tiefendurchlauf (Depth First Search, DFS) ausgehend von Startknoten werden zunächst rekursiv alle Kinder u werden der aktuelle Farbwert und der Vorgänger p[u ], von dem aus u erreicht wurde, gespeichert. p-Werte liefern nach Abarbeitung für zusammenhängende Graphen zu jedem Knoten einen Spannbaum. (Nachfolger) bearbeitet; erst dann wird zu den (anderen) Nachbarn gegangen. kann mit Stack-Datenstruktur für noch zu bearbeitende Knoten realisiert werden. Verallgemeinerung der Traversierung von Bäumen. P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Breitensuche: Algorithmus 3 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 4 / 16 23. April 2014 6 / 16 23. April 2014 6 / 16 Breitensuche: Beispiel BFS(G,s) FOREACH v in V DO {farbe(v)=weiss; p[v]=null; } farbe[s]=grau; INIT(Q); Q=ENQUEUE(Q,s); WHILE NOT (EMPTY(Q)) DO { v=FRONT(Q); FOREACH u in succ(v) DO { If farbe[u]=weiss THEN { farbe[u]=grau; p[u]=v; Q=ENQUEUE(Q,u);} } DEQUEUE(Q); farbe[v]=schwarz; } Startknoten s=3 1 2 Q = [] 4 3 5 6 Farben: weiss=unbearbeitet, grau=in P.F. Stadler & S. Will (Bioinf, Uni LE) Bearbeitung, ADS 2, V3 schwarz=bearbeitet 23. April 2014 Breitensuche: Beispiel Startknoten 5 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Breitensuche: Beispiel s=3 Startknoten 1 s=3 1 2 2 Q = [3] Q = [3, 1] 4 3 4 3 5 6 5 6 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Breitensuche: Beispiel Startknoten Breitensuche: Beispiel s=3 Startknoten 1 s=3 1 2 2 Q = [3, 1, 4] Q = [3, 1, 4, 6] 4 3 4 3 5 6 5 6 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Breitensuche: Beispiel Startknoten 6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) s=3 Startknoten 6 / 16 23. April 2014 6 / 16 23. April 2014 6 / 16 23. April 2014 6 / 16 s=3 1 2 2 Q = [1, 4, 6] Q = [1, 4, 6, 2] 4 3 4 3 5 6 5 6 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Breitensuche: Beispiel 6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Breitensuche: Beispiel s=3 Startknoten 1 s=3 1 2 2 Q = [4, 6, 2] Q = [4, 6, 2, 5] 4 3 4 3 5 6 5 6 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Breitensuche: Beispiel Startknoten 23. April 2014 Breitensuche: Beispiel 1 Startknoten ADS 2, V3 6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Breitensuche: Beispiel s=3 Startknoten 1 s=3 1 2 2 Q = [] Q = [6, 2, 5] 4 3 4 3 5 6 5 6 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Tiefensuche (DFS) Bearbeite einen Knoten Tiefensuche: Algorithmus v erst dann, wenn alle seine Kinder bearbeitet v liegt) G = (V , E ); zu jedem Knoten v werden gespeichert: der aktuelle Farbwert sind (auÿer wenn ein Kind auf dem Weg zu gerichteter Graph farbe[v], die Zeitpunkte in[v] und out[v], zu denen der Knoten im Rahmen der Tiefensuche erreicht bzw. verlassen wurde und der Vorgänger die in- p[v], von dem aus v erreicht wurde out-Zeitpunkte ergeben eine Reihenfolge bzw. der Knoten analog zur Vor- bzw. Nachordnung bei Bäumen. P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Tiefensuche: Beispiel Startknoten DFS(G){ FOR EACH v in V do { farbe[v]=weiss; p[v]=null; } zeit=0 FOR EACH v in V do { IF farbe[v]=weiss THEN DFS-visit[v] } } DFS-visit(G,v){ // rekursiver Teil der Tiefensuche farbe[v]=grau; zeit=zeit+1; in[v]=zeit; FOR EACH u in succ(v) DO { IF farbe[u]=weiss THEN { p[u]=v; DFS-visit[u]; } } farbe[v]=schwarz; zeit=zeit+1; out[v]=zeit; } 7 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) Startknoten 1 in[v] v 3 4 4 3 5 5 ADS 2, V3 23. April 2014 Tiefensuche: Beispiel Startknoten v in[v] 1 2 out[v] 2 1 4 4 3 5 5 ADS 2, V3 23. April 2014 Tiefensuche: Beispiel Startknoten 1 4 ADS 2, V3 s=3 1 v in[v] 1 2 2 3 3 1 out[v] 2 4 4 4 3 v in[v] 1 2 2 3 3 1 out[v] 4 4 5 6 6 6 P.F. Stadler & S. Will (Bioinf, Uni LE) 3 3 6 5 5 2 out[v] Tiefensuche: Beispiel s=3 3 2 9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) 1 4 in[v] 1 6 6 P.F. Stadler & S. Will (Bioinf, Uni LE) v 5 6 2 9 / 16 1 3 Startknoten 23. April 2014 s=3 2 5 ADS 2, V3 Tiefensuche: Beispiel s=3 3 9 / 16 6 9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) 1 4 23. April 2014 6 6 2 1 4 5 6 Startknoten 9 / 16 out[v] 2 3 P.F. Stadler & S. Will (Bioinf, Uni LE) in[v] 1 2 2 5 23. April 2014 s=3 out[v] 1 3 8 / 16 1 v 4 23. April 2014 Tiefensuche: Beispiel s=3 2 ADS 2, V3 5 ADS 2, V3 23. April 2014 5 6 9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Tiefensuche: Beispiel Startknoten Tiefensuche: Beispiel s=3 Startknoten s=3 1 2 4 3 1 v in[v] 1 2 2 3 3 1 out[v] 2 4 4 4 3 5 6 5 5 ADS 2, V3 23. April 2014 3 Startknoten 1 4 5 6 ADS 2, V3 23. April 2014 9 / 16 23. April 2014 9 / 16 s=3 1 v in[v] out[v] 1 2 7 2 3 4 3 1 4 8 6 2 4 5 3 6 6 5 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Tiefensuche: Beispiel Startknoten 4 3 9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) 5 5 3 6 1 4 7 2 Tiefensuche: Beispiel s=3 2 out[v] 2 6 6 Tiefensuche: Beispiel Startknoten in[v] 1 5 5 6 P.F. Stadler & S. Will (Bioinf, Uni LE) v v in[v] out[v] 1 2 7 2 3 4 3 1 4 8 5 9 6 5 6 6 9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Bäume aus Breiten- und Tiefensuche s=3 1 1 1 1 2 4 5 3 v in[v] out[v] 1 2 7 2 3 4 3 1 12 4 8 11 5 9 10 6 5 6 2 4 3 5 6 Graph 6 P.F. Stadler & S. Will (Bioinf, Uni LE) 2 ADS 2, V3 23. April 2014 Starke Zusammenhangskomponenten G = (V , E ) heiÿt stark zusammenhängend, wenn für alle u , v ∈ V Es gibt einen Pfad von u nach v . G 9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) 2 4 3 4 5 6 5 3 6 BFS-Baum DFS-Baum ADS 2, V3 23. April 2014 Starke Zusammenhangskomponenten G = (V , E ) heiÿt stark zusammenhängend, wenn für alle u , v ∈ V Es gibt einen Pfad von u nach v . Ein gerichteter Graph Ein gerichteter Graph gilt: gilt: 1 Eine starke Zusammenhangskomponente von G G. 1 Eine 2 ist ein maximaler stark zusammenhängender Teilgraph von starke Zusammenhangskomponente von G 4 3 5 6 Teilgraph von G. Jeder Knoten eines Graphen ist in genau einer starken Zusammenhangskomponente enthalten. Wieso? Zusammenhangskomponente enthalten. Wieso? ADS 2, V3 2 ist ein maximaler stark zusammenhängender Jeder Knoten eines Graphen ist in genau einer starken P.F. Stadler & S. Will (Bioinf, Uni LE) 10 / 16 23. April 2014 11 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 4 3 5 6 23. April 2014 11 / 16 gegenseitige Erreichbarkeit = Äquivalenzrelation Sei G = (V , E ) Starke Zus.hang-Komponenten durch Tiefensuche u , v ∈ V gegenseitig u ∼ v . Die so denierte Relation ∼ auf V ist eine ein gerichteter Graph. Sind Knoten erreichbar, schreiben wir Äquivalenzrelation also Die Knotenmengen der starken Zusammenhangskomponenten von G ∼. P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Algorithmus von Tarjan (1972) P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Tarjan: Beispiel werden dann gleich ausgegeben und nicht mehr weiter betrachtet sind (denn jeder Knoten ist in nur einer Komponente). 12 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) 2 3 23. April 2014 13 / 16 v in[v] l[v] 1 1 1 2 2 2 3 3 3 4 4 2 5 5 23. April 2014 15 / 16 23. April 2014 15 / 16 23. April 2014 15 / 16 4 5 14 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 1 v in[v] l[v] 1 1 1 v in[v] l[v] 1 1 2 2 1 2 2 2 3 2 3 3 3 3 3 4 4 2 4 4 2 5 5 5 5 5 2 3 4 5 5 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Tarjan: Beispiel 15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Tarjan: Beispiel 1 1 v in[v] l[v] 1 1 1 v in[v] l[v] 1 1 2 2 1 2 2 2 3 2 3 3 3 3 3 4 4 2 4 4 2 5 5 5 5 5 5 2 3 Zshk: 5 4 5 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 1 4 4 l[v] = frühester Knoten, der in[] gegebenen Reihenfolge. v abgearbeitet sind und l[v]=in[v], ist v erreichbar ist in der durch Tarjan: Beispiel 1 3 aus. Tarjan: Beispiel Tarjan-visit(G,v){ farbe[v]=grau; zeit=zeit+1; in[v]=zeit; l[v]=zeit; PUSH(S,v) FOR EACH u in succ(v) DO { IF farbe[u]=weiss THEN { Tarjan-visit[u]; l[v]=min(l[v],l[u]) ;} ELSEIF u in S THEN l[v]=min(l[v],in[u]); } IF (l[v]=in[v]) { Ausgabe("starke ZshK":) DO { u=TOP(S); Ausgabe(u); POP(S); } UNTIL u=v; } farbe[v]=schwarz; zeit=zeit+1; } 2 G berechne dabei die Wurzel einer starken Zusammenhangskomponente. Deren Knoten reexiv 3 v v Wenn alle Kindsknoten von transitiv und 2 Für jeden Knoten von symmetrisch die Äquivalenzklassen von Führe Tiefensuche (DFS) auf Zshk: 5 5 ADS 2, V3 23. April 2014 15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 Tarjan: Beispiel Tarjan: Beispiel 1 2 3 4 1 v in[v] l[v] 1 1 1 v in[v] l[v] 1 1 2 2 1 2 2 2 3 2 3 2 3 3 2 4 4 2 4 4 2 5 5 5 5 5 5 2 3 Zshk: 5 Zshk: 5 4 Zshk: 2,3,4 5 5 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April 2014 Tarjan: Beispiel 15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) Komponentengraph ADS 2, V3 G 23. April 2014 15 / 16 ∗ Fasse alle Knoten jeweils einer starken Zusammenhangskomponente zu einem einzigen Knoten zusammen. Kante von Komponente 1 Komponente 2 3 v in[v] l[v] 1 1 1 2 2 2 3 3 2 4 4 2 5 5 5 G gibt, so daÿ A nach (u , v ) 2 4 3 5 6 Zshk: 2,3,4 Zshk: 1 5 Graph G Komponentengraph Erlaubt z.B. schnellere Berechnung der transitiven Hülle von P.F. Stadler & S. Will (Bioinf, Uni LE) eine Kante in 1 Zshk: 5 4 ist. B , wenn es u ∈ A und v ∈ B ADS 2, V3 23. April 2014 15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 G. G∗ 23. April 2014 16 / 16