Themen der Übung Kürzeste Wege und Stacks Themen heute Nachtrag: SimpleStack.toString() Nachtrag: Beweis aus der Vorlesung CoMa-Übung IX Algorithmus von Floyd-Warshall Kürzeste Wege aus der Tree-Matrix berechnen TU Berlin Adjazenzlisten und -matrizen 19.12.2012 Tiefensuche CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 1 / 21 CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks Nachträge Floyd-Warshall-Algorithmus SimpleStack.toString() Geschichte 1 2 3 4 5 6 7 8 9 10 11 2 / 21 1962 unabhängig von Floyd und Warshall publiziert. /∗ ∗ ∗ Returns a s t r i n g r e p r e s e n t a t i o n of t h i s stack , top element f i r s t . ∗ @return a String r e p r e s e n t i n g t h i s stack . ∗/ public String toString () { S t r i n g s t r = ”” ; f o r ( L i s t N o d e <T> c u r r = t o p ; c u r r != n u l l ; c u r r = c u r r . getNext () ) { s t r = s t r + c u r r . getData ( ) . t o S t r i n g ( ) ; } return s t r ; } Robert W. Floyd. → Diese Version machen wir hier. Algorithm 97 (SHORTEST PATH). Communications of the ACM, 5(6): 345, 1962. Stephen Warshall. A Theorem on Boolean Matrices. Journal of the ACM, 9(1): 11-12, 1962. Idee Bellman-Ford: Berechne kürzeste Wege mit maximal 1, 2, 3, . . . Kanten. Floyd-Warshall: Berechne kürzeste Wege die nur Zwischenstopps in ∅, {v1 }, {v1 , v2 }, . . . machen. Beweis Stackbedingung eKreide CoMa-Übung IX (TU Berlin) 19.12.2012 Kürzeste Wege und Stacks 19.12.2012 3 / 21 CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 4 / 21 Floyd-Warshall-Algorithmus (2) Floyd-Warshall-Algorithmus (3) Formalisierung der Idee Berechnen der dist(v , w , X ) Initialisierung: dist(v , w , ∅) := avw . dist(v , w , X ) := Länge eines kürzesten v -w -Weges, der nur Knoten aus {v , w } ∪ X besucht Zurückführung auf leichtere Fälle: dist(v , w , {x1 , . . . , xk }) = min{ I Beobachtungen I Wir sind an den dist(v , w , V ), v , w ∈ V interessiert. dist(v , w , ∅) ist leicht zu berechnen: I dist(v , w , {x1 , . . . , xk−1 }), dist(v , xk , {x1 , . . . , xk−1 }) + dist(xk , w , {x1 , . . . , xk−1 }) }. xk dist(v , w , ∅) := avw (für eine Entfernungsmatrix A = (a)ij ). {x1 , . . . , xk−1 } dist(v , w , {x}) auch: I I dist(v , w , {x}) = min{dist(v , w , ∅), dist(v , x, ∅) + dist(x, w , ∅)}. Entweder der direkte Weg oder der Umweg über den einzig erlaubten Zwischenstopp x ist besser. v CoMa-Übung IX (TU Berlin) w Kürzeste Wege und Stacks 19.12.2012 5 / 21 CoMa-Übung IX (TU Berlin) Tree-Matrizen Code Idee: Für i = 1, . . . , n − 1: Für v = 0, . . . , n − 1: F F F I Für w = 0, . . . , n − 1: dist(v , w , {0, . . . , i}) := min{ dist(v , w , {0, . . . , i − 1}), dist(v , i, {0, . . . , i − 1}) + dist(i, w , {0, . . . , i − 1}) }. 6 / 21 Updates in der innersten Schleife des Bellman-Ford-Algorithmus: 1 2 3 3 verschaltete Schleifen von 0 bis n − 1. 4 Größenordnung von n3 Operationen nötig. 5 (n3 log n Schneller als die Bellman-Ford-Varianten aus der VL n4 ) – es gibt aber auch schnellere Bellman-Ford-Varianten. Kürzeste Wege und Stacks tree[i][j] – speichert Vorgängerknoten von j auf dem i-j-Weg. Initialisierung: tree[i][j] = i falls (i, j) ∈ E , tree[i][j] = -1 sonst. Aufwand CoMa-Übung IX (TU Berlin) 19.12.2012 Speichere, wie die Minima gebildet wurden (→ Tree-Matrix). Bellman-Ford: Für w = 0, . . . , n − 1 : dist(v , w , ∅) := avw . F Kürzeste Wege und Stacks Bellman-Ford und Floyd-Warshall bilden wiederholt Minima. Für v = 0, . . . , n − 1: I w Rückführung auf den Fall mit einem Zwischenstopp weniger. Floyd-Warshall-Algorithmus (4) I {x1 , . . . , xk−1 } Entweder ist xk ein hilfreicher Zwischenstopp für einen kürzesten v -w -Weg oder nicht. x v {x1 , . . . , xk−1 } 6 bzw. 19.12.2012 f o r ( i n t k = 0 ; k < n ; k++) { i f (u [ i ] [ j ] > u [ i ] [ k ] + a [ k ] [ j ]) { u[ i ][ j ] = u[ i ][ k] + a[k ][ j ]; tree [ i ][ j ] = k ; } } Für jeden Startknoten v lässt sich aus tree[v] ein kürzester Wege-Baum berechnen. 7 / 21 CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 8 / 21 Datenstrukturen für Graphen Tree-Matrizen (2) Graphen sind ein wichtiges Modellierungswerkzeug Müssen irgendwie gespeichert werden Bisher: Adjazenzmatrizen Jetzt: Adjazenzlisten Beispiel: 1 2 1 5 4 2 1 -1 1 -1 1 2 Adjazenzmatrizen: Beispiel 6 5 -3 0 0 0 0 0 -3 3 2 1 1 2 3 4 5 5 3 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 Der kürzeste Wege Baum für den Startknoten 1. Die Einträge von tree[1]. Ein kürzester 1-6-Weg lässt sich dann aus schrittweise aus der Matrix ablesen: 1 → 2 → 3 → 5 → 6 CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 9 / 21 Blöd: nur n Knoten & n − 1 Kanten, aber n2 Platz für die Matrix nötig Adjazenzlisten zum Platzsparen CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks Adjazenzlisten Ein weiteres Beispiel Idee (Gerichteter) Petersen-Graph Jeder Knoten besitzt Liste seiner Nachbarn 4 5 6 Knoten 4: {5,9} 7 Knoten 2: {3} 10 Knoten 3: {4} 3 Knoten 5: {} 9 Gut: n Knoten & n − 1 Kanten, in der Größenordnung von n Platz nötig 19.12.2012 11 / 21 Knoten 5: {1,10} Knoten 7: {9,10} 4 Kürzeste Wege und Stacks 5 Knoten 6: {8,9} 8 Knoten 4: {5} CoMa-Übung IX (TU Berlin) 12 / 21 Knoten 3: {4,8} 2 Knoten 1: {2} 3 19.12.2012 Knoten 2: {3,7} 1 2 10 / 21 Knoten 1: {2,6} Beispiel 1 19.12.2012 Knoten 8: {10} Knoten 9: {} Knoten 10: {} CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks Ein ungerichtetes Beispiel Vorteile und Nachteile von Adjazenzlisten Petersen-Graph Vorteile Knoten 1: {5,2,6} Braucht für dünne Graphen (um n Kanten) weniger Speicher als Matrizen Beschleunigt Algorithmen auf dünnen Graphen, die Knoten 2: {1,3,7} 1 Knoten 3: {2,4,8} 2 6 7 10 5 I Knoten 5: {4,1,10} I Knoten 6: {1,8,9} 8 9 3 Knoten 4: {3,5,9} Nachteile Knoten 7: {2,9,10} Test, ob eine Kante im Graph ist, dauert länger Knoten 8: {3,6,10} 4 alle Nachbarn eines Knoten oder alle Knoten des Graphen betrachten Erfordert für dichte Graphen (um n2 Kanten) mehr Speicher als Matrizen (Overhead durch Listen) Knoten 9: {4,6,7} Knoten 10: {5,7,8} CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 13 / 21 Tiefensuche CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 14 / 21 Tiefensuche mit vorgegebenem Startknoten Ideen Algorithmus zur systematischen Suche in Graphen Beginne bei Startknoten Eingabe: Graph G = (V , E ), manchmal auch Startknoten s ∈ V Benutze Adjazenzlisten, um neue Knoten zu finden Markiere Knoten: Ausgabe: Anwendungsabhängig Anwendungen: I I I I I I I Zusammenhängende Komponenten eines Graphen bestimmen Kreise finden Wege zwischen zwei Knoten finden Baum / Wald, der alle Knoten enthält ... CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 I Weiß für noch nicht besuchte Knoten Orange für besuchte Knoten, von denen wir weitersuchen können Rot für besuchte Knoten, von denen wir nicht weitersuchen können Benutze einen Stack weitersuchen können , um Knoten zu merken, von denen wir Nummeriere die Knoten in der Reihenfolge, in der sie gefunden werden (nett für einige Anwendungen) 15 / 21 CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 16 / 21 Tiefensuche mit vorgegebenem Startknoten Tiefensuche – Beispiel Basis-Algorithmus mit Startknoten s Färbe alle Knoten weiß s a b ... gk Erzeuge einen leeren Stack di Lege s auf den Stack s Solange der Stack nicht leer ist: Betrachte den obersten Knoten v v des Stacks I F I d e b 19.12.2012 k f j 17 / 21 Tiefensuche – Laufzeit, Speicherplatz und Kantenklassifizierung c b h c Falls v orange ist: Färbe den Knoten rot v → v und entferne ihn vom Stack Falls v rot ist: Nimm den Knoten vom Stack Kürzeste Wege und Stacks b i s v erhält die nächste freie Nummer Weiße Nachbarn w werden auf den Stack gelegt (Adjazenzliste durchlaufen) CoMa-Übung IX (TU Berlin) hf a Falls v weiß ist: Färbe den Knoten orange v → v F I ej g a s CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks gk Speicherplatz: für jede Kante wird maximal einmal ein Knoten auf den Stack gelegt di Laufzeit und Speicherplatz linear in der Anzahl der Kanten ej g 10 11 d I 9e 7 b 19.12.2012 20 / 21 b 6i 1s Anwendungsbeispiel: Gerichtete Zykel aus Digraph entfernen Kanten betrachten, sobald beide Knoten gefärbt wurden hf a 12 Farben und Knotennummern erlauben Klassifikation der Kanten → für Anwendungen interessant I 18 / 21 Tiefensuche – Beispiel mit Nummerierung Laufzeit: jede Kante wird genau einmal betrachtet I 19.12.2012 5k 8f 4j 1 → 2 : okay 1 → : okay 2 → 1 : gerichteter Zykel 2c 3 h c b a s CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 19 / 21 CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks Frohe Weihnachten und einen guten Rutsch! Euer CoMa-Team CoMa-Übung IX (TU Berlin) Kürzeste Wege und Stacks 19.12.2012 21 / 21