web-dev-qa-db-fra.com

Bellman-Ford vs Dijkstra: Dans quelles circonstances Bellman-Ford est-il meilleur?

Après beaucoup de recherches sur Google, j'ai constaté que la plupart des sources disent que l'algorithme de Dijkstra est "plus efficace" que celui de Bellman-Ford. Mais dans quelles circonstances l'algorithme de Bellman-Ford est-il meilleur que l'algorithme de Dijkstra? 

Je sais que "mieux" est une déclaration large, donc je veux parler plus précisément de vitesse et d'espace, le cas échéant. Il existe sûrement une situation dans laquelle l'approche de Bellman-Ford est meilleure que celle de Dijkstra.

30
crazyCoder

L'algorithme Bellman-Ford est un algorithme de chemin le plus court à source unique. Ainsi, lorsque vous avez une épaisseur de bord négative, il peut détecter les cycles négatifs dans un graphique.

La seule différence entre les deux est que Bellman Ford est également capable de gérer des poids négatifs alors que l'algorithme de Dijkstra ne peut gérer que des positifs.

De wiki

Cependant, l'algorithme de Dijkstra sélectionne avec avidité le nœud de poids minimal qui n’a pas encore été traité et effectue ce processus de relaxation sur tous ses bords sortants; en revanche, l'algorithme Bellman-Ford détend simplement tous les bords, et le fait | V | - 1 fois, où | V | est le nombre de sommets dans le graphique. Dans chacune de ces répétitions, le nombre de sommets avec des distances correctement calculées augmente, à partir de il en résulte que tous les sommets auront finalement leur correct distances. Cette méthode permet d'appliquer l'algorithme Bellman – Ford à une classe d'entrées plus large que Dijkstra.

Dijkstra est toutefois généralement considéré comme meilleur en l’absence d’arêtes de poids négatif, puisqu’une implémentation typique de file d’attente prioritaire de tas binaire a une complexité temporelle O ((| E | + | V |) log | V |) [Une file d’attente prioritaire de tas de Fibonacci donne à O ( | V | log | V | + | E |)], alors que l'algorithme de Bellman-Ford a une complexité de O (| V || E |)

35
Rahul Tripathi

La seule différence est que l'algorithme de Dijkstra ne peut pas gérer les poids négatifs que Bellman-ford gère. Et Bellman-ford nous indique également si le graphique contient un cycle négatif . Si le graphique ne contient pas d'arêtes négatives, alors Dijkstra est toujours meilleur.

Une alternative efficace pour Bellman-ford est le Directed Acyclic Graph (DAG), qui utilise le tri topologique.

http://www.geeksforgeeks.org/shortest-path-for-directed-acyclic-graphs/

3
Rahul Bagad

Comme déjà indiqué dans la réponse choisie, Bellman-Ford effectue la vérification de tous les sommets, Dijkstra uniquement de celui ayant la meilleure distance calculée jusqu'à présent. Encore une fois, cela améliore la complexité de l’approche de Dijkstra, mais il est nécessaire de comparer tous les nœuds pour déterminer la valeur de distance minimale. Comme cela n’est pas nécessaire dans le Bellman-Ford, il est plus facile de le mettre en œuvre dans un environnement distribué. C'est pourquoi il est utilisé dans les protocoles de routage à vecteur de distance (par exemple, RIP et IGRP), qui utilisent principalement des informations locales. Pour utiliser Dijkstra dans les protocoles de routage, il est d'abord nécessaire de distribuer toute la topologie. C'est ce qui se passe dans les protocoles d'état des liens, tels que OSPF et ISIS.

1
Halberdier

Dijkstra Algo
Dijkstra algo n'est pas capable de différencier entrele cycle de pondération du bord négatifest présent dans le graphique ou non

1. Poids de l'arête positive: - Dijkstra toujours PASSERsi tout le poids de l'arête dans un graphique est positif
2. Bord négatif poids et No -ve Edge wt. cycle: - Dijkstra toujours PASSERmême si nous avons des arêtes dont le poids est négatif, mais AUCUN cycle/boucle dans le graphique ayant un poids d'arête négatif.
[i.e aucun cycle de poids de bord négatif est présent]
3. Bord négatif poids et -ve Edge wt. cycle: - Dijkstra may PASS/FAIL même si nous avons des arêtes dont le poids est négatif ainsi que cycle/boucle dans le graphique ayant un poids d'arête négatif.

0
Ajay Kharat