DAA - Kürzeste Wege
Dijkstra-Algorithmus
Der Dijkstra-Algorithmus löst das Problem der kürzesten Wege aus einer Hand in einem gerichteten gewichteten Graphen G = (V, E) , wobei alle Kanten nicht negativ sind (dh w (u, v) ≥ 0 für jede Kante (u, v) ) Є E ).
Im folgenden Algorithmus verwenden wir eine Funktion Extract-Min(), der den Knoten mit dem kleinsten Schlüssel extrahiert.
Algorithm: Dijkstra’s-Algorithm (G, w, s)
for each vertex v Є G.V
v.d := ∞
v.∏ := NIL
s.d := 0
S := Ф
Q := G.V
while Q ≠ Ф
u := Extract-Min (Q)
S := S U {u}
for each vertex v Є G.adj[u]
if v.d > u.d + w(u, v)
v.d := u.d + w(u, v)
v.∏ := u
Analyse
Die Komplexität dieses Algorithmus hängt vollständig von der Implementierung der Extract-Min-Funktion ab. Wenn die Funktion zum Extrahieren von min mithilfe der linearen Suche implementiert wird, ist die Komplexität dieses AlgorithmusO(V2 + E).
Wenn wir in diesem Algorithmus Min-Heap verwenden, auf dem Extract-Min() Funktion gibt den Knoten von zurück Q Mit dem kleinsten Schlüssel kann die Komplexität dieses Algorithmus weiter reduziert werden.
Beispiel
Betrachten wir den Scheitelpunkt 1 und 9als Start- bzw. Zielscheitelpunkt. Zu Beginn sind alle Scheitelpunkte außer dem Startscheitelpunkt mit ∞ und der Startscheitelpunkt mit gekennzeichnet0.
Scheitel | Initiale | Schritt 1 V 1 | Schritt 2 V 3 | Schritt 3 V 2 | Schritt 4 V 4 | Schritt 5 V 5 | Schritt 6 V 7 | Schritt 7 V 8 | Schritt 8 V 6 |
---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | ∞ | 5 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
3 | ∞ | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
4 | ∞ | ∞ | ∞ | 7 | 7 | 7 | 7 | 7 | 7 |
5 | ∞ | ∞ | ∞ | 11 | 9 | 9 | 9 | 9 | 9 |
6 | ∞ | ∞ | ∞ | ∞ | ∞ | 17 | 17 | 16 | 16 |
7 | ∞ | ∞ | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
8 | ∞ | ∞ | ∞ | ∞ | ∞ | 16 | 13 | 13 | 13 |
9 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | 20 |
Daher der minimale Abstand des Scheitelpunkts 9 vom Scheitelpunkt 1 ist 20. Und der Weg ist
1 → 3 → 7 → 8 → 6 → 9
Dieser Pfad wird basierend auf Vorgängerinformationen bestimmt.
Bellman Ford Algorithmus
Dieser Algorithmus löst das Problem des kürzesten Wegs einer einzelnen Quelle eines gerichteten Graphen G = (V, E)bei denen die Kantengewichte negativ sein können. Darüber hinaus kann dieser Algorithmus angewendet werden, um den kürzesten Weg zu finden, wenn kein negativ gewichteter Zyklus existiert.
Algorithm: Bellman-Ford-Algorithm (G, w, s)
for each vertex v Є G.V
v.d := ∞
v.∏ := NIL
s.d := 0
for i = 1 to |G.V| - 1
for each edge (u, v) Є G.E
if v.d > u.d + w(u, v)
v.d := u.d +w(u, v)
v.∏ := u
for each edge (u, v) Є G.E
if v.d > u.d + w(u, v)
return FALSE
return TRUE
Analyse
Der Erste for Die Schleife wird für die Initialisierung verwendet, die in ausgeführt wird O(V)mal. Der nächstefor Schleife läuft |V - 1| geht über die Kanten, die dauertO(E) mal.
Daher läuft der Bellman-Ford-Algorithmus ein O(V, E) Zeit.
Beispiel
Das folgende Beispiel zeigt Schritt für Schritt, wie der Bellman-Ford-Algorithmus funktioniert. Dieser Graph hat eine negative Flanke, aber keinen negativen Zyklus, daher kann das Problem mit dieser Technik gelöst werden.
Zum Zeitpunkt der Initialisierung sind alle Eckpunkte außer der Quelle mit ∞ und die Quelle mit gekennzeichnet 0.
Im ersten Schritt werden alle Eckpunkte, die von der Quelle aus erreichbar sind, zu minimalen Kosten aktualisiert. Daher Eckpunktea und h werden aktualisiert.
Im nächsten Schritt Scheitelpunkte a, b, f und e werden aktualisiert.
Nach der gleichen Logik werden in diesem Schritt Eckpunkte verwendet b, f, c und g werden aktualisiert.
Hier Eckpunkte c und d werden aktualisiert.
Daher der minimale Abstand zwischen dem Scheitelpunkt s und Scheitelpunkt d ist 20.
Basierend auf den Vorgängerinformationen lautet der Pfad s → h → e → g → c → d