Algorithmen und Datenstrukturen

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)
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
5
Wozu kürzeste Wege?
6
Wozu kürzeste Wege? (II)
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-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 )
// 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-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
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
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.
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
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
10:21 für T9
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.
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
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