Was ist Dijkstra-Algorithmus?
Algorithmus, der in einem Graphen mit Kantengewichten größer oder gleich 0 die kürzesten Wege von einem Startknoten zu allen Knoten findet. Er legt wiederholt den nächstgelegenen Knoten, dessen Entfernung noch nicht feststeht, endgültig fest und aktualisiert die Entfernungen seiner Nachbarn. Bei negativen Kantengewichten arbeitet er nicht korrekt.
Japanische Bezeichnung: ダイクストラ法
„Dijkstra-Algorithmus“ kommt in 3 Übungsfragen aus 1 Themen vor, z. B. Datenstrukturen und Algorithmen.
Fachgebiet: Datenstrukturen und Algorithmen
Ablauf
Die Entfernung des Startknotens wird auf 0 und die aller anderen Knoten auf unendlich gesetzt, und kein Knoten gilt als festgelegt. Man wählt den nicht festgelegten Knoten mit der kleinsten Entfernung, legt ihn fest und aktualisiert für jede von ihm ausgehende Kante die Entfernung des Knotens am anderen Ende, wenn „festgelegte Entfernung + Kantengewicht“ kleiner als dessen aktuelle Entfernung ist (Relaxation). Das wird wiederholt, bis alle Knoten festgelegt sind. Wird bei jeder Aktualisierung der vorherige Knoten notiert, lässt sich der kürzeste Weg selbst anschließend zurückverfolgen.
Komplexität und Prioritätswarteschlangen
Jedes Mal alle Knoten nach dem Minimum zu durchsuchen, kostet bei V Knoten O(V²). Mit einer auf einem binären Heap beruhenden Prioritätswarteschlange sinkt das auf O((V + E) log V), wobei E die Zahl der Kanten ist; bei dünn besetzten Graphen wie Straßennetzen ist das deutlich schneller. Der Graph wird üblicherweise als Adjazenzlisten gespeichert. Navigationssysteme im Auto kombinieren ihn mit der A*-Suche, die eine Schätzung der Restentfernung addiert, um die Suche auf das Ziel auszurichten, und mit Beschleunigungsverfahren, die vorab berechnete Informationen nutzen.
Häufige Fragen
Wie hängt der Dijkstra-Algorithmus mit der Breitensuche zusammen?
Haben alle Kanten das Gewicht 1, legt der Dijkstra-Algorithmus die Knoten in derselben Reihenfolge fest wie die Breitensuche. Er lässt sich als Verallgemeinerung für unterschiedliche Gewichte verstehen, die die Warteschlange durch eine Prioritätswarteschlange ersetzt, die die kleinste Entfernung zuerst liefert.
Lässt sich der Dijkstra-Algorithmus auf gerichtete Graphen anwenden?
Ja. Solange die Gewichte größer oder gleich 0 sind, findet er korrekte kürzeste Wege in gerichteten und ungerichteten Graphen, auch in Graphen mit Zyklen.