Perché utilizzare l'algoritmo di Dijkstra se Breadth First Search (BFS) può fare la stessa cosa più velocemente?


110

Entrambi possono essere utilizzati per trovare il percorso più breve da un'unica fonte. BFS entra O(E+V), mentre Dijkstra entra O((V+E)*log(V)).

Inoltre, ho visto Dijkstra usato molto come nei protocolli di routing.

Quindi, perché usare l'algoritmo di Dijkstra se BFS può fare la stessa cosa più velocemente?

Risposte:


156

Dijkstra consente di assegnare distanze diverse da 1 per ogni passo. Ad esempio, nel routing le distanze (o pesi) potrebbero essere assegnate in base a velocità, costo, preferenza, ecc. L'algoritmo quindi ti fornisce il percorso più breve dalla tua sorgente a ogni nodo nel grafo attraversato.

Nel frattempo BFS fondamentalmente espande la ricerca di un "passo" (collegamento, bordo, qualunque cosa tu voglia chiamarlo nella tua applicazione) ad ogni iterazione, il che ha l'effetto di trovare il minor numero di passi necessari per arrivare a qualsiasi dato nodo dalla tua fonte ("root").


1
Entrambi produrranno gli stessi risultati, ovvero un percorso tra due vertici, ma solo dijkstra garantirà il percorso più breve.
Edwin

Vedi la risposta accettata, secondo commento. Molto bello modo di spiegare il motivo per cui la complessità computazionale è diverso: stackoverflow.com/questions/25449781/...
jmcarter9t

24

Se si considerano i siti web di viaggio, questi utilizzano l'algoritmo di Dijkstra a causa dei pesi (distanze) sui nodi.

Se considererai la stessa distanza tra tutti i nodi, BFS è la scelta migliore.

Ad esempio, considera A -> (B, C) -> (F)con i pesi dei bordi dati da A->B= 10, A->C= 20, B->F= C->F= 5.

Qui, se applichiamo BFS, la risposta sarà ABF o ACF, poiché entrambi sono percorsi più brevi (rispetto al numero di archi), ma se applichiamo Dijstra, la risposta sarà ABF solo perché considera i pesi sul connesso sentiero.



4

Dal punto di vista dell'implementazione, l'algoritmo di Dijkstra potrebbe essere implementato esattamente come un BFS scambiando il queuecon a priority queue.

fonte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.