Der Dijkstra-Algorithmus berechnet die kürzesten Wege von einem Startknoten zu allen anderen Knoten in einem gewichteten Graphen — vorausgesetzt, alle Kantengewichte sind nicht negativ. Entwickelt wurde er 1956 vom niederländischen Informatiker Edsger W. Dijkstra und 1959 veröffentlicht; er gehört zu den bekanntesten Algorithmen der Informatik.
Wo er überall steckt
Navigationsgeräte und Routenplaner berechnen mit Dijkstra-Varianten die schnellste Strecke. Auch Netzwerk-Routingprotokolle wie OSPF nutzen das Verfahren, um günstige Wege durch das Netz zu finden — die Netztopologie liegt dabei als Adjazenzliste oder Adjazenzmatrix vor.
So funktioniert er
- Der Startknoten erhält die Distanz 0, alle anderen unendlich.
- Ein Heap (Prioritätswarteschlange) enthält die noch nicht abgeschlossenen Knoten, sortiert nach ihrer aktuellen Distanz.
- Der Knoten mit der kleinsten Distanz wird entnommen und abgeschlossen.
- Für jeden Nachbarn wird geprüft, ob der Weg über den aktuellen Knoten kürzer ist als der bisher bekannte; wenn ja, wird die Distanz aktualisiert und der Nachbar neu in den Heap einsortiert.
- Schritte 3 und 4 wiederholen sich, bis alle Knoten abgeschlossen sind.
Beispiel in Python
import heapq
def dijkstra(start, graph):
dist = {k: float("inf") for k in graph}
dist[start] = 0
heap = [(0, start)]
while heap:
d, u = heapq.heappop(heap)
if d > dist[u]:
continue
for v, gewicht in graph[u]:
neu = d + gewicht
if neu < dist[v]:
dist[v] = neu
heapq.heappush(heap, (neu, v))
return dist
Komplexität und Grenzen
- Laufzeit: mit einem Binär-Heap O((V + E) · log V) — V Knoten, E Kanten.
- Grenze: Bei negativen Kantengewichten liefert der Algorithmus falsche Ergebnisse; dann kommt der Bellman-Ford-Algorithmus zum Einsatz. Gegen negative Zyklen hilft auch der nicht.
- Verwandtschaft: Vom Ablauf her ähnelt der Algorithmus einer gewichteten Breitensuche, wie sie die Traversierung von Graphen beschreibt.