Der unterschied zwischen dijkestra und bellmannford

  • Ich habe die drei studiert und führe meine Schlussfolgerungen aus ihnen unten aus. Kann mir jemand sagen, ob ich sie richtig genug verstanden habe oder nicht? Dankeschön.


    1. Dijkstra - Algorithmus wird nur dann verwendet , wenn Sie eine Hand haben , und Sie wollen den kleinsten Pfad von einem Knoten zum anderen kennen, aber nicht in Fällen wie diesem .


    2. Der Floyd-Warshall-Algorithmus wird verwendet, wenn einer der Knoten eine Quelle sein kann, sodass Sie möchten, dass die kürzeste Entfernung jeden Zielknoten von jedem Quellknoten erreicht. Dies scheitert nur bei negativen Zyklen.


    3. Bellman-Ford wird wie Dijkstra verwendet, wenn es nur eine Quelle gibt. Dies kann mit negativen Gewichtungen umgehen und funktioniert bis auf eine Quelle genauso wie Floyd-Warshall, oder? (Bei diesem bin ich mir am wenigsten sicher.)


    22 Punkte 1 Bemerkungen Teilen


  • Der Algorithmus von Dijkstra wird nur verwendet, wenn Sie eine einzelne Quelle haben und den kleinsten Pfad von einem Knoten zum anderen wissen möchten, aber scheitert

    [in Graphen mit negativen Kanten]


Der Dijkstra-Algorithmus ist ein Beispiel für einen Single-Source-Shortest- Path- oder SSSP- Algorithmus. Jeder SSSP-Algorithmus berechnet die kürzesten Wegstrecken von einem ausgewählten Quellknoten $s$ zu jedem anderen Knoten im Graphen. Darüber hinaus berechnet es eine kompakte Darstellung aller kürzesten Pfade von $s$ zu jedem anderen Knoten in Form eines Wurzelbaums. Ist im Wikipedia-Code previous[v]das übergeordnete Element von $v$ in diesem Baum.

Das Verhalten des Dijkstra-Algorithmus in Graphen mit negativen Kanten hängt von der genauen diskutierten Variante ab. Einige Varianten des Algorithmus, wie die in Wikipedia, laufen immer schnell, berechnen aber bei negativen Kanten die kürzesten Wege nicht korrekt. Andere Varianten, wie die in Jeff Ericksons Vorlesungsnotizen, berechnen kürzeste Pfade immer korrekt (es sei denn, es ist ein negativer Zyklus von der Quelle aus erreichbar), können aber im schlimmsten Fall exponentielle Zeit benötigen, wenn negative Flanken vorhanden sind.


Der Algorithmus von Floyd-Warshall wird verwendet, wenn einer von allen Knoten eine Quelle sein kann, sodass Sie die kürzeste Entfernung wünschen, um jeden Zielknoten von jedem Quellknoten zu erreichen . Dies scheitert nur bei negativen

Zyklen.


Das ist richtig. Floyd-Warshall ist ein Beispiel für einen All-pairs-shortest-path-Algorithmus , d. h. er berechnet die kürzesten Pfade zwischen jedem Knotenpaar. Ein weiteres Beispiel ist "Führen Sie für jeden Knoten v Dijkstra mit v als Quellknoten aus". Es gibt mehrere andere.


Bellman-Ford wird wie das von Dijkstra verwendet, wenn es nur eine Quelle gibt. Dies kann mit negativen Gewichtungen umgehen und funktioniert

bis auf eine Quelle genauso wie die von Floyd-Warshall, oder?


Bellman-Ford ist ein weiteres Beispiel für einen Single-Source- Shortest-Path-Algorithmus wie Dijkstra. Bellman-Ford und Floyd-Warshall sind ähnlich – zum Beispiel sind sie beide dynamische Programmieralgorithmen – aber Floyd-Warshall ist nicht derselbe Algorithmus wie „für jeden Knoten v, führen Sie Bellman-Ford mit v als Quellknoten aus“. Insbesondere läuft Floyd-Warshall in $O(V^3)$- Zeit, während wiederholtes Bellman-Ford in $O(V^2E)$- Zeit läuft ( $O(VE)$- Zeit für jeden Quellknoten).

Weitere Informationen finden Sie in Ihrem bevorzugten Lehrbuch für Algorithmen. (Du hast doch ein Lieblingsalgorithmuslehrbuch, nicht wahr?)

28 Punkte 3 Bemerkungen Teilen

  • Die Wikipedia-Seite zum Shortest-Path-Problem beschreibt zwei verschiedene Probleme: SSSP und APSP.

    Kürzester Pfad aus einer Quelle (SSSP):


    • Der Algorithmus von Dijkstra: löst das Single-Source-Kurzester-Weg-Problem.


      • Einschränkungen: Nur negative Kanten können nicht verarbeitet werden.



      • Ungewichtete Graphen: Dijkstras ist das gleiche wie BFS.


    • Bellman-Ford-Algorithmus: löst das Single-Source-Problem, wenn Kantengewichte negativ sein können. Dies ist eine Verbesserung gegenüber Dijkstra, wo jetzt auch negative Gewichtungen verarbeitet werden können.


    Alle Paare kürzester Pfad (APSP):


    • Floyd-Warshall-Algorithmus: löst alle Paare kürzester Pfade. Verarbeitet sowohl positive als auch negative Flanken.


      • Einschränkungen: Kann negative Zyklen nicht verarbeiten.


    Daher ist Floyd-Warshall nicht dasselbe wie BFS, obwohl die zugrunde liegende Methodik dieselbe, dynamische Programmierung ist.

    2 Punkte 0 Bemerkungen Teilen

  • Vielleicht sollte dies eher ein Kommentar als eine Antwort sein, aber es ist ein Unterschied zwischen diesen Algorithmen, den andere Antworten nicht erwähnen.

    Die Leute neigen dazu, Floyds Algorithmus Floyd-Warshall zu nennen , aber die Algorithmen von Floyd und Warshall sind nicht gleich.

    Der Artikel von Warshall stellt fest, dass, wenn Sie den Floyd-Algorithmus auf eine binäre Inzidenzmatrix anwenden, Sie eine Matrixmultiplikation durchführen; Daher kann es tatsächlich so implementiert werden, und wenn Sie zB die Vektormultiplikation in $O(1)$ durchführen können, wird Ihr Algorithmus zu $O(n^2)$.

    1 Punkte 0 Bemerkungen Teilen

  • Shortest Path Algorithm: kürzester Weg Algorithmus ist in der Graphentheorie untersucht, ein klassischen Algorithmus Problem, Fig das Ziel, den kürzesten Weg zwischen zwei Knoten zu finden (ein Knoten und einem Weg aus).

    Bestimmen , um den Startpunkt des kürzesten Weges Problem: die bekannten Startpunkt, den kürzesten Weg Problem. Dijkstra-Algorithmus zum Einsatz, (das Single-Source kürzesten Weg)

    Globales kürzester Weg Problem: Finde den kürzesten Weg , um alle Figuren, geeignet für Floyed-Warshall - Algorithmus, (Multi-Source kürzester Weg)

    Single-Source kürzester Weg: Bei einem gewichteten gerichteten Graphen G = V, E, wobei jede Kante eine reelle Zahl ist. Ferner ist ein Rückartikulationssatz V bezeichnete Quelle, Quelle zu berechnen , von der Länge des kürzesten Pfades zu allen anderen Ecken. Dies bedeutet , dass jede Länge der rechten Seite und die Straße. Dieses Problem wird in der Regel als Single-Source kürzester Weg Problem bezeichnet;

    Dijkstra-Algorithmus : DijkstraAlgorithmus gierige Ideedass die aktuelle WahlLösung ist immer die beste Lösung in Frage, der Algorithmus verwendetdas Single-Source kürzesten Weg Problem zu lösen kann negative Gewichte nicht umgehen, kann nur für die rechte Figur positiv sein ; Algorithmus greedyStrategie, von s0 Start, unvisited V wählen[i] von s0 nächsten einem Punkt i, die die kleinsten D [i] sind, und i ist als Zwischenpunkt, das Update durch i, kann den Punkt erreichender kürzeste Abstand, gierig weiterhin die nächstgelegene Punkt unvisited zu finden,nach n gierig, alle Zugangspunkte abgeschlossen ist,der Algorithmus beendet, der kürzeste Abstand zwischen Start- und Endpunkten der Ausgabe;

    • Initialisierung d [s0] = 0, sonst d [i] = INF;
    • Nach n gierigen, finde den kürzesten Abstand von dem Ausgangspunkt s0 auf andere Punkte;
    • Greedy:
      • Identifizieren mindestens unvisited d [K];
      • K-Flag V besucht [k];
      • K ist als ein Zwischenpunkt, den Startpunkt s0 zu aktualisieren, durch die andere von v k D [v]; Array Pfadverfolgung aktualisieren kann, der kürzeste Aufzeichnungsstrom von [v] = k, von dem Knoten;
    • Der Unterschied zwischen Prim-Algorithmus und Greedy-Algorithmus:
      • Prim-Algorithmus: die Gruppe von Markierungen Aktualisierung ist nicht auf den Abstand zwischen dem markierten gesetzt;
      • Dijkstra-Algorithmus: die Quelle der Aktualisierung wird auf einen Abstand zwischen dem Flügel;
    • Dijkstra-Algorithmus kann verwendet werden, Heap-Optimierung: Heap-Optimierung, Kern Dijkstra-Algorithmus ist es, zunächst den Mindestabstand zu finden, und dann aktualisieren, wenn nicht optimiert sind wir hier den Mindestabstand durch den Zyklus zu finden, wir die Prioritätswarteschlange zu optimieren können ; C ++ hat std :: priority_queue Behälteradapter verwendet werden kann; Heap werden Prioritätswarteschlange im allgemeinen den Haufen zu optimieren betrachtet zu implementieren, kann es verwendet werden;

    Der unterschied zwischen dijkestra und bellmannford

    Floyed Algorithmus: Floyed Algorithmus,auch als Interpolationspunkt Verfahren bekannt, Idee des dynamischen Programmieralgorithmus verwendetden kürzesten Weg zu einer gegebenen Gewichtung zwischen mehreren Quellen Abbildung zu finden, das Multi-SourceVerfahren kürzesten erhalten werden kann, kann negativ hand die rechte Seite des Gehäuses , aber nicht negativ Ring, die Idee, einen dynamischen Programmieralgorithmus verwendet;

    • Set D [i] [j] [k] die i bis j nach nur 1,2, .. k, wenn diese Knoten, der kürzeste Weg i bis j. Es werden die folgenden zwei Situationen:
      • Nach dem Punkt k: D [i] [j] [k] = D [i] [k] [k-1] + d [k] [j] [k-1];
      • Nicht durch den Punkt k passieren: d [i] [j] [k] = D [i] [j] [k-1];
    • Zustandsübergangsgleichung ist: D [i] [j] [k] = min {d [i] [j] [k-1], d [i] [k] [k-1] + d [k] [j ] [k-1]}
    • Randbedingungen: d [i] [j] [0] = w [i] [j], (w [i] [j] bezeichnet Gewichte ij Kante Kantengewichte das Fehlen eines positiven infinity darstellen)
    • Da k inkrementiert wird, d [i] [j] d Zustand gespeichert wird [i] [j] [k-1] kann durch eindimensionalen, zweidimensionalen Array reduziert werden:
      • Zustandsübergangsgleichung: d [i] [j] = min {d [i] [k] + d [k] [j], D [i] [j]};
      • Randbedingungen: d [i] [j] = w [i] [j];
      • Enumeration k, k aktualisiert wird von i nach j den Mittelpunkt kürzesten Abstand verwendet wird;

    Bellman-Ford - Algorithmus: Bellman FordAlgorithmus ist ein Single-Source kürzester Weg Algorithmus; DijkstraAlgorithmus ist es relativ negative Gewichte für Bedingungen behandelt werden können: kein negativer Ring, einfach, aber die Zeit Komplexität ist hoch, kann verwendet werden , um zu bestimmen , ob es Negativschleife , jede Iteration des kürzesten Weg zum Ausgangspunkt jeden Knotensaktualisieren; (n-1 ist zwischen den Kanten 6 Punkten) Wenn die Iteration n-1 mal, wieder gibt es eine Weg Update Iteration, dann gibt es einen negativen Ring;

    Algorithm denkt: ein beliebigen der kürzesten Balkendiagramm, weder enthalten negative Zyklen, wird es nicht enthalten ist , die rechte Schleife, die bis zu n-1 Rand. Dann wird von dem Quellenpunkt S beginnt, kann der Knoten erreicht werden, wenn der kürzeste ist, der kürzeste Weg einen kürzesten s Wurzelbaum zu bilden. Somit wird in Übereinstimmung mit der Wurzel der Entfernung s von der Ebene, Schicht für Schicht erzeugt die kürzesten jeden Punkt (Ruhebetrieb) erreichen, weshalb der Prozess, ist der kürzeste Weg Baumerzeugungsprozess, erfordert einen Hilfsarray von d [n] und v [n] und der kürzeste Abstand zu dem Verfolgungsaufzeichnungsspur, betrachten aus der Perspektive der Kante, jede Kante jede Iteration zu durchqueren, den Zyklus n-1 mal, wenn der n-ten Zyklus allen d [n] Wert wird nicht aktualisiert, aus der Schleife , und wenn es die n-ten Weg zu aktualisieren, um das Vorhandensein eines negativen Ring angibt; der Bellman-Ford - Algorithmus den längsten Weg zu lösen , kann wie der Ring, solange das ausgewählten maximalen Aktualisierungs Rekursionsrelation zu bestimmen , n und verwendet werden;

    Algorithmus Umsetzungsprozess:

    • Initial: dist [u] = INF; dist [s] = 0; s ist der Ausgangspunkt;
    • Rekursion: Für jede Kante (u, v) Entspannungsbetrieb; dist [v] = min (dist [v], dist [u] + w [u] [v]); (n-1 arbeitet als Relaxationszeiten ) 
    • Schließlich Umlaufzeit, bestimmt, ob ein negativer Ring ist;

    SPFA Algorithmus: SPFA (Shortest den Pfad FASTERAlgorithmus); Bellman-FordAlgorithmusoben beschrieben, die ZeitKomplexität des Algorithmus ist relativ hoch; Bellman-FordAlgorithmus rekursiv n Zeiten erfordert, wobei jede rekursive notwendigalle Seiten zu scannen; jedoch jeder Schlaff Operationen nicht alle von der lockeren Seite benötigen, müssen nur die aktuellste Seite zu kurzen Ruhepunkt verbunden finden, daher die Verwendung von Warteschlangen,jedem Punkt aus dem Update nicht in einer Warteschlange istWarteschlange eingereiht,jeweils aus einer Warteschlange genommen Vertex-, alle seine benachbarten Knoten Entspannung, Entspannung Erfolgwenn ein Scheitelpunkt, wie beispielsweise der Rückkehrpunkt istin der Warteschlange nicht, wirdWarteschlange eingereiht, solche Operationen wiederholt werden, bis die Warteschlange leer ist,wenn die Anzahl von Malen ein Knoten enqueue mehr als nmal,die Anwesenheit der negativen Zyklen angibt; kann eine CNT [n] -Array zum Zählen verwendet;

    Algorithmus Umsetzungsprozess:

    • Initialisierung: dis [s] = 0; dis [i] = INF; Erstellen einer neuen Warteschlange enqueue der Quellknoten s, s Zeichen wurden die Warteschlange eingereiht;
    • Entfernen einen Punkt aus der ersten Mannschaft u, u-Flag aus der Warteschlange entfernt worden ist, und wird den Kantenpunkt verbunden wird u v Entspannungsvorgang, und v ist nicht erfolgreich, wenn das Spiel in der Warteschlange, die Warteschlange eingereiht dann V;
    • Wiederholen, bis die Warteschlange leer ist;

    Zeitkomplexität Analyse:

    • Floyed Algorithmus: such Multi-Source - kürzest möglichen Bearbeitungslastseite; Zeitkomplexität von O (N 3);
    • Dijkstra-Algorithmus: Hand kürzeste sucht, nicht verarbeiten kann negative Flanke; Zeitkomplexität von O (n 2);
    • Bellman-Ford-Algorithmus: such Hand kürzestmögliche Verarbeitungslast der rechte Seite; die Zeitkomplexität O (NM);
    • SPFA Algorithmus: such Hand kürzeste, Bellman-Ford Optimierungsalgorithmus Version kann negativ rechte Seite behandeln, die Zeitkomplexität O (kM) ~ O (NM ); k eine kleine Konstante ist;

    Bitte beachten Sie den Code zu erreichen: https://github.com/yaowenxu/codes/tree/master/ kürzester Weg Algorithmus

    Auf dem neuesten Stand, bitte die Quelle, für weitere Informationen wenden Sie sich bitte Aufmerksamkeit cnblogs.com/xuyaowen; 

    Referenzen:

    Shortest Path Problem  vier am kürzesten Weg Algorithmus  Dijkstra - Algorithmus  Floyd - Algorithmus   Unterschied zwischen Prim und Dijkstra - Algorithmus  Bellman-Ford - Algorithmus  SPFA Algorithmus 

    Origin www.cnblogs.com/xuyaowen/p/shortest-path-algos.html