web-dev-qa-db-fra.com

différence entre l'algorithme de Bellman Ford et celui de Dijkstra

   2           1
1----------2---------4
|          |         |
|3         |3        |1
|    6     |         |
3---------5 ---------

Ok, donc c'est le graphique. Mon noeud source est 1 et mon noeud de destination est 5

Ma question est.

Les deux algorithmes vont-ils donner le même résultat ou non? Autrement dit, les deux renverront-ils 1->2->4->5? (Sauf que les poids négatifs ne sont pas autorisés dans les dijkstra)

Merci d'avance pour votre aide.

12
Gaurav Gandhi

L'algorithme Bellman-Ford est un algorithme de chemin le plus court à source unique, qui permet d'obtenir un poids de bord négatif et de détecter les cycles négatifs dans un graphique.

L'algorithme de Dijkstra est également un autre algorithme de chemin le plus court à source unique. Cependant, le poids de tous les bords doit être non négatif.

Pour votre cas, en ce qui concerne le coût total, il n'y aura aucune différence, car les arêtes du graphique ont un poids non négatif. Cependant, l'algorithme de Dijkstra est généralement utilisé, car l'implémentation typique avec un tas binaire a une complexité de temps Theta((|E|+|V|)log|V|), alors que l'algorithme de Bellman-Ford a une complexité de O(|V||E|).

Si plusieurs chemins ont un coût minimum, le chemin réel renvoyé dépend de la mise en œuvre (même pour le même algorithme).

25
nhahtdh

Les sommets de l’algorithme de Dijkstra contiennent l’ensemble des informations d’un réseau. Il n’existe pas de telle chose que chaque sommet ne se soucie que de lui-même et de ses voisins. Par contre, les nœuds de l’algorithme Bellman-Ford ne contiennent que les informations associées. Ces informations permettent à ce nœud de savoir à quels nœuds voisins il peut se connecter et à quel nœud provient la relation. L’algorithme de Dijkstra est plus rapide que celui de Bellman-Ford, mais le deuxième algorithme peut être plus utile pour résoudre certains problèmes, tels que les poids négatifs des chemins.

4
bnsk

L'algorithme Djikstra est une technique gourmande dans laquelle, comme pour la mise en œuvre de l'algorithme de Bellmanford, nous avons besoin d'une approche dynamique.

Dans djikstra algo, nous effectuons une relaxation de chaque noeud/sommet dans une boucle où, comme dans Bellmanford algo, nous effectuons uniquement la relaxation | v-1 | fois.

Dijkstra algo convient au graphe lorsque son poids est positif et échoue dans le cas d’un graphe à bords négatifs dans lequel, comme Bellmanford algo, il a l’avantage de pouvoir être mis en œuvre même lorsque le poids de l’Edge est attribué négativement.

bellmanford peut déterminer si la solution graphique existe ou non (c’est-à-dire que le graphique dirigé a un cycle de pondération négatif ou non) alors que djikstra ne parvient pas à faire de même.

la complexité temporelle de djikstra algo est O (v ^ 2) lorsqu'elle est implémentée par un tableau linéaire, O (e.log v) lorsqu'elle est implémentée avec binay heap ou Fibonacci heap alors que bellmanford algo a une complexité temporelle O (| v | | e |) .

0
Aman Mishra