Les deux peuvent être utilisés pour trouver le chemin le plus court à partir d'une seule source. BFS s'exécute dans O(E+V)
, tandis que Dijkstra s'exécute dans O((V+E)*log(V))
.
De plus, j'ai vu Dijkstra beaucoup utilisé comme dans les protocoles de routage.
Ainsi, pourquoi utiliser l'algorithme de Dijkstra si BFS peut faire la même chose plus rapidement?
Dijkstra permet d'attribuer des distances autres que 1 pour chaque étape. Par exemple, lors du routage, les distances (ou poids) peuvent être affectées par la vitesse, le coût, la préférence, etc. L'algorithme vous donne alors le chemin le plus court de votre source à chaque nœud du graphique traversé.
Pendant ce temps, BFS élargit simplement la recherche d'une "étape" (lien, Edge, quel que soit le nom que vous souhaitez l'appeler dans votre application) à chaque itération, ce qui a pour effet de trouver la plus petite nombre d'étapes = il faut pour accéder à n'importe quel nœud donné à partir de votre source ("racine").
Si vous envisagez des sites Web de voyage, ceux-ci utilisent l'algorithme de Dijkstra en raison des poids (distances) sur les nœuds.
Si vous considérez la même distance entre tous les nœuds, alors BFS est le meilleur choix.
Par exemple, considérons A -> (B, C) -> (F)
avec les poids de bord donnés par A->B
= 10, A->C
= 20, B->F
= C->F
= 5.
Ici, si nous appliquons BFS, la réponse sera ABF ou ACF, car les deux sont les chemins les plus courts (en ce qui concerne le nombre d'arêtes), mais si nous appliquons Dijstra, la réponse sera ABF uniquement parce qu'elle prend en compte les poids sur le connecté chemin.
L'algorithme de Dijkstra
Du point de vue de l'implémentation, l'algorithme de Dijkstra pourrait être implémenté exactement comme un BFS en échangeant le queue
avec un priority queue
.