Dijkstra-Algorithmus

Werbung
Dijkstra-Algorithmus
Matthias Lederer
11. November 2013
• 1959 vom Niederländer Edsger Wybe Dijkstra (1930–2002) entdeckt
• findet kürzeste Pfade von einem Startknoten aus zu allen anderen Knoten (Single-source
shortest path) in gerichteten Graphen mit positiven Kantengewichten, z. B. in Straßennetzen
• seine Zeitkomplexität ist O(m log m) oder O(m log n) bei n Knoten und m Kanten, d. h. die
benötigte Zeit „wächst höchstens wie“ m log m, es geht aber auch noch besser
Quellen
[1] Bast, Prof. Dr. H.: Dijkstra’s algorithm, Connected Components. Version: Mai 2012. http://
ad-teaching.informatik.uni-freiburg.de/route-planning-ss2012/lecture-2.pdf. In:
Efficient Route Planning. 2012
[2] Bast, Prof. Dr. H.: Dijkstras Algorithmus. Version: Juni 2013. http://ad-teaching.
informatik.uni-freiburg.de/AlgoDatSS2013/vorlesung-10b.pdf. In: Informatik II: Algorithmen und Datenstrukturen. 2013
[3] Thorup, Mikkel: Undirected Single Source Shortest Paths in Linear Time / AT&T Labs |
Research. Version: 1999. http://www.diku.dk/PATH05/Thorup-1.pdf. 1999. – Forschungsbericht
[4] Wikipedia: Dijkstra Algorithmus. http://de.wikipedia.org/wiki/Dijkstra-Algorithmus.
Version: August 2013. – Zuletzt abgerufen: 4. Nov. 2013
[5] Wikipedia: Edsger W. Dijkstra. http://de.wikipedia.org/wiki/Edsger_W._Dijkstra.
Version: August 2013. – Zuletzt abgerufen: 4. Nov. 2013
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Eingabe : Graph G = (V, E, f ), V : Menge der Knoten, E: Menge der Kanten in der Form
(a, b) mit a als Startknoten und b als Endknoten, f (e): Länge der Kante e ∈ E;
Startknoten s ∈ V
Daten : Menge der aktiven Knoten Q; aktueller Knoten u
Ausgabe : Menge der Vorgänger P ; Menge der Entfernungen D
D(s) ← 0 // s hat Entfernung 0;
∀v 6= s : D(v) ← ∞ // alle anderen ∞;
Q ← {s} // wir fangen mit s an;
solange Q 6= ∅ // solange wir noch Knoten erreichen können tue
wähle u ∈ Q : ∀v ∈ Q : D(u) ≤ D(v) // u ist aktiver Knoten mit kleinster
Entfernung;
Q ← Q \ {u} // u ist nun gelöst, d.ḣ. es gibt keinen kürzeren Pfad zu u,
wir brauchen uns also nicht mehr um ihn zu kümmern;
für ∀e = (u, v) : e ∈ E // für alle ausgehenden Kanten von u tue
// Relaxieren bzw. können die Kosten für den nachfolgenden Knoten v
verbessert werden?
wenn D(v) > D(u) + f (e) dann
D(v) ← D(u) + f (e) // Ja, dann mach’s!;
P (v) ← u // u ist jetzt Vorgänger von v;
Q ← Q ∪ {v} // v zu den aktiven Knoten hinzufügen, wenn v nicht
schon darin enthalten ist;
Ende
Ende
Ende
Beispiel
u1
2
u7
s
2
2
9
3
2
u3
u8
1
5
u6
4
3
5
2
4
1
1
4
u2
2
3
2
u4
2
u5
Herunterladen