Dijkstra-Algorithmus Rechner

Gewichteter Graph · Kürzeste Distanzen ab Startknoten · Schrittweise Algorithmus-Verfolgung · Pfad-Visualisierung

Eingabe:
Graphtyp:

Beispiel: A B 5 = Kante von A nach B mit Gewicht 5. Knotennamen können Buchstaben oder Zahlen sein.

Schnellbeispiele

Einfaches Netzwerk

5 Knoten · 7 Kanten · ungerichtet

Stadtstraßen

8 Knoten · gerichtet · S → T

Klassischer Graph

6 Knoten · ungerichtet · Startknoten 1

Was ist der Dijkstra-Algorithmus?

Der Dijkstra-Algorithmus ist einer der bekanntesten Algorithmen der Informatik. Er wurde 1956 vom niederländischen Informatiker Edsger W. Dijkstra entwickelt und 1959 veröffentlicht. Er löst das Single-Source-Shortest-Path-Problem für einen gewichteten Graphen mit nicht-negativen Kantengewichten. Ausgehend von einem Startknoten berechnet der Algorithmus den kostengünstigsten Weg von diesem Startknoten zu jedem anderen Knoten im Graphen.

Der Algorithmus ist ein klassisches Beispiel für eine gierige (greedy) Strategie: In jedem Schritt wird der unbesuchte Knoten mit der aktuell kleinsten bekannten Distanz ausgewählt und anschließend genutzt, um die bekannten Distanzen zu seinen Nachbarknoten zu verbessern. Dieser Vorgang wird als Relaxation bezeichnet.

Wie der Dijkstra-Algorithmus funktioniert

  1. Alle Distanzen werden auf Unendlich initialisiert, außer der Startknoten, der auf 0 gesetzt wird.
  2. Alle Knoten werden als unbesucht markiert. Alle Knoten werden in eine Menge unbesuchter Knoten aufgenommen.
  3. Der unbesuchte Knoten u mit der kleinsten vorläufigen Distanz wird ausgewählt.
  4. Für jeden unbesuchten Nachbarn v von u wird alt = dist[u] + weight(u, v) berechnet.
  5. Falls alt < dist[v], wird dist[v] = alt aktualisiert und prev[v] = u gespeichert.
  6. u wird als besucht markiert (aus der Menge der unbesuchten Knoten entfernt).
  7. Wiederholen ab Schritt 3, bis alle Knoten besucht sind oder der Zielknoten erreicht wurde.

Um den Weg zu einem beliebigen Knoten zu rekonstruieren, wird das prev[]-Array vom Zielknoten zurück bis zum Startknoten verfolgt.

Beispiel für den Dijkstra-Algorithmus

Betrachten wir das Beispiel „Einfaches Netzwerk" mit 5 Knoten (A–E) und folgenden Kanten: A-B=4, A-C=2, B-C=1, B-D=5, C-D=8, C-E=10, D-E=2. Ausgehend von A:

SchrittBesuchenddist[A]dist[B]dist[C]dist[D]dist[E]
Start—0∞∞∞∞
1A042∞∞
2C0321012
3B032812
4D032810
5E032810

Endgültige kürzeste Distanzen ab A: B=3 (A→C→B), C=2 (A→C), D=8 (A→C→B→D), E=10 (A→C→B→D→E).

Analyse der Zeitkomplexität

ImplementierungZeitkomplexitätSpeicherAm besten geeignet für
Array / naivO(V²)O(V)Dichte Graphen
Binärer HeapO((V + E) log V)O(V + E)Dünnbesetzte Graphen
Fibonacci-HeapO(E + V log V)O(V + E)Theoretisches Optimum

Dieser Rechner verwendet die O(V²)-Array-Implementierung, die für Graphen mit bis zu 15 Knoten vollkommen effizient ist.

Wann sollte man den Dijkstra-Algorithmus statt anderer Algorithmen verwenden?

AlgorithmusNegative GewichteEinzelner StartknotenAlle KnotenpaareKomplexität
DijkstraNeinJaNeinO(V²) oder O(E log V)
Bellman-FordJaJaNeinO(VE)
Floyd-WarshallJaNeinJaO(V³)
A*-SucheNeinJa (einzelnes Ziel)NeinO(E log V) mit Heuristik
BFSEntfällt (ungewichtet)JaNeinO(V + E)

Anwendungen in der Praxis

  • GPS-Navigation: Ermittlung der schnellsten oder kürzesten Route zwischen zwei Orten in einem Straßennetz.
  • Netzwerk-Routing: Internet-Router verwenden Varianten des Dijkstra-Algorithmus (OSPF-Protokoll), um den besten Pfad für Datenpakete zu bestimmen.
  • Pfadfindung in Spielen: NPC-Charaktere in Videospielen navigieren mithilfe des Dijkstra-Algorithmus oder seiner heuristischen Variante A* durch das Gelände.
  • Logistik & Lieferkette: Optimierung von Lieferrouten zur Minimierung von Distanz oder Kosten.
  • Soziale Netzwerke: Ermittlung der kürzesten Verbindungskette zwischen zwei Personen (Trennungsgrade).
  • Flugroutenplanung: Berechnung der kostengünstigsten Reiseroute zwischen zwei Flughäfen.

Häufig gestellte Fragen

Was ist der Dijkstra-Algorithmus?
Der Dijkstra-Algorithmus ist ein gieriger (greedy) Kürzester-Wege-Algorithmus, der 1956 von Edsger W. Dijkstra entwickelt wurde. Er findet den kürzesten (gewichtsminimalen) Weg von einem einzelnen Startknoten zu allen anderen Knoten in einem gewichteten Graphen mit nicht-negativen Kantengewichten. Dabei wird wiederholt der unbesuchte Knoten mit der kleinsten vorläufigen Distanz ausgewählt und anschließend werden seine Nachbarknoten aktualisiert (Relaxation).
Welche Einschränkungen hat der Dijkstra-Algorithmus?
Der Dijkstra-Algorithmus funktioniert nicht korrekt bei negativen Kantengewichten — er kann falsche Ergebnisse liefern. Wenn Ihr Graph negative Gewichte enthält, verwenden Sie stattdessen den Bellman-Ford-Algorithmus. Der Dijkstra-Algorithmus funktioniert sowohl auf gerichteten als auch auf ungerichteten Graphen, solange alle Gewichte ≥ 0 sind.
Wie hoch ist die Zeitkomplexität des Dijkstra-Algorithmus?
Die naive, array-basierte Implementierung läuft in O(V²), wobei V die Anzahl der Knoten ist. Mit einem binären Min-Heap (Prioritätswarteschlange) verbessert sich dies auf O((V + E) log V). Das theoretische Optimum ist O(E + V log V) mit einem Fibonacci-Heap. Für kleine Graphen (≤15 Knoten) ist der O(V²)-Ansatz völlig ausreichend schnell.
Wie gebe ich einen Graphen in den Rechner ein?
Verwenden Sie den Tab „Kantenliste" und geben Sie eine Kante pro Zeile im Format Von Nach Gewicht ein. Zum Beispiel erzeugt A B 5 eine Kante zwischen A und B mit Gewicht 5. Knotennamen können beliebige Buchstaben oder Zahlen sein. Alternativ können Sie den Tab „Adjazenzmatrix" für eine visuelle Rastereingabe nutzen.
Was ist der Unterschied zwischen gerichteten und ungerichteten Graphen?
In einem gerichteten Graphen erlaubt eine Kante von A nach B nur die Reise von A nach B. In einem ungerichteten Graphen funktioniert jede Kante in beide Richtungen — A-B erlaubt die Reise A→B und B→A. Der Dijkstra-Algorithmus funktioniert bei beiden Typen, aber die resultierenden kürzesten Wege können sich je nach Kantenrichtung deutlich unterscheiden.
Kann der Dijkstra-Algorithmus mit nicht zusammenhängenden Graphen umgehen?
Ja. Wenn ein Knoten vom Startknoten aus nicht erreicht werden kann, bleibt seine kürzeste Distanz bei ∞ (Unendlich). Der Dijkstra-Algorithmus behandelt nicht zusammenhängende Graphen problemlos — der Algorithmus aktualisiert unerreichbare Knoten einfach nicht weiter, und sie erscheinen mit Distanz ∞ in der Ergebnistabelle.
Was ist der Unterschied zwischen dem Dijkstra-Algorithmus und BFS?
Die Breitensuche (BFS) findet den kürzesten Weg in einem ungewichteten Graphen und minimiert dabei die Anzahl der Kanten (Sprünge). Sie läuft in O(V+E). Der Dijkstra-Algorithmus verallgemeinert BFS auf gewichtete Graphen und minimiert das Gesamtkantengewicht. BFS ignoriert Gewichte vollständig — verwenden Sie sie nur, wenn alle Kanten gleich gewichtet sind. Verwenden Sie den Dijkstra-Algorithmus, wenn Kanten unterschiedliche Kosten haben.