"Floyd-Warshallアルゴリズム"と"Dijkstraのアルゴリズム"の違いは何ですか?グラフ内の最短経路を見つけるのに最適なのはどれですか?
ネット内のすべてのペア間の最短パスを計算し、次のように結果を配列に保存する必要があります。
**A B C D E**
A 0 10 15 5 20
B 10 0 5 5 10
C 15 5 0 10 15
D 5 5 10 0 15
E 20 10 15 15 0
Dijkstra のアルゴリズムは、ノードとグラフ内の他のすべてのノードとの間の最短経路を見つけます。すべてのノードに対して1回実行します。重みは負でない必要があるため、必要に応じて、最初にグラフの値を正規化する必要があります。
Floyd-Warshall 1回の実行でノードのすべてのペア間の最短ルートを計算します!サイクルの重みは負でない必要があり、グラフはdirectedである必要があります(図はそうではありません)。
Johnson のアルゴリズムは、ダイクストラのアルゴリズムを使用して1回のパスですべてのペアを検索し、スパースツリーの場合は高速です(分析についてはリンクを参照してください)。
Floyd Warshallは、頂点のすべてのペア間のパスを見つけますが、Dijkstraは、1つの頂点から他のすべての頂点へのパスのみを見つけます。
フロイドウォーシャルはO(| V |3)およびDikstraはO(| E | + | V | log | V |)ですが、O(| E * V | + | Vの複雑さを与えるすべてのペアを見つけるには、V回実行する必要があります。2| log | V |)そうですね。これは、FWアルゴリズムよりもDijsktraを繰り返し使用する方がおそらく速いことを意味します。両方のアプローチを試して、実際のケースでどちらが最も速いかを確認します。
ダイクストラはone頂点からのみ最短経路を見つけ、Floyd-Warshallはそれらのallの間で最短経路を見つけます。
all頂点のペア間の最短経路を見つけたい場合は、ダイクストラのアルゴリズムよりも実行時間が(はるかに)長いため、Floyd-Warshallアルゴリズムを使用します。
Floyd-Warshallアルゴリズムのパフォーマンスは、最悪の場合O(| V |3)、ダイクストラ法のパフォーマンスはO(| E | + | V | log | V |)の方が悪いです。
ダイクストラ法は主に、1つのノードから他のすべてのノードへの単一ペアの最短経路検索用ですが、Floyd-Warshallは、すべてのペアの最短経路、つまり頂点のすべてのペア間の最短経路用です。 Floyd-Warshallアルゴリズムのパフォーマンスは最悪の場合O(| V | 3)ですが、ダイクストラのパフォーマンスは最悪の場合O(| E | + | V | log | V |)です。また、ダイクストラは負の重みには使用できません。 (同じようにベルマンフォードを使用します)。ただし、Floyd-Warshallの場合、負の重みを使用できますが、負のサイクルは使用できません
その間、単一ソースの最短経路問題のためのより良いアルゴリズムが知られています。実際に関連するものは Torben Hagerupによるダイクストラのアルゴリズムの派生 です。アルゴリズムの最悪の場合の複雑さはダイクストラと同じですが、平均的な場合、予想される実行時間はグラフのサイズで線形であり、純粋なダイクストラよりもはるかに高速です。アルゴリズムの考え方は、キューから最小エッジを常にポーリングする必要はないという考え方に基づいています。キューからエッジをポーリングすることができます。その重みは、最小エッジ重みの1+k
倍です。ここで、k
は0
よりも大きい数です。そのようなエッジが選択された場合でも、アルゴリズムは最短パスを見つけます。