20. Vorlesung (09.01.2014)

Werbung
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 )
Herunterladen