Floyd-Warshall、Dijkstra、Bellman-Fordアルゴリズムの違いは正しいですか?


16

私は3つを研究してきましたが、それらからの推測を​​以下に述べています。十分に正確に理解しているかどうかを誰かに教えてもらえますか?ありがとうございました。

  1. ダイクストラアルゴリズムは、単一のソースがあり、あるノードから別のノードへの最小パスを知りたい場合にのみ使用されますが、このような場合は失敗します。

  2. Floyd-Warshallアルゴリズムは、すべてのノードのいずれかがソースになる可能性がある場合に使用されるため、任意のソースノードから任意の宛先ノードに到達する最短距離が必要です。これは、負のサイクルがある場合にのみ失敗します。

  3. ソースが1つしかない場合、Bellman-Fordはダイクストラのように使用されます。これは負の重みを処理でき、その動作は1つのソースを除き、Floyd-Warshallと同じですよね?(これは私が最も確信していないものです。)


ようこそ!冗長なコード部分を編集しました。ユーザーは自分でWikipediaをクリックするか、お気に入りの教科書のアルゴリズムを確認できます。「はい」の答えはそれ以上のものではないため、質問は奇妙な質問です。
ラファエル

回答:


23

ダイクストラのアルゴリズムは、単一のソースがあり、あるノードから別のノードへの最小パスを知りたい場合にのみ使用されますが、失敗します[負のエッジを持つグラフで]

ダイクストラのアルゴリズムは、単一ソースの最短パスまたはSSSPアルゴリズムの一例です。すべてのSSSPアルゴリズムは、選択されたソースノードからグラフ内の他のすべてのノードまでの最短パス距離を計算します。さらに、sから他のすべてのノードへのすべての最短パスのコンパクトな表現を、根付きツリーの形式で計算します。ウィキペディアのコードでは、このツリーのvの親です。ssprevious[v]v

エッジが負のグラフでのダイクストラのアルゴリズムの動作は、議論中の正確なバリアントに依存します。Wikipediaのアルゴリズムのようなアルゴリズムのいくつかのバリアントは、常に迅速に実行されますが、ネガティブエッジがある場合に最短経路を正しく計算しません。これらの講義ノートのような他の変形は、常に最短経路を正しく計算します(ソースから到達可能な負のサイクルがない限り)が、負のエッジがある場合、最悪の場合指数関数的な時間が必要になる場合があります。

Floyd-Warshallのアルゴリズムは、すべてのノードのいずれかがソースになる場合に使用されるため、任意のソースノードから任意の宛先ノードに到達する最短距離が必要です。これは、負のサイクルがある場合にのみ失敗します。

そのとおりです。Floyd-Warshallは、すべてのペアの最短パスアルゴリズムの 1つの例です。つまり、ノードのすべてのペア間の最短パスを計算します。別の例は、「各ノードvについて、vをソースノードとしてダイクストラを実行する」です。他にもいくつかあります。

ソースが1つしかない場合、Bellman-Fordはダイクストラのように使用されます。これは負の重みを処理でき、その動作は1つのソースを除き、Floyd-Warshallの動作と同じですよね?

Bellman-Fordは、ダイクストラのような単一ソースの最短パスアルゴリズムの別の例です。Bellman-FordとFloyd-Warshallは類似しています(たとえば、両方とも動的プログラミングアルゴリズムです)が、Floyd-Warshallは「各ノードvに対して、vをソースノードとしてBellman-Fordを実行」と同じアルゴリズムではありません。特に、Floyd-Warshallは時間で実行されますが、Repeater -Bellman-FordはO V 2 E 時間(各ソース頂点のO V E 時間)で実行されます。O(V3)O(V2E)O(VE

詳細については、お気に入りのアルゴリズムの教科書を参照してください。(あなたが行う必要がありますが、好きなアルゴリズムの教科書ではないのですか?)


お気に入りのアルゴリズムの教科書を共有してもらえますか?
アブドゥル

2
@Abdul algorithm.wtf
JeffE

アブドゥル -MIT / Stanfordで使用されている教科書は、T。Cormenなどです。アルゴリズムの紹介。コーネルで使用される教科書は、J。Kleinberg、et al Algorithm Designです。cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/...
AffluentOwl

2

3つのアルゴリズムはすべて、Jaehyun Park教授(スタンフォード大学)の講義スライドで説明されています。リンク最短パスアルゴリズム はここにあります


これは違いについての質問には答えず、自己完結型ではありません。要約のないリンクだけが良い答えとしてカウントされません。また、既存の回答以上のものをカバーしていないため、冗長なようです。

1

最短経路問題のWikipediaのページが SSSPとAPSP:二つの異なる問題について説明します。

単一ソース最短パス(SSSP):

  • ダイクストラのアルゴリズム:単一ソースの最短経路問題を解決します。
    • 制約:処理できない負のエッジのみ。
    • 重み付けされていないグラフ:ダイクストラはBFSと同じです。
  • Bellman–Fordアルゴリズム:エッジの重みが負の場合、単一ソースの問題を解決します。これは、ダイクストラの改善であり、負の重みも処理できるようになりました。

すべてのペアの最短パス(APSP):

  • Floyd–Warshallアルゴリズム:すべてのペアの最短パスを解決します。正と負の両方のエッジを処理します。
    • 制約:負のサイクルを処理できません。

したがって、基礎となる方法論は同じ動的プログラミングですが、Floyd–WarshallはBFSと同じではありません。


1

おそらく、これは回答ではなくコメントである必要がありますが、他の回答では言及されていないこれらのアルゴリズムの違いです。

人々はフロイドのアルゴリズムをFloyd-Warshallと呼ぶ傾向がありますが、フロイドのアルゴリズムとウォーシャルのアルゴリズムは同じではありません。

Warshallの論文では、2進入射行列でFloydのアルゴリズムを使用している場合、あなたがしていることは行列の乗算であると述べています。したがって、実際にそのように実装できます。たとえば、ベクトル乗算をO1、あなたのアルゴリズムは On2

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.