Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Einführung Algorithmen und Datenstrukturen Kapitel 8 Graphen sind eine grundlegende Datenstruktur, die in vielen Bereichen der Informatik (und auch in anderen Bereichen) Anwendung findet. Man kann ohne Einschränkung zwei Elemente einer Mengen (den Knoten) in Beziehung setzen (durch eine Kante). Graphen Frank Heitmann [email protected] Anmerkung Erlaubt man verschiedene Kanten-’Typen’, so kann man sogar verschiedene Beziehungen ausdrücken. 2. Dezember 2015 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 1/145 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Definitionen 2/145 Einführung und Definitionen Darstellung Gewichteter Graph Definition Ein Graph ist ein Tupel G = (V , E ) bestehend aus einer Menge V (auch V (G )) von Knoten oder Ecken und einer Menge E (auch E (G )) von Kanten. Ist G ein ungerichteter Graph, so ist Definition Bei einem gewichteten Graphen ist neben dem Graph G = (V , E ) (gerichtete oder ungerichtet) noch eine Gewichtsfunktion w : E → R+ gegeben, die jeder Kante e ∈ E ihre Kosten w (e) zuweist. E ⊆ {{v1 , v2 } | v1 , v2 ∈ V , v1 6= v2 }, Anmerkung Diese Definition ist in der Datenstruktur-Vorlesung nicht explizit auf den Folien gewesen, ist aber sehr wichtig. (Die meisten Graphen haben Gewichte (oder Buchstaben o.ä.) an den Kanten.) ist G ein gerichteter Graph, so ist E ⊆ V 2. Ist |E | viel kleiner als |V |2 , so nennt man den Graphen dünn besetzt. Ist |E | nahe an |V |2 , so spricht man von dicht besetzten Graphen. Frank Heitmann [email protected] 3/145 Frank Heitmann [email protected] 4/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Definitionen Einführung und Definitionen Darstellung Definitionen Definition Ein Weg ist ein nicht leerer Graph P = (V , E ) mit V = {x0 , x1 , . . . , xk }, E = {x0 x1 , x1 x2 , . . . , xk−1 xk }, wobei die xi paarweise verschieden sind. x0 und xk sind die Enden von P, sie sind durch P verbunden. Die Anzahl der Kanten eines Weges ist seine Länge. Definition Sind je zwei Knoten von G mit einer Kante verbunden, so ist G ein vollständiger Graph. Bei n Knoten: K n . Eine Menge paarweise nicht benachbarter Knoten nennt man unabhängig. Der Grad d(v ) eines Knotens v ist die Anzahl mit v inzidenter Kanten. Ist P wie oben ein Weg, so ist P + xk x0 ein Kreis (der Länge k + 1). Die Menge der Nachbarn eines Knotens v bezeichnet man mit N(v ) (hier gilt d(v ) = |N(v )|). Der Abstand zweier Knoten x und y voneinander wird mit d(x, y ) bezeichnet und ist die geringste Länge eines x-y -Weges. δ(G ) ist der Minimalgrad von G , ∆(G ) der Maximalgrad. Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 5/145 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Definitionen 6/145 Einführung und Definitionen Darstellung Darstellung von Graphen Ein Graph G = (V , E ) wird dargestellt indem man seine Knoten als Punkte und die Tupel oder Mengen aus E als (gerichtete) Kanten zwischen die Knoten einzeichnet. Definition Seien G = (V , E ) und G 0 = (V 0 , E 0 ) Graphen. Gilt V 0 ⊆ V und E 0 ⊆ E , so nennt man G 0 einen Teilgraphen von G . Im Computer speichert man einen Graphen meist mittels einer Adjazenzmatrix oder einer Adjazenzliste. (Man kann die Mengen V und E aber auch direkt speichern.) Ist G = (V , E ) ein Graph und V 0 ⊆ V , so nennt man den Graphen G 0 = (V 0 , E 0 ) mit E 0 = {{v1 , v2 } ∈ E | v1 , v2 ∈ V 0 } den von V 0 induzierten Graphen. Anmerkung Bei Graphen schreibt man (und wir) oft O(V + E ) etc., wenn O(|V | + |E |) gemeint ist. Man beacht zudem, dass dies die Komplexität bzgl. der Kenngrößen V und E ausdrückt und nicht umbedingt die Größe der Eingabe wiederspiegelt! Frank Heitmann [email protected] 7/145 Frank Heitmann [email protected] 8/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzmatrix v v w x Darstellung von Graphen - Adjazenzmatrix y v v w v w x y Einführung und Definitionen Darstellung v w x y y y 0 0 w x w x 0 x 0 y V = {v , w , x, y } V = {v , w , x, y } E = {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }} E = {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }} Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 9/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzmatrix v v v w w x y Frank Heitmann [email protected] w x y v v 1 0 1 y 1 Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzmatrix 0 1 1 1 x 10/145 w x 0 y 0 w x y v 0 1 1 1 w 1 0 1 0 x 1 1 0 1 y 1 0 1 0 V = {v , w , x, y } V = {v , w , x, y } E = {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }} E = {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }} Frank Heitmann [email protected] 11/145 Frank Heitmann [email protected] 12/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzmatrix v w v x y w x Darstellung von Graphen - Adjazenzlisten y v 0 1 1 1 w 1 0 1 0 x y Einführung und Definitionen Darstellung 1 1 0 1 v w v w x 1 0 1 0 y x y Bei einer Adjazenzmatrix hat man eine n × n-Matrix, bei der an der Stelle (i, j) genau dann eine 1 steht, wenn vi und vj verbunden sind. Der Speicherplatzbedarf ist in Θ(V 2 ) (unabhängig von der Kantenzahl). Frank Heitmann [email protected] 13/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche v v w x x y v w x x y y Frank Heitmann [email protected] Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzlisten w y 14/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzlisten w Frank Heitmann [email protected] v w x w v x y x y 15/145 Frank Heitmann [email protected] 16/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Darstellung von Graphen - Adjazenzlisten Darstellung von Graphen - Adjazenzlisten v v v w w x x v x y v y v x y v w x w x v x y v y v x w x y y w x Einführung und Definitionen Darstellung y w w Bei der Adjazenzlistendarstellung haben wir ein Array von |V | Listen, für jeden Knoten eine. Die Adjazenzliste Adj[v ] zu einem Knoten v enthält alle Knoten, die mit v adjazent sind. Bei einem gerichteten Graphen ist die Summe aller Adjazenzlisten |E |, bei einem ungerichteten Graphen |2E |. Der Speicherplatzbedarf ist folglich Θ(V + E ). Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 17/145 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Einführung und Definitionen Darstellung Darstellung von Graphen - Zusammenfassung 18/145 Breitensuche Tiefensuche Zusammenfassung Die Struktur eines Graphen Adjazenzmatrix: |V | × |V |-Matrix A = (aij ) mit aij = 1 falls (i, j) ∈ E und 0 sonst. Größe in Θ(V 2 ). Wir wollen nun etwas grundlegendes über die Struktur eines gegebenen Graphen erfahren. Hierzu ist es zunächst praktisch Algorithmen zu haben, die den Graphen durchwandern, d.h. in systematischer Weise die Kanten entlangwandern und die Knoten besuchen. Oft ist es auch nützlich einen Spannbaum zu ermitteln. Adjazenzliste: Liste Adj[v ] für jeden Knoten v ∈ V in der die Knoten, die mit v adjazent sind gespeichert sind. Größe in Θ(V + E ). Bei einer Adjazenzmatrix kann man schnell herausfinden, ob zwei Knoten benachbart sind oder nicht. Dafür ist es langsamer alle Knoten zu bestimmen, die mit einem Knoten benachbart sind. (Bei Adjazenzlisten genau andersherum.) Definition Ein Spannbaum ist ein Teilgraph T eines Graphen G , wobei T ein Baum ist und alle Knoten von G enthält. Beide Darstellungen sind ineinander transformierbar. Beide Darstellungen sind leicht auf den Fall eines gewichteten Graphen anpassbar. Frank Heitmann [email protected] 19/145 Frank Heitmann [email protected] 20/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breiten- und Tiefensuche Breitensuche - Die Idee Gegeben ein Graph G und ein Startknoten s ’entdeckt’ die Breitensuche alle Knoten, die von s aus erreichbar sind. Zudem wird der Abstand (in Kanten) von s aus berechnet (tatsächlich wird sogar der kürzeste Abstand ermittelt). Die Breiten- und Tiefensuche in einem Graphen erreichen (im Prinzip) beide Ziele! Es wird zwar i.A. nicht der minimale Spannbaum ermittelt, doch dazu später mehr. Breiten- und Tiefensuche sind oft ’Urtypen’ für weitere Graphalgorithmen entweder Man kann auch zusätzlich einen ’Breitensuchbaum’ (mit Wurzel s) und damit die kürzesten Pfade von s zu den anderen Knoten ermitteln. als wichtige Subroutine oder Der Algorithmus entdeckt zunächst die Knoten mit Entfernung k und dann die mit Entfernung k + 1, daher der Name. Er geht erst in die Breite... als ’Ideengeber’ Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 21/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Die Idee 22/145 Breitensuche Tiefensuche Zusammenfassung Zur Nachbereitung Starte mit Knoten s in einer Queue Q. Wiederhole solange Q nicht leer... Anmerkung (zur Nachbereitung) Im nachfolgenden Beispiel ist für einen Knoten v jeweils sein linkes Kind der erste Knoten in v ’s Adjazenzliste, sein rechtes Kind der zweite Knoten in der Adjazenzliste. (Dies ist wichtig, um zu verstehen in welcher Reihenfolge die Knoten in der Queue gespeichert werden.) Für das Beispiel ist es ferner unerheblich, ob die Kanten gerichtet oder ungerichtet sind. Bei ungerichteten Kanten wäre auch stets noch der Vater in der Adjazenzliste eines Knotens. Dieser wäre jedoch bereits gefärbt und würde nicht wieder in der Queue gespeichert werden. Nimm vordersten Knoten v aus Q. (Bearbeite diesen und Färbe diesen so, dass er nicht wieder besucht wird.) Tue alle Nachbarn von v , die bisher nicht besucht wurden in die Queue. Anmerkung Durch die Queue wird sichergestellt, dass die Knoten ’in der Breite’ besucht werden, d.h. zunächst werden die Knoten mit Entfernung k von s entdeckt und erst danach jene mit Entfernung k + 1. Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung 23/145 Frank Heitmann [email protected] 24/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum Breitensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 16 13 2 A: A: Frank Heitmann [email protected] 25/145 8 5 Q: 10 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 14 3 Q: 7 12 9 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 26/145 Breitensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Breitensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 3 16 2 8 5 Q: Q: 6 14 A: A: Frank Heitmann [email protected] 14 27/145 7 12 9 Frank Heitmann [email protected] 15 13 16 28/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum Breitensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 16 13 2 A: 10 A: 10 Frank Heitmann [email protected] 29/145 8 5 Q: 14 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 14 3 Q: 6 14 7 12 9 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 30/145 Breitensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Breitensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 3 16 2 8 5 Q: 14 3 8 Q: 14 3 8 A: 10 A: 10 6 Frank Heitmann [email protected] 14 31/145 7 12 9 Frank Heitmann [email protected] 15 13 16 32/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum Breitensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 3 16 13 14 2 8 5 7 Q: 3 8 Q: 3 8 12 15 A: 10 6 A: 10 6 Frank Heitmann [email protected] 33/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 12 9 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 34/145 Breitensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Breitensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 3 16 2 8 5 Q: 3 8 12 15 Q: 8 12 15 A: 10 6 14 A: 10 6 14 Frank Heitmann [email protected] 14 35/145 7 12 9 Frank Heitmann [email protected] 15 13 16 36/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum Breitensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 3 16 13 14 2 8 5 7 Q: 8 12 15 2 5 A: 10 6 14 A: 10 6 14 3 Frank Heitmann [email protected] 37/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 12 9 Q: 8 12 15 2 5 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 38/145 Breitensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Breitensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 14 3 16 2 8 5 7 12 9 Q: 12 15 2 5 Q: 12 15 2 5 7 9 A: 10 6 14 3 A: 10 6 14 3 Frank Heitmann [email protected] 39/145 Frank Heitmann [email protected] 15 13 16 40/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum Breitensuche - im Baum 10 10 6 14 3 2 8 5 7 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 3 16 13 14 2 8 5 7 12 9 Q: 2 5 7 9 13 16 A: 10 6 14 3 8 A: 10 6 14 3 8 12 15 41/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung 10 6 2 14 8 5 7 Breitensuche Tiefensuche Zusammenfassung Breitensuche - im Baum 10 3 42/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum 16 13 Q: 12 15 2 5 7 9 Frank Heitmann [email protected] 15 12 9 6 15 13 14 3 16 2 8 5 7 12 9 Q: 5 7 9 13 16 Q: 5 7 9 13 16 A: 10 6 14 3 8 12 15 A: 10 6 14 3 8 12 15 2 Frank Heitmann [email protected] 43/145 Frank Heitmann [email protected] 15 13 16 44/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Baum Breitensuche - Kernidee als Algorithmus 10 6 2 8 5 Algorithmus 1 BFS(G , s) 1: farbe[s] = pink 2: Q = ∅, enqueue(Q, s) 3: while Q 6= ∅ do 4: u = dequeue(Q) 5: for each v ∈ Adj[u] do 6: if farbe[v ] == weiss then 7: farbe[v ] = pink 8: enqueue(Q, v ) 9: end if 10: end for 11: farbe[u] = schwarz 12: end while 14 3 7 Breitensuche Tiefensuche Zusammenfassung 12 9 15 13 16 Q: A: 10 6 14 3 8 12 15 2 5 7 9 13 16 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 45/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Zur Nachbereitung 46/145 Breitensuche Tiefensuche Zusammenfassung Breitensuche - im Graphen 2 10 Anmerkung (zur Nachbereitung) Wir verzichten für das nächste Beispiel auf die Angabe der einzelnen Adjazenzlisten. Man kann sie aus dem Beispiel ablesen. Man beachte noch, dass je nachdem wie die Knoten in der Adjazenzliste angeordnet sind, der Algorithmus verschiedene Ergebnisse liefern kann. Wären die Knoten 7 und 9 bspw. in der Adjazenzliste der 8 in umgekehrter Reihenfolge, so würde zuerst die 9 abgearbeitet werden, bevor man bei 7 und 5 weiter im Baum hinabsteigt. (Bei der Tiefensuche später ist dieser Unterschied noch merklicher.) 6 3 s 7 5 9 8 A: Q: Frank Heitmann [email protected] 47/145 Frank Heitmann [email protected] 48/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Graphen Breitensuche - im Graphen 2 10 s 5 A: 6 A: 6 Q: 2 3 8 Q: 3 8 49/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Graphen 2 Breitensuche Tiefensuche Zusammenfassung s 9 6 3 7 5 2 10 6 5 8 9 A: 6 2 3 Q: 3 8 10 Q: 8 10 51/145 s 7 A: 6 2 Frank Heitmann [email protected] 50/145 Breitensuche - im Graphen 10 3 8 9 Frank Heitmann [email protected] s 7 5 8 9 6 3 7 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 2 10 6 3 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] 8 52/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Graphen Breitensuche - im Graphen 2 10 2 10 6 3 Breitensuche Tiefensuche Zusammenfassung s 3 7 5 9 A: 6 2 3 8 10 A: 6 2 3 8 10 7 Q: 7 9 Q: 9 5 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 53/145 Breitensuche Tiefensuche Zusammenfassung 54/145 Breitensuche Tiefensuche Zusammenfassung Breitensuche - mehr Informationen 2 10 6 3 8 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - im Graphen s 7 5 8 9 6 s Reichern wir die Breitensuche etwas an, so können wir mehr Informationen gewinnen, z.B. den Abstand der einzelnen Knoten von s und den Breitensuchbaum. 7 5 9 8 Der folgende Algorithmus ist wie im [Cormen]. A: 6 2 3 8 10 7 9 5 Q: Frank Heitmann [email protected] 55/145 Frank Heitmann [email protected] 56/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Initialisierung Breitensuche - Hauptschleife Algorithmus 2 BFS(G , s) - Teil 1, Initphase 1: for each u ∈ V (G ) \ {s} do 2: farbe[u] = weiss, d[u] = ∞, π[u] = nil 3: end for 4: farbe[s] = grau 5: d[s] = 0, π[s] = nil 6: Q = ∅, enqueue(Q, s) Algorithmus 3 BFS(G , s) - Teil 2, Hauptteil 1: while Q 6= ∅ do 2: u = dequeue(Q) 3: for each v ∈ Adj[u] do 4: if farbe[v ] == weiss then 5: farbe[v ] = grau 6: d[v ] = d[u] + 1, π[v ] = u 7: enqueue(Q, v ) 8: end if 9: end for 10: farbe[u] = schwarz 11: end while Anmerkung Farben: weiss heißt ’noch nicht besucht’, grau ’besucht, aber noch unbesuchte Nachbarn’, schwarz ’besucht, alle Nachbarn entdeckt’. d[u] ist die Anzahl der Schritt von s zu u, π[u] der Vorgänger von u auf diesem Pfad. Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung 57/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] 58/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Zur Nachbereitung Breitensuche Tiefensuche Zusammenfassung Breitensuche - Beispiel b Anmerkung (zur Nachbereitung) Für das nachfolgende Beispiel verzichten wir erneut auf die Angabe der Adjazenzlisten. Die Zahl in einem Knoten v ist nun nicht mehr der Schlüssel o.ä., sondern der Wert von d[v ]. Die Farbe ’grün’ in den Bildern entspricht der Farbe ’schwarz’ im Quellcode (d.h. ein grüner Knoten ist vollständig abgearbeitet und alle seine Kinder sind ’entdeckt’ (also mindestens ’grau’)). Die dicken Kanten stellen die Baumkanten dar, die mittels der π Funktion gewonnen werden können, die jeden Knoten auf seinen Vorgänger im Baum abbildet. Frank Heitmann [email protected] a s d c e f g Q: 59/145 Frank Heitmann [email protected] 60/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Beispiel Breitensuche Tiefensuche Zusammenfassung Breitensuche - Beispiel b b a a s 0 d 1 c e s c 0 d 1 e f f g g Q: a c Q: s Frank Heitmann [email protected] 61/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] 62/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Beispiel Breitensuche Tiefensuche Zusammenfassung Breitensuche - Beispiel b 2 a 1 s 1 1 e s g Q: c b e c 0 2 d f g Frank Heitmann [email protected] 2 a c 0 2 d b 1 e f 2 Q: b e f 63/145 Frank Heitmann [email protected] 64/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Beispiel Breitensuche Tiefensuche Zusammenfassung Breitensuche - Beispiel b b 2 a s 1 2 d s 1 c 0 2 a 1 e 3 d f g 2 2 65/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung 2 66/145 Breitensuche Tiefensuche Zusammenfassung Breitensuche - Beispiel b b 2 a s 2 g 3 2 a s 1 c 0 e d f c 0 1 3 2 g 2 3 Q: d g Frank Heitmann [email protected] f Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Beispiel 3 e Q: f d Frank Heitmann [email protected] d 1 g Q: e f 1 c 0 1 e f 2 Q: g 67/145 Frank Heitmann [email protected] 68/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Beispiel Analyse (Laufzeit) Zu Anfang ist jeder Knoten weiß. Der Test in der Schleife stellt daher sicher, dass jeder Knoten nur einmal in die Queue eingefügt und aus ihr entnommen wird. Für die Warteschlangenoperationen brauchen wir also O(V ). Die Adjazenzliste jedes Knotens wird nur einmal geprüft (wenn der Knoten aus der Queue entnommen wird). Die Summe aller Adjazenzlisten ist in Θ(E ), folglich benötigt das Prüfen der Adjazenzlisten O(E ). Initialisierung geht auch in O(V ). Insgesamt ergibt sich so: O(V + E ), was linear in der Größe der Adjazenzliste ist. b 2 a s 1 d c 0 3 2 1 e f g 2 3 Anmerkung Diese Laufzeitanalyse stimmt nur, wenn der Graph durch Adjazenzlisten gegeben ist! Q: Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 69/145 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Analyse (Korrektheit) 70/145 Breitensuche Tiefensuche Zusammenfassung Breitensuche - Ergebnis Die Korrektheit kann man mittels einer Schleifeninvarianten zeigen, die besagt, dass die Queue aus der Menge der grauen Knoten besteht. Zur Betonung: Satz In einem ungewichteten Graphen (bzw. einem Graph in dem jede Kante das Gewicht 1 hat) ermittelt der BFS-Algorithmus für jeden Knoten v den kürzesten Abstand zu s sowie einen kürzesten Pfad von s zu v (den man erhält indem man den π[v ] rückwärts folgt). Der Algorithmus läuft in O(V + E ), wenn der Graph als Adjazenzliste gegeben ist. Alternativ kann man mit mehreren Lemmata zeigen, dass die ermittelten Abstände tatsächlich die kürzesten sind und ein Baum entsteht. Man erhält so (siehe [Cormen], dort ca. 3 Seiten): Satz Gegeben G = (V , E ) (gerichtet oder ungerichtet) und s ∈ V . BFS ermittelt jeden von s aus erreichbaren Knoten v . Bei Terminierung gilt d[v ] = δ(s, v ) für alle v . Zudem ist für jeden von s aus erreichbaren Knoten v (v 6= s) einer der kürzesten Pfade von s nach v ein kürzester Pfad von s nach π[v ] gefolgt von der Kante (π[v ], v ). Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Wichtige Anmerkung Beweis umbedingt mal im [Cormen] nachlesen! 71/145 Frank Heitmann [email protected] 72/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Die Idee Tiefensuche - Die Idee Starte mit Knoten s in einem Stack S. Wiederhole solange S nicht leer... Bei der Tiefensuche geht man einfach immer weiter noch ungeprüfte Kanten entlang, so lange dies möglich ist. Man folgt also ’einem Pfad’ so lange es möglich ist. Erst wenn man einen Knoten erreicht von dem aus man nur bereits besuchte Knoten erreichen kann, geht man einen Schritt zurück. Nimm obersten Knoten v aus S. (Bearbeite diesen und Färbe diesen so, dass er nicht wieder besucht wird.) Tue alle Nachbarn von v , die bisher nicht besucht wurden auf den Stack. Bleiben unentdeckte Knoten übrig wählt man diese als neue Startknoten. So kann sich (bei einem unzusammenhängenden Graphen) ein Tiefensuchwald ergeben. (Die Breitensuche kann man auch so anpassen, aber typischerweise werden die Algorithmen so benutzt.) Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Anmerkung Durch den Stack wird sichergestellt, dass die Knoten ’in der Tiefe’ besucht werden, d.h. dass man zunächst von einem Knoten aus immer weiter ’in die Tiefe’ geht, bevor man zurück geht und eine andere ’Abzweigung’ nimmt. 73/145 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung 74/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Zur Nachbereitung Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Baum 10 Anmerkung (zur Nachbereitung) Wie bei der Breitensuche ist im nachfolgenden Beispiel für einen Knoten v jeweils sein linkes Kind der erste Knoten in v ’s Adjazenzliste, sein rechtes Kind der zweite Knoten in der Adjazenzliste. Mit einer Ausnahme: Beim Knoten 10 ist dies genau umgekehrt. Darum ist der Stack im vierten Bild mit 6, 14 gefüllt. Für das Beispiel ist es wieder unerheblich, ob die Kanten gerichtet oder ungerichtet sind. Bei ungerichteten Kanten wäre auch stets noch der Vater in der Adjazenzliste eines Knotens. Dieser wäre jedoch bereits gefärbt und würde nicht wieder im Stack gespeichert werden. 6 14 3 2 8 5 7 12 9 15 13 16 S: A: Frank Heitmann [email protected] 75/145 Frank Heitmann [email protected] 76/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum Tiefensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 16 13 2 S: A: A: Frank Heitmann [email protected] 77/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 14 3 S: 10 8 5 7 12 9 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 78/145 Tiefensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 3 16 2 8 5 S: 6 14 S: 6 14 A: A: 10 Frank Heitmann [email protected] 14 79/145 7 12 9 Frank Heitmann [email protected] 15 13 16 80/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum Tiefensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 16 13 2 8 5 7 S: 8 3 14 A: 10 A: 10 Frank Heitmann [email protected] 81/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 14 3 S: 14 12 9 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 82/145 Tiefensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 3 16 2 8 5 S: 8 3 14 S: 3 14 A: 10 6 A: 10 6 Frank Heitmann [email protected] 14 83/145 7 12 9 Frank Heitmann [email protected] 15 13 16 84/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum Tiefensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 3 16 13 14 2 8 5 7 S: 9 7 3 14 S: 9 7 3 14 A: 10 6 A: 10 6 8 Frank Heitmann [email protected] 85/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 12 9 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 86/145 Tiefensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 14 3 16 2 8 5 7 S: 7 3 14 S: 7 3 14 A: 10 6 8 A: 10 6 8 9 Frank Heitmann [email protected] 87/145 12 9 Frank Heitmann [email protected] 15 13 16 88/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum Tiefensuche - im Baum 10 10 6 14 3 2 8 5 7 12 9 6 15 3 16 13 14 2 8 5 7 S: 3 14 A: 10 6 8 9 A: 10 6 8 9 7 Frank Heitmann [email protected] 89/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 12 9 S: 3 14 Breitensuche Tiefensuche Zusammenfassung 10 14 8 7 90/145 Tiefensuche - im Baum 6 5 16 13 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 10 2 15 Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Baum 3 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 14 3 16 2 8 5 7 S: 14 S: 5 2 14 A: 10 6 8 9 7 A: 10 6 8 9 7 Frank Heitmann [email protected] 91/145 12 9 Frank Heitmann [email protected] 15 13 16 92/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum Tiefensuche - im Baum 10 10 6 14 3 2 8 5 7 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 3 16 13 14 2 8 5 7 12 9 S: 14 A: 10 6 8 9 7 3 A: 10 6 8 9 7 3 5 2 93/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Frank Heitmann [email protected] Breitensuche Tiefensuche Zusammenfassung 10 6 2 14 8 5 7 Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Baum 10 3 94/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum 16 13 S: 5 2 14 Frank Heitmann [email protected] 15 12 9 6 15 13 14 3 16 2 8 5 7 12 9 S: S: 15 12 A: 10 6 8 9 7 3 5 2 A: 10 6 8 9 7 3 5 2 Frank Heitmann [email protected] 95/145 Frank Heitmann [email protected] 15 13 16 96/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Baum Tiefensuche - im Baum 10 10 6 14 3 2 8 5 7 Breitensuche Tiefensuche Zusammenfassung 12 9 6 15 13 14 3 16 2 8 5 7 12 9 15 13 16 S: 15 12 S: A: 10 6 8 9 7 3 5 2 14 A: 10 6 8 9 7 3 5 2 14 15 16 12 13 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 97/145 Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Idee 98/145 Breitensuche Tiefensuche Zusammenfassung Tiefen- vs. Breitensuche Algorithmus 4 DFS(G , s) 1: farbe[s] = pink 2: S = ∅, push(S, s) 3: while S 6= ∅ do 4: u = pop(S) 5: for each v ∈ Adj[u] do 6: if farbe[v ] == weiss then 7: farbe[v ] = pink 8: push(S, v ) 9: end if 10: end for 11: farbe[u] = schwarz 12: end while Frank Heitmann [email protected] Frank Heitmann [email protected] Beobachtung Der einzige Unterschied zur Breitensuche ist die Benutzung eines Stacks statt einer Queue! 99/145 Frank Heitmann [email protected] 100/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Zur Nachbereitung Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Graphen 2 10 Anmerkung (zur Nachbereitung) 6 3 Wie bei der Breitensuche verzichten wir auch im nachfolgenden Beispiel auf die Angabe der Adjazenzlisten. s 7 5 8 9 A: S: Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 101/145 Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Graphen 2 Breitensuche Tiefensuche Zusammenfassung s 9 6 3 7 5 2 10 6 5 8 9 A: 6 8 S: 3 2 S: 9 7 3 2 103/145 s 7 A: 6 Frank Heitmann [email protected] 102/145 Tiefensuche - im Graphen 10 3 Frank Heitmann [email protected] Frank Heitmann [email protected] 8 104/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Graphen Tiefensuche - im Graphen 2 10 2 10 6 3 Breitensuche Tiefensuche Zusammenfassung s 3 7 5 A: 6 8 9 A: 6 8 9 7 5 S: 3 2 S: 3 2 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 105/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - im Graphen 106/145 Breitensuche Tiefensuche Zusammenfassung Tiefensuche - im Graphen 2 10 s 9 6 3 7 5 2 10 6 3 8 9 Frank Heitmann [email protected] s 7 5 8 9 6 7 5 8 s 9 8 A: 6 8 9 7 5 A: 6 8 9 7 5 3 10 2 S: 2 S: Frank Heitmann [email protected] 107/145 Frank Heitmann [email protected] 108/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - mehr Informationen Breitensuche Tiefensuche Zusammenfassung Tiefenensuche - Initialisierung Reichern wir nun die Tiefensuche etwas an, so können wir mehr Informationen gewinnen, was insb. später nützlich wird. (Der folgende Algorithmus ist wieder wie im [Cormen].) Algorithmus 5 DFS(G ) - Initphase und Aufruf 1: for each u ∈ V (G ) do 2: farbe[u] = weiss, π[u] = nil 3: end for 4: zeit = 0 5: for each u ∈ V (G ) do 6: if farbe[u] == weiss then 7: DFS VISIT(u) 8: end if 9: end for Anmerkung Farben: weiss heißt ’noch nicht besucht’, grau ’besucht, aber noch unbesuchte Nachbarn’, schwarz ’besucht, alle Nachbarn verarbeitet’. d[u] ist ’discovery’ Zeit, f [u] ist ’finished’ Zeit. (Beachte: Immer wenn d[u] oder f [u] gesetzt werden, wird vorher die Zeit erhöht!) π[u] ist der Vorgänger von u in diesem Tiefensuchbaum. Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 109/145 Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Hauptroutine 110/145 Breitensuche Tiefensuche Zusammenfassung Zur Nachbereitung Algorithmus 6 DFS VISIT(u) - Teil 2, Hauptteil 1: farbe[u] = grau 2: zeit = zeit + 1 3: d[u] = zeit 4: for each v ∈ Adj[u] do 5: if farbe[v ] == weiss then 6: π[v ] = u 7: DFS VISIT(v ) 8: end if 9: end for 10: farbe[u] = schwarz 11: zeit = zeit + 1 12: f [u] = zeit Frank Heitmann [email protected] Frank Heitmann [email protected] Anmerkung (zur Nachbereitung) Für das nachfolgende Beispiel verzichten wir erneut auf die Angabe der Adjazenzlisten. Die Zahlen x/y in einem Knoten v sind die Werte d[v ](= x) und f [v ](= y ). Die Farbe ’grün’ in den Bildern entspricht wieder der Farbe ’schwarz’ im Quellcode, dicke Kanten stellen wieder Baumkanten dar. Die gestrichelten Kanten, sind entdecke Kanten, die als Rückwärtskanten (B) oder Querkanten (C) klassifiziert worden. Ferner gibt es Vorwärtskanten, die im Beispiel aber nicht auftreten. Eine Kante von s zu b wäre bei ansonsten gleichen Ablauf (d.h. wenn zuerst die Kante (s, a) gewählt wird) eine Vorwärtskante. 111/145 Frank Heitmann [email protected] 112/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel Tiefensuche - Beispiel b a d Breitensuche Tiefensuche Zusammenfassung b s a c 1/ e d Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 113/145 Breitensuche Tiefensuche Zusammenfassung c e Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel s 114/145 Breitensuche Tiefensuche Zusammenfassung Tiefensuche - Beispiel b b 3/ a 2/ d 1/ s a c 2/ e Frank Heitmann [email protected] d 115/145 1/ s c e Frank Heitmann [email protected] 116/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel Tiefensuche - Beispiel b b 3/ 3/4 B a 2/ d s 1/ c 2/ e Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche B a d Frank Heitmann [email protected] 117/145 Breitensuche Tiefensuche Zusammenfassung s 1/ c e Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel 118/145 Breitensuche Tiefensuche Zusammenfassung Tiefensuche - Beispiel b b 3/4 3/4 B a 2/5 d Breitensuche Tiefensuche Zusammenfassung 1/ s c 2/5 e Frank Heitmann [email protected] B a d 119/145 1/ s 6/ c e Frank Heitmann [email protected] 120/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel Tiefensuche - Beispiel b b 3/4 3/4 C B a 2/5 d s 1/ 6/ c 2/5 e d Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 121/145 Breitensuche Tiefensuche Zusammenfassung s 1/ 6/7 c e Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel C B a Frank Heitmann [email protected] 122/145 Breitensuche Tiefensuche Zusammenfassung Tiefensuche - Beispiel b b 3/4 3/4 C B a 2/5 d Breitensuche Tiefensuche Zusammenfassung 1/8 s 6/7 c 2/5 e d C B a 1/8 s 6/7 c e 9/ Frank Heitmann [email protected] 123/145 Frank Heitmann [email protected] 124/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel Tiefensuche - Beispiel b b 3/4 3/4 C B a 2/5 1/8 d s 6/7 c 2/5 125/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] 126/145 Breitensuche Tiefensuche Zusammenfassung b b 3/4 3/4 C B 2/5 1/8 s 6/7 c C B a 2/5 C 10/11 c Tiefensuche - Beispiel a d 6/7 9/ Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Beispiel s e 10/11 Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 1/8 d 9/ C B a e 10/ Breitensuche Tiefensuche Zusammenfassung 1/8 s 6/7 c C e d 9/ Frank Heitmann [email protected] 10/11 127/145 e 9/12 Frank Heitmann [email protected] 128/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche Tiefensuche Zusammenfassung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Besondere Kanten Breitensuche Tiefensuche Zusammenfassung Tiefensuche - Besondere Kanten Dabei ist Man kann bei der Tiefensuche die Kanten klassifizieren je nachdem, welche Farbe der Knoten v bei einer Kanten (u, v ) hat (u ist der Knoten der gerade bearbeitet wird, v ist in Adj[u]): Baumkante. Kanten, die zum Baum gehören. v wurde bei der Sondierung der Kante (u, v ) entdeckt (erstmalig besucht). Rückwärtskante. Kante (u, v ), die u mit einem Vorfahren v im Tiefensuchbaum verbindet. Vorwärtskante. (Nicht-Baum-)Kante (u, v ), die u mit einem Nachfahre in v im Tiefensuchbaum verbindet. Querkanten. Die übrigen Kanten. Im gleichen Tiefensuchbaum, wenn der eine Knoten nicht Vorfahre des anderen ist oder zwischen zwei Knoten verschiedener Tiefensuchbäume (im Wald). farbe[v ] = weiss: Baumkante. farbe[v ] = grau: Rückwärtskante. farbe[v ] = schwarz: Vorwärts- oder Querkante. Vorwärtskante, falls d[u] < d[v ]. Querkante, falls d[u] > d[v ]. Anmerkung (zur Nachbereitung) Anmerkung Bei einem ungerichteten Graphen gibt es nur Baum- und Rückwärtskanten. Im Beispiel eben ist dies bereits geschehen! Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche 129/145 Breitensuche Tiefensuche Zusammenfassung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Analyse 130/145 Breitensuche Tiefensuche Zusammenfassung Breiten- und Tiefensuche - Zusammenfassung Zusammenfassung Breitensuche nutzt eine Queue, Tiefensuche einen Stack. (Die Tiefensuche wie im [Cormen] kommt ohne Stack aus, arbeitet dafür aber rekursiv und mit Zeitstempeln.) Satz Die Tiefensuche ist korrekt und ihre Laufzeit ist wieder in O(V + E ). Beide Operationen laufen in Θ(V + E ), wenn der Graph mittels Adjazenzlisten gegeben ist. Die Breitensuche hat (meist) nur einen Startknoten. Sie wird oft verwendet, um kürzeste Abstände und den Vorgängerteilgraphen zu ermitteln. Die Tiefensuche ermittelt einen Tiefensuchwald (mehrere Startknoten). Sie wird oft als Unterroutine in anderen Algorithmen verwendet. Frank Heitmann [email protected] 131/145 Frank Heitmann [email protected] 132/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Problemstellung Problemstellung ... oder beim Ermitteln der Zusammenhangskomponenten eines Graphen. Die Tiefensuche wird z.B. beim topologischen Sortieren benutzt... Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung 133/145 Topologisches Sortieren Zusammenhangskomponenten Wiederholung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Problemstellung 134/145 Topologisches Sortieren Zusammenhangskomponenten Wiederholung Darstellung von Graphen - Zusammenfassung Adjazenzmatrix: |V | × |V |-Matrix A = (aij ) mit aij = 1 falls (i, j) ∈ E und 0 sonst. Größe in Θ(V 2 ). Adjazenzliste: Liste Adj[v ] für jeden Knoten v ∈ V in der die Knoten, die mit v adjazent sind gespeichert sind. Größe in Θ(V + E ). Zu beidem gleich mehr... Bei einer Adjazenzmatrix kann man schnell herausfinden, ob zwei Knoten benachbart sind oder nicht. Dafür ist es langsamer alle Knoten zu bestimmen, die mit einem Knoten benachbart sind. (Bei Adjazenzlisten genau andersherum.) Beide Darstellungen sind ineinander transformierbar. Beide Darstellungen sind leicht auf den Fall eines gewichteten Graphen anpassbar. Frank Heitmann [email protected] 135/145 Frank Heitmann [email protected] 136/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Darstellung von Graphen - Adjazenzmatrix v v w x y w x Darstellung von Graphen - Adjazenzlisten y v 0 1 1 1 w 1 0 1 0 x 1 1 0 1 y 1 0 1 0 v x w x v x y v y v x y w Bei der Adjazenzlistendarstellung haben wir ein Array von |V | Listen, für jeden Knoten eine. Die Adjazenzliste Adj[v ] zu einem Knoten v enthält alle Knoten, die mit v adjazent sind. Bei einem gerichteten Graphen ist die Summe aller Adjazenzlisten |E |, bei einem ungerichteten Graphen |2E |. Der Speicherplatzbedarf ist folglich Θ(V + E ). 137/145 Topologisches Sortieren Zusammenhangskomponenten Wiederholung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breitensuche - Die Idee 138/145 Topologisches Sortieren Zusammenhangskomponenten Wiederholung Breitensuche - Die Idee Starte mit Knoten s in einer Queue Q. Wiederhole solange Q nicht leer... Gegeben ein Graph G und ein Startknoten s ’entdeckt’ die Breitensuche alle Knoten, die von s aus erreichbar sind. Zudem wird der Abstand (in Kanten) von s aus berechnet (tatsächlich wird sogar der kürzeste Abstand ermittelt). Nimm vordersten Knoten v aus Q. (Bearbeite diesen und Färbe diesen so, dass er nicht wieder besucht wird.) Tue alle Nachbarn von v , die bisher nicht besucht wurden in die Queue. Man kann auch zusätzlich einen ’Breitensuchbaum’ (mit Wurzel s) und damit die kürzesten Pfade von s zu den anderen Knoten ermitteln. Der Algorithmus entdeckt zunächst die Knoten mit Entfernung k und dann die mit Entfernung k + 1, daher der Name. Er geht erst in die Breite... Frank Heitmann [email protected] w x Der Speicherplatzbedarf ist in Θ(V 2 ) (unabhängig von der Kantenzahl). Frank Heitmann [email protected] v w y Bei einer Adjazenzmatrix hat man eine n × n-Matrix, bei der an der Stelle (i, j) genau dann eine 1 steht, wenn vi und vj verbunden sind. Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung Anmerkung Durch die Queue wird sichergestellt, dass die Knoten ’in der Breite’ besucht werden. 139/145 Frank Heitmann [email protected] 140/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Tiefensuche - Die Idee Tiefensuche - Die Idee Starte mit Knoten s in einem Stack S. Wiederhole solange S nicht leer... Bei der Tiefensuche geht man einfach immer weiter noch ungeprüfte Kanten entlang, so lange dies möglich ist. Mein folgt also ’einem Pfad’ so lange es möglich ist. Erst wenn man einen Konten erreicht von dem aus man nur bereits besuchte Knoten erreichen kann, geht man einen Schritt zurück. Nimm obersten Knoten v aus S. (Bearbeite diesen und Färbe diesen so, dass er nicht wieder besucht wird.) Tue alle Nachbarn von v , die bisher nicht besucht wurden auf den Stack. Bleiben unentdeckte Knoten übrig wählt man diese als neue Startknoten. So kann sich (bei einem unzusammenhängenden Graphen) ein Tiefensuchwald ergeben. (Die Breitensuche kann man auch so anpassen, aber typischerweise werden die Algorithmen so benutzt.) Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung Anmerkung Durch den Stack wird sichergestellt, dass die Knoten ’in der Tiefe’ besucht werden. 141/145 Topologisches Sortieren Zusammenhangskomponenten Wiederholung Frank Heitmann [email protected] Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Breiten- und Tiefensuche - Erweiterungen 142/145 Topologisches Sortieren Zusammenhangskomponenten Wiederholung Breiten- und Tiefensuche - Zusammenfassung Zusammenfassung Breitensuche nutzt eine Queue, Tiefensuche einen Stack. (Die Tiefensuche wie im [Cormen] kommt ohne Stack aus, arbeitet dafür aber rekursiv und mit Zeitstempeln.) Die Breitensuche kann mit ’distance’-Stempeln angereichert werden, um so die kürzesten Abstände von s zu ermitteln. Beide Operationen laufen in Θ(V + E ), wenn der Graph mittels Adjazenzlisten gegeben ist. Die Tiefensuche kann mit ’discovery’ und ’finished’ Zeit angereichert werden. So können die Kanten klassifiziert werden und man kann z.B. Kreise finden und noch andere Dinge tun. Wie oben kann man mit dem Vorgänger einen Tiefensuchbaum konstruieren. Die Breitensuche hat (meist) nur einen Startknoten. Sie wird oft verwendet, um kürzeste Abstände und den Vorgängerteilgraphen zu ermitteln. Die Tiefensuche ermittelt einen Tiefensuchwald (mehrere Startknoten). Sie wird oft als Unterroutine in anderen Algorithmen verwendet. Frank Heitmann [email protected] 143/145 Frank Heitmann [email protected] 144/145 Grundlagen Breiten- und Tiefensuche Anwendung der Tiefensuche Topologisches Sortieren Zusammenhangskomponenten Wiederholung Auf einen Blick... Graphen Grundlagen, Adjazenzmatrix, Adjazenzliste Breiten- & Tiefensuche Ausblick: Anwendung der Tiefensuche Ausblick: Minimale Spannbäume Frank Heitmann [email protected] 145/145