多くのグーグル検索の後、ほとんどのソースは、ダイクストラアルゴリズムがベルマンフォードアルゴリズムよりも「効率的」であると言っています。しかし、Bellman-Fordアルゴリズムはどのような状況下でダイクストラアルゴリズムよりも優れていますか?
私は「より良い」という言葉が広範であることを知っているので、具体的には速度の面でも、それが当てはまる場合はスペースの面でも意味します。確かに、ベルマン・フォードのアプローチがダイクストラのアプローチよりも優れている状況があります。
Bellman-Fordアルゴリズムは単一ソースの最短パスアルゴリズムであるため、エッジの重みが負の場合、グラフ内の負のサイクルを検出できます。
2つの唯一の違いは、Bellman Fordは負の重みも処理できるのに対し、Dijkstraアルゴリズムは正の重みしか処理できないことです。
wiki から
ただし、ダイクストラのアルゴリズムは、まだ処理されていない最小重みノードを貪欲に選択し、そのすべての出力エッジでこの緩和プロセスを実行します。対照的に、Bellman–Fordアルゴリズムは単純にすべてのエッジを緩和し、これを行います| V | − 1回、ここで| V |グラフ内の頂点の数です。これらの繰り返しのそれぞれで、正しく計算された距離を持つ頂点の数が増加し、その結果、最終的にすべての頂点が正しい距離を持つことになります。 この方法により、Bellman–Fordアルゴリズムをダイクストラよりも幅広い入力クラスに適用できます。
ただし、一般的なバイナリヒーププライオリティキューの実装はO((| E | + | V |)log | V |)の時間の複雑さを持っているため、ダイクストラは負のウェイトエッジがない方が一般的に優れていると考えられます。 | V | log | V | + | E |)]、Bellman-FordアルゴリズムはO(| V || E |)複雑度を持ちます
唯一の違いは、ダイクストラのアルゴリズムは、ベルマンフォードが処理する負のエッジの重みを処理できないことです。また、ベルマンフォードは、グラフに負のサイクルが含まれるかどうかも示します。グラフに負のエッジが含まれていない場合、ダイクストラの方が常に優れています。
Bellman-fordの効率的な代替手段は、トポロジカルソートを使用するDirected Acyclic Graph(DAG)です。
http://www.geeksforgeeks.org/shortest-path-for-directed-acyclic-graphs/
選択した回答で既に述べたように、ベルマン・フォードはすべての頂点に対してチェックを実行し、ダイクストラはこれまでに計算された最適な距離を持つ頂点に対してのみチェックを実行します。繰り返しますが、これによりダイクストラのアプローチの複雑さが改善されますが、すべてのノードを比較して最小距離値を見つける必要があります。これはBellman-Fordでは必要ないため、分散環境に実装する方が簡単です。そのため、主にローカル情報が使用されるDistance Vectorルーティングプロトコル(RIPやIGRPなど)で使用されます。代わりにルーティングプロトコルでダイクストラを使用するには、最初にトポロジ全体を配布する必要があります。これは、OSPFやISISなどのリンク状態プロトコルで発生することです。
私は知っているそれらの間に4つの大きな違いがあります。-1.ベルマン時間の複雑さはO(VE)であり、ダイクストラ・アルゴはmaxheapが使用される場合にO(ElogV)を持ちます。
ダイクストラアルゴ
Dijkstra algoは、Negative Edge weight cycleがグラフに存在するかどうかを区別できません
1。正のエッジウェイト:- Dijkstra always[〜#〜] pass [〜#〜]グラフ内のすべてのエッジウェイトが正の場合
2。負のエッジ重量といいえ-veエッジ重量サイクル:-ダイクストラ常に[〜#〜] pass [〜# 〜]エッジの重みが負の場合もありますが、エッジの重みが負のグラフではサイクル/ループはありません。
[i.e負のエッジウェイトサイクルはありません]
。負のエッジ重量と-veエッジ重量サイクル:-ダイクストラmayPASS/FAILエッジの重みが負のグラフのサイクル/ループとともに、一部のエッジの重みが負になります。