Warum den Dijkstra-Algorithmus verwenden, wenn Breadth First Search (BFS) dasselbe schneller ausführen kann?


109

Beide können verwendet werden, um den kürzesten Weg aus einer Hand zu finden. BFS läuft ein O(E+V), während Dijkstra einläuft O((V+E)*log(V)).

Außerdem habe ich gesehen, dass Dijkstra ähnlich wie in Routing-Protokollen verwendet wird.

Warum also den Dijkstra-Algorithmus verwenden, wenn BFS dasselbe schneller kann?

Antworten:


156

Mit Dijkstra können Sie jedem Schritt andere Entfernungen als 1 zuweisen. Beim Routing können die Entfernungen (oder Gewichte) beispielsweise nach Geschwindigkeit, Kosten, Präferenz usw. zugewiesen werden. Der Algorithmus gibt Ihnen dann den kürzesten Weg von Ihrer Quelle zu jedem Knoten im durchquerten Diagramm.

In der Zwischenzeit erweitert BFS die Suche bei jeder Iteration im Grunde genommen nur um einen „Schritt“ (Link, Kante, wie auch immer Sie sie in Ihrer Anwendung nennen möchten), was dazu führt, dass die kleinste Anzahl von Schritten gefunden wird, die erforderlich sind , um zu einem Schritt zu gelangen gegebener Knoten von Ihrer Quelle ("root").


1
Beide liefern die gleichen Ergebnisse, dh einen Pfad zwischen zwei Eckpunkten, aber nur dijkstra garantiert den kürzesten Pfad.
Edwin

Siehe die akzeptierte Antwort, zweiter Kommentar. Sehr schöne Art zu erklären, warum die Rechenkomplexität unterschiedlich ist: stackoverflow.com/questions/25449781/…
jmcarter9t

23

Wenn Sie Reisewebsites in Betracht ziehen, verwenden diese den Dijkstra-Algorithmus aufgrund von Gewichten (Entfernungen) auf Knoten.

Wenn Sie den gleichen Abstand zwischen allen Knoten berücksichtigen, ist BFS die bessere Wahl.

Betrachten Sie zum Beispiel A -> (B, C) -> (F)mit Kantengewichten gegeben durch A->B= 10, A->C= 20, B->F= C->F= 5.

Wenn wir hier BFS anwenden, lautet die Antwort ABF oder ACF, da beide kürzeste Wege sind (in Bezug auf die Anzahl der Kanten). Wenn wir jedoch Dijstra anwenden, lautet die Antwort nur ABF, da die Gewichte auf der Verbindung berücksichtigt werden Pfad.



4

Aus Sicht der Implementierung könnte der Dijkstra-Algorithmus genau wie ein BFS implementiert werden, indem der queuemit einem ausgetauscht wird priority queue.

Quelle

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.