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