1 Algorithmen und Datenstrukturen Wintersemester 2013/14 20. Vorlesung Kürzeste Wege & Dijkstras Algorithmus Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I 2 MINT-Tutorium findet voraussichtlich 24.–28. März statt bereitet auf den zweiten Klausurtermin (Mo, 31.3.) vor 5 × 5 Stunden: Vorlesung, Übung, Fragestunde gemischt Leitung: Titus Dose (ADS-Tutor WS 2012/13) 2 MINT-Tutorium findet voraussichtlich 24.–28. März statt bereitet auf den zweiten Klausurtermin (Mo, 31.3.) vor 5 × 5 Stunden: Vorlesung, Übung, Fragestunde gemischt Leitung: Titus Dose (ADS-Tutor WS 2012/13) 2008 haben 15 HörerInnen an der 2. Klausur teilgenommen. 2 MINT-Tutorium findet voraussichtlich 24.–28. März statt bereitet auf den zweiten Klausurtermin (Mo, 31.3.) vor 5 × 5 Stunden: Vorlesung, Übung, Fragestunde gemischt Leitung: Titus Dose (ADS-Tutor WS 2012/13) 2008 haben 15 HörerInnen an der 2. Klausur teilgenommen. MINT-Tutorium regelmäßig teilgenommen nicht oder unregelmäßig 7 8 2 MINT-Tutorium findet voraussichtlich 24.–28. März statt bereitet auf den zweiten Klausurtermin (Mo, 31.3.) vor 5 × 5 Stunden: Vorlesung, Übung, Fragestunde gemischt Leitung: Titus Dose (ADS-Tutor WS 2012/13) 2008 haben 15 HörerInnen an der 2. Klausur teilgenommen. regelmäßig teilgenommen nicht oder unregelmäßig MINT-Tutorium bestanden 7 8 4 1 3 Wozu kürzeste Wege? 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 4 Modellierung des Problems Routenplanung Straßenkreuzung → Knoten Straßenabschnitt → zwei entgegengerichtete Kanten Einbahnstraßenabschnitt → in Fahrtrichtung gerichtete Kante Fahrtzeit für Abschnitt e → Kantengewicht w (e ) ≥ 0 Straßennetz → gerichteter, gewichteter und zusammenhängender Graph G (V , E ) Start → Knoten s ∈ V Ziel → Knoten t ∈ V Start-Ziel-Route → s -t -Weg, d.h. Folge von Kanten (s , v1 ), (v1 , v2 ), . . . , (vk , t ) in G 5 Wozu kürzeste Wege? 5 Wozu kürzeste Wege? 5 Wozu kürzeste Wege? 6 Wozu kürzeste Wege? (II) 7-1 Was ist das Problem? Eingabe: gerichteter, zusammenhängender Graph G = (V , E ) mit nicht-negativen Kantengewichten w : E → Q+ 0, a 6 3 s 4 2 1 3 5 c 7 b 2 7 t 7-2 Was ist das Problem? Eingabe: gerichteter, zusammenhängender Graph G = (V , E ) mit nicht-negativen Kantengewichten w : E → Q+ 0, a 6 Knoten s und t 3 s 4 2 1 3 5 c 7 b 2 7 t 7-3 Was ist das Problem? Eingabe: gerichteter, zusammenhängender Graph G = (V , E ) mit nicht-negativen Kantengewichten w : E → Q+ 0, b a 6 Knoten s und t 3 s 4 2 1 2 7 3 5 Ausgabe: c t 7 P kürzester s -t -Weg W in G , d.h. e ∈W w (e ) minimal. Darstellung durch Vorgänger-Zeiger π: für jeden Knoten v sei π(v ) ∈ V ∪ {nil } Vorgänger von v auf kürzestem s -v -Weg. 7-4 Was ist das Problem? Eingabe: gerichteter, zusammenhängender Graph G = (V , E ) mit nicht-negativen Kantengewichten w : E → Q+ 0, b a 6 Knoten s und t 3 s 4 2 1 2 7 3 5 Ausgabe: c t 7 P kürzester s -t -Weg W in G , d.h. e ∈W w (e ) minimal. Darstellung durch Vorgänger-Zeiger π: für jeden Knoten v sei π(v ) ∈ V ∪ {nil } Vorgänger von v auf kürzestem s -v -Weg. 7-5 Was ist das Problem? Eingabe: gerichteter, zusammenhängender Graph G = (V , E ) mit nicht-negativen Kantengewichten w : E → Q+ 0, b a 6 Knoten s und t 3 s 4 2 1 2 7 3 5 Ausgabe: c t f|ür alle t ∈ V 7 {z }P kürzester s -t -Wege Wt in G , d.h. e ∈W w (e ) minimal. Darstellung durch Vorgänger-Zeiger π: für jeden Knoten v sei π(v ) ∈ V ∪ {nil } Vorgänger von v auf kürzestem s -v -Weg. 7-6 Was ist das Problem? Eingabe: gerichteter, zusammenhängender Graph G = (V , E ) mit nicht-negativen Kantengewichten w : E → Q+ 0, b a 6 Knoten s und t 3 s 4 2 1 2 7 3 5 Ausgabe: c t f|ür alle t ∈ V 7 {z }P kürzester s -t -Wege Wt in G , d.h. e ∈W w (e ) minimal. Darstellung durch Vorgänger-Zeiger π: für jeden Knoten v sei π(v ) ∈ V ∪ {nil } Vorgänger von v auf kürzestem s -v -Weg. Nebenbemerkung: Analoge Berechnungsverfahren? 8 Dijkstra – BFS mit Gewichten Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) 8 Dijkstra – BFS mit Gewichten Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) BFS(Graph G , Vertex s ) Initialize(G , s ) Q = new Queue() Q .Enqueue(s ) while not Q .Empty() do u = Q .Dequeue() foreach v ∈ Adj[u ] do if v .color == white then v .color = gray v .d = u .d + 1 v .π = u Q .Enqueue(v ) u .color = black 8 Dijkstra – BFS mit Gewichten Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) // Gewichtung Initialize(G , s ) Q = new PriorityQueue(V , d ) BFS(Graph G , Vertex s ) Initialize(G , s ) while not Q .Empty() do Q = new Queue() u = Q .ExtractMin() Q .Enqueue(s ) foreach v ∈ Adj[u ] do while not Q .Empty() do Relax(u , v ; w ) u = Q .Dequeue() u .color = black foreach v ∈ Adj[u ] do if v .color == white then v .color = gray v .d = u .d + 1 v .π = u Q .Enqueue(v ) u .color = black 8 Dijkstra – BFS mit Gewichten Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) // Gewichtung Initialize(G , s ) Q = new PriorityQueue(V , d ) BFS(Graph G , Vertex s ) Initialize(G , s ) while not Q .Empty() do Q = new Queue() u = Q .ExtractMin() Q .Enqueue(s ) foreach v ∈ Adj[u ] do while not Q .Empty() do Relax(u , v ; w ) u = Q .Dequeue() u .color = black foreach v ∈ Adj[u ] do if v .color == white then v .color = gray v .d = u .d + 1 v .π = u Q .Enqueue(v ) u .color = black 8 Dijkstra – BFS mit Gewichten Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) // Gewichtung Initialize(G , s ) Q = new PriorityQueue(V , d ) BFS(Graph G , Vertex s ) Initialize(G , s ) while not Q .Empty() do Q = new Queue() u = Q .ExtractMin() Q .Enqueue(s ) foreach v ∈ Adj[u ] do while not Q .Empty() do Relax(u , v ; w ) u = Q .Dequeue() u .color = black Relax(u , v ; w ) Was muss in dieser Unterroutine passieren? Schreiben Sie’s auf! foreach v ∈ Adj[u ] do if v .color == white then v .color = gray v .d = u .d + 1 v .π = u Q .Enqueue(v ) u .color = black 8 Dijkstra – BFS mit Gewichten Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) // Gewichtung Initialize(G , s ) Q = new PriorityQueue(V , d ) BFS(Graph G , Vertex s ) Initialize(G , s ) while not Q .Empty() do Q = new Queue() u = Q .ExtractMin() Q .Enqueue(s ) foreach v ∈ Adj[u ] do while not Q .Empty() do Relax(u , v ; w ) u = Q .Dequeue() u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) foreach v ∈ Adj[u ] do if v .color == white then v .color = gray v .d = u .d + 1 v .π = u Q .Enqueue(v ) u .color = black 9-1 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 1 8 2 3 9 t 4 6 5 c 2 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-2 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a∞ 8 s 0 2 3 5 c∞ 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-3 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a∞ 8 s 0 2 3 5 c∞ 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-4 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a∞ 8 s 0 2 3 5 c∞ 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-5 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a∞ 8 s 0 2 3 5 c∞ 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-6 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a 8 8 s 0 2 3 5 c∞ 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-7 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a 8 8 s 0 2 3 5 c∞ 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-8 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a 8 8 s 0 2 3 5 c 5 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-9 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-10 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-11 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 ∞t 4 6 ∞b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-12 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 14 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-13 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 14 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-14 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 14 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-15 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 14 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-16 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 13 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-17 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 13 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-18 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 13 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-19 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 13 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-20 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 9 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-21 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 9 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-22 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 9 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-23 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 9 t 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-24 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 t 9 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-25 Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 t 9 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 Kürzester-Wege-Baum mit Wurzel s Dijkstra – ein Beispiel Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) a s 0 8 8 2 3 5 c 5 1 9 2 t 9 4 6 7 b Initialize(Graph G , Vertex s ) foreach u ∈ V do u .color = white u .d = ∞ u .π = nil s .color = gray s .d = 0 9-26 10 Dijkstra – die Laufzeit Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O ( ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) Für jeden Knoten u ∈ V genau |Adj[u ]| mal, 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) Für jeden Knoten u ∈ V (out-) genau |Adj[u ]|= deg u mal, 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) Für jeden Knoten u ∈ V (out-) genau |Adj[u ]|= deg u mal, also insg. Θ (E ) mal. 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) Für jeden Knoten u ∈ V (out-) genau |Adj[u ]|= deg u mal, also insg. Θ (E ) mal. Also wird DecreaseKey O (E ) mal aufgerufen. 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) Für jeden Knoten u ∈ V (out-) genau |Adj[u ]|= deg u mal, also insg. Θ (E ) mal. Also wird DecreaseKey O (E ) mal aufgerufen. 10 Dijkstra – die Laufzeit Abk. für O (V ) Dijkstra(WeightedGraph G , Vertex s ) Initialize(G , s ) O (V ) Zeit Q = new PriorityQueue(V , d ) while not Q .Empty() do genau |V | mal u = Q .ExtractMin() foreach v ∈ Adj[u ] do Relax(u , v ; w ) Wie oft wird Relax aufgerufen? u .color = black Relax(u , v ; w ) if v .d > u .d + w (u , v ) then v .color = gray v .d = u .d + w (u , v ) v .π = u Q .DecreaseKey(v , v .d ) Für jeden Knoten u ∈ V (out-) genau |Adj[u ]|= deg u mal, also insg. Θ (E ) mal. Also wird DecreaseKey O (E ) mal aufgerufen. 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. n = (max.) Anzahl der Elemente in der PriorityQueue Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld O (n ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld O (n ) O (1) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld O (n ) O (1) O ( V 2 +E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap O (n ) O (1) O ( V 2 +E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap O (n ) O (log n) O (1) O ( V 2 +E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap O (n ) O (1) O (log n) O (log n) O ( V 2 +E ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert O (1) amortisiert 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert O (1) amortisiert O (E + V log V ) im Worst-Case! 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert O (1) amortisiert O (E + V log V ) im Worst-Case! siehe Seminar Entwurf und Analyse von Datenstrukturen! 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert O (1) amortisiert O (E + V log V ) im Worst-Case! 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert O (1) amortisiert O (E + V log V ) im Worst-Case! Korollar. In einem Graphen G = (V , E ; w ) mit w : E → Q≥0 kann man in O (E + V log V ) Zeit die kürzesten Wege von einem zu allen Knoten berechnen (SSSP-Problem). 11 Dijkstra – die Laufzeit Satz. Gegeben ein Graph G = (V , E ), läuft Dijstras Alg. in O (V · TExtractMin (V ) + E · TDecreaseKey (V )) Zeit. Implementierung einer PriorityQueue TExtractMin (n) TDecreaseKey (n) TDijkstra (V , E ) als unsortiertes Feld als Heap als Fibonacci-Heap O (n ) O (1) O ( V 2 +E ) O (log n) O (log n) O ((E +V ) log V ) O (log n) amortisiert O (1) amortisiert O (E + V log V ) im Worst-Case! Korollar. In einem Graphen G = (V , E ; w ) mit w : E → Q≥0 kann man in O (E + V log V ) Zeit die kürzesten Wege von einem zu allen Knoten berechnen (SSSP-Problem). 12 Dijkstra – die Korrektheit 12 Dijkstra – die Korrektheit siehe [CLRS], Kapitel 24.3., Satz 24.6: Korrektheisbeweis mittels Schleifeninvariante. 12 Dijkstra – die Korrektheit siehe [CLRS], Kapitel 24.3., Satz 24.6: Korrektheisbeweis mittels Schleifeninvariante. oder 12 Dijkstra – die Korrektheit siehe [CLRS], Kapitel 24.3., Satz 24.6: Korrektheisbeweis mittels Schleifeninvariante. oder MIT-Vorlesungsmitschnitt von Erik Demaine: http://videolectures.net/mit6046jf05_demaine_lec17 13 Wozu kürzeste Wege? (III) – SMSen GHI MNO DEF MNO PQRS MNO ABC TUV GHI JKL 13 Wozu kürzeste Wege? (III) – SMSen GHI MNO DEF MNO PQRS MNO ABC TUV GHI JKL 13 Wozu kürzeste Wege? (III) – SMSen GHI MNO DEF MNO PQRS MNO ABC TUV GHI JKL 10:21 für T9 14 Modellierung – SMSen J K L P W Q X R Y S Z T U V 14 Modellierung – SMSen J K L Graph: P W Q X R Y S Z T U V 14 Modellierung – SMSen J K L Graph: P W Q X R Y S Z T U V Knoten = ˆ Buchstaben 14 Modellierung – SMSen J K L Graph: P W Q X R Y S Z T U V Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. 14 Modellierung – SMSen J K L Graph: P W Q X R Y S Z T U V Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. 14 Modellierung – SMSen J K L Graph: P W Q X R Y S Z T U V Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. 14 Modellierung – SMSen 0,00001 W Q X T 0,0 J P 0,0 2 03 0, R 10 0,0 Y 03 0, L 0,00001 V S Graph: 0,00005 1 20 K 0,15 U 01 0 00 0, 0,0 0 0,0 0, 02 01 0,03 1 00 0 0,0 Z Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. Gewichte = ˆ Wahrscheinlichkeiten w 14 Modellierung – SMSen 0,00001 W Q X T 0,0 J P 0,0 2 03 0, R 10 0,0 Y 03 0, L 0,00001 V S Graph: 0,00005 1 20 K 0,15 U 01 0 00 0, 0,0 0 0,0 0, 02 01 0,03 1 00 0 0,0 Z Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. Gewichte = ˆ Wahrscheinlichkeiten w / Häufigkeiten 14 Modellierung – SMSen 0,00001 W Q X T 0,0 J P 0,0 2 03 0, R S Gesucht: 10 0,0 Y 03 0, L 0,00001 V Graph: 0,00005 1 20 K 0,15 U 01 0 00 0, 0,0 0 0,0 0, 02 01 0,03 1 00 0 0,0 Z Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. Gewichte = ˆ Wahrscheinlichkeiten w / Häufigkeiten 14 Modellierung – SMSen 0,00001 W Q X T 0,0 J P 0,0 2 03 0, R 10 0,0 Y 03 0, L 0,00001 V S Graph: 0,00005 1 20 K 0,15 U 01 0 00 0, 0,0 0 0,0 0, 02 01 0,03 1 00 0 0,0 Z Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. Gewichte = ˆ Wahrscheinlichkeiten w / Häufigkeiten Gesucht: Weg P von nach mit größter WK 14 Modellierung – SMSen 0,00001 W Q X T 0,0 J P 0,0 2 03 0, R 0,00005 10 0,0 Y 03 0, L 0,00001 V S 1 20 K 0,15 U 01 0 00 0, 0,0 0 0,0 0, 02 01 0,03 1 00 0 0,0 Z Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. Gewichte = ˆ Wahrscheinlichkeiten w / Häufigkeiten Q Gesucht: Weg P von nach mit größter WK (= e ∈P w (e )) Graph: 14 Modellierung – SMSen 0,00001 W Q X T 0,0 J P 0,0 2 03 0, R 0,00005 10 0,0 Y 03 0, L 0,00001 V S 1 20 K 0,15 U 01 0 00 0, 0,0 0 0,0 0, 02 01 0,03 1 00 0 0,0 Z Knoten = ˆ Buchstaben Kanten = ˆ aufeinanderfolgende Buchst. Gewichte = ˆ Wahrscheinlichkeiten w / Häufigkeiten Q Gesucht: Weg P von nach mit größter WK (= e ∈P w (e )) Graph: Lösung: dynamisches Programmieren 15 Literatur A note on two problems in connexion with graphs. Edsger Wybe Dijkstra: Numerische Mathematik (1) 1959, S. 269–271. Edsger Wybe Dijkstra ∗ 1930 in Rotterdam † 2002 in Nuenen, Niederlande 15 Literatur A note on two problems in connexion with graphs. Edsger Wybe Dijkstra: Numerische Mathematik (1) 1959, S. 269–271. Das Geheimnis des kürzesten Weges. Ein mathematisches Abenteuer. Peter Gritzmann und René Brandenberg: Springer-Verlag, 3. Aufl., 2005. Edsger Wybe Dijkstra ∗ 1930 in Rotterdam † 2002 in Nuenen, Niederlande 15 Literatur A note on two problems in connexion with graphs. Edsger Wybe Dijkstra: Numerische Mathematik (1) 1959, S. 269–271. Das Geheimnis des kürzesten Weges. Ein mathematisches Abenteuer. Peter Gritzmann und René Brandenberg: Springer-Verlag, 3. Aufl., 2005. Beide Werke sind über die UB frei zugänglich und über unsere WueCampus-Seite verlinkt! Edsger Wybe Dijkstra ∗ 1930 in Rotterdam † 2002 in Nuenen, Niederlande 15 Literatur A note on two problems in connexion with graphs. Edsger Wybe Dijkstra: Numerische Mathematik (1) 1959, S. 269–271. Lesen Sie Das Geheimnis des mal rein! kürzesten Weges. Ein mathematisches Abenteuer. Peter Gritzmann und René Brandenberg: Springer-Verlag, 3. Aufl., 2005. Beide Werke sind über die UB frei zugänglich und über unsere WueCampus-Seite verlinkt! Edsger Wybe Dijkstra ∗ 1930 in Rotterdam † 2002 in Nuenen, Niederlande 16 Kürzeste Wege nach Dijkstra X X nicht-neg. Kantengew. Dijkstra O (E + V log V ) ungewichteter Graph Breitensuche O (E + V ) azyklischer Graph topol. Sortieren O (E + V ) negative Kantengew. Bellman-Ford O (E V ) für alle Knotenpaare V × Dijkstra O (V (E + V log V )) + negative Kantengew. Floyd-Warshall k kürzeste s -t -Wege O (V 3 ) Johnson O (V (E + V log V )) Eppstein O (k + E + V log V ) 16 Kürzeste Wege nach Dijkstra X O (E + V ) X ächstes O (E + V ) N X Mal! O (E + V log V ) nicht-neg. Kantengew. Dijkstra ungewichteter Graph Breitensuche azyklischer Graph topol. Sortieren negative Kantengew. Bellman-Ford O (E V ) für alle Knotenpaare V × Dijkstra O (V (E + V log V )) + negative Kantengew. Floyd-Warshall k kürzeste s -t -Wege O (V 3 ) Johnson O (V (E + V log V )) Eppstein O (k + E + V log V ) 16 Kürzeste Wege nach Dijkstra nicht-neg. Kantengew. Dijkstra ungewichteter Graph Breitensuche azyklischer Graph topol. Sortieren X O (E + V ) X ächstes O (E + V ) N X Mal! O (E + V log V ) Vorlesung Alg. Graphentheorie (?) negative Kantengew. Bellman-Ford O (E V ) für alle Knotenpaare V × Dijkstra O (V (E + V log V )) + negative Kantengew. Floyd-Warshall k kürzeste s -t -Wege O (V 3 ) Johnson O (V (E + V log V )) Eppstein O (k + E + V log V ) 16 Kürzeste Wege nach Dijkstra nicht-neg. Kantengew. Dijkstra ungewichteter Graph Breitensuche azyklischer Graph topol. Sortieren X O (E + V ) X ächstes O (E + V ) N X Mal! O (E + V log V ) Vorlesung Alg. Graphentheorie (?) negative Kantengew. Bellman-Ford O (E V ) für alle Knotenpaare V × Dijkstra O (V (E + V log V )) + negative Kantengew. Floyd-Warshall k kürzeste s -t -Wege 3 O (V ) X Johnson O (V (E + V log V )) Eppstein O (k + E + V log V )