ダイクストラ法(/ˈdaɪk.strəz/ 、ダイクストラ)は、重み付きグラフ(例えば道路網を表す)のノード間の最短経路を見つけるためのアルゴリズムです。これは、コンピュータ科学者のエドガー・W・ダイクストラによって1956年に考案され、3年後に発表されました。[ 4 ] [ 5 ] [ 6 ]
ダイクストラ法は、与えられた始点ノードから他のすべてのノードへの最短経路を見つけます。[ 7 ] : 196–206最短経路が決定された後にアルゴリズムを終了することで、特定の宛先ノードへの最短経路を見つけるために使用できます。たとえば、グラフのノードが都市を表し、エッジのコストが直接道路で接続された都市のペア間の距離を表す場合、ダイクストラ法を使用して、1 つの都市と他のすべての都市間の最短経路を見つけることができます。最短経路アルゴリズムの一般的なアプリケーションは、ネットワークルーティングプロトコルであり、最も有名なのはIS-IS (Intermediate System to Intermediate System) とOSPF (Open Shortest Path First) です。また、ジョンソン法などのアルゴリズムのサブルーチンとしても使用されます。
このアルゴリズムは、これまでに知られている最短経路を選択するために、最小優先度キューのデータ構造を使用します。より高度な優先度キュー構造が発見される前は、ダイクストラの元のアルゴリズムは、時間、はノードの数です。[ 8 ] [ 9 ] Fredman & Tarjan 1984 は、実行時間の複雑さを最適化するためにフィボナッチ ヒープ優先度キューを提案しました。、 どこはエッジの数です。これは、非負の重みが無制限の任意の有向グラフに対して、漸近的に知られている最速の単一始点最短経路アルゴリズムです。ただし、特殊なケース(重みが制限されている/整数である場合、有向非巡回グラフなど)では、さらに改善できます。前処理が可能な場合、縮約階層などのアルゴリズムは最大で7桁高速化できます。
ダイクストラ法は、エッジの重みが正の整数または実数であるグラフで一般的に使用されます。エッジの重みが部分的に順序付けられている任意のグラフに一般化できます。ただし、後続のラベル(エッジをたどると後続のラベルが生成されます)が単調非減少である必要があります。[ 10 ] [ 11 ]
多くの分野、特に人工知能では、ダイクストラ法またはその変種は均一なコスト探索を提供し、より一般的な最良優先探索の考え方の一例として定式化されている。[ 12 ]
ロッテルダムからフローニンゲンへの最短移動経路は何か、一般的に言えば、ある都市からある都市への最短移動経路とは何か。これは私が約20分で設計した最短経路アルゴリズムです。ある朝、若い婚約者とアムステルダムで買い物をしていたとき、疲れてカフェのテラスに座ってコーヒーを飲んでいると、これをできるかどうか考えていたところ、最短経路アルゴリズムを設計しました。先ほども言ったように、20分で発明したものです。実際には、3年後の1959年に発表されました。その出版物は今でも読むことができ、実際、とても素晴らしいものです。素晴らしい理由の1つは、鉛筆と紙を使わずに設計したことです。後に、鉛筆と紙を使わずに設計することの利点の1つは、避けられる複雑さをほぼすべて避けざるを得ないことだと知りました。最終的に、そのアルゴリズムは、私にとって非常に驚くべきことに、私の名声の礎の1つとなりました。
—エドガー・ダイクストラ、フィリップ・L・フラナとのインタビュー、Communications of the ACM、2001年[ 5 ]
ダイクストラは、1956年にアムステルダムの数学センターでプログラマーとして働いていたときに最短経路問題について考えました。彼は新しいARMACコンピュータの能力を実証したかったのです。[ 13 ]彼の目的は、コンピュータに詳しくない人でも理解できる問題とコンピュータによる解決策を選ぶことでした。彼は最短経路アルゴリズムを設計し、後にそれをARMACに実装して、オランダの64都市のやや簡略化された交通マップに適用しました(都市番号をエンコードするのに6ビットで十分になるように、64に限定しました)。[ 5 ] 1年後、彼は研究所の次のコンピュータに取り組んでいるハードウェアエンジニアが提起した別の問題に出会いました。それは、マシンの背面パネルのピンを接続するために必要なワイヤの量を最小限に抑えることでした。解決策として、彼はプリムの最小全域木アルゴリズムを再発見しました(これは以前ヤルニクによって知られており、プリムによっても再発見されました)。[ 14 ] [ 15 ]ダイクストラは、プリムの2年後、ヤルニクの29年後の1959年にこのアルゴリズムを発表した。[ 16 ] [ 17 ]

このアルゴリズムは開始ノードを必要とし、その開始ノードから他のすべてのノードまでの最短距離を計算します。ダイクストラ法は無限の距離から始まり、段階的に距離を改善しようとします。
都市地図上の2つの交差点間の最短経路は、鉛筆と紙を使ったこのアルゴリズムで見つけることができます。各交差点は別々の行にリストされます。1つは開始点であり、距離が0とラベル付けされます。他のすべての交差点は、最初は距離が無限大とラベル付けされます。これは、これらの交差点への経路がまだ確立されていないことを示すためです。各反復で、1つの交差点が現在の交差点になります。最初の反復では、これが開始点になります。
現在の交差点から、隣接する(直接接続されている)すべての交差点までの距離は、現在の交差点のラベル(値)と隣接交差点までの距離を合計し、その合計と隣接交差点の既存のラベルのうち小さい方の値で隣接交差点のラベルを書き換えることによって評価されます。つまり、現在の交差点を通る隣接交差点への経路が以前に評価された経路よりも短い場合、隣接交差点のラベルが書き換えられます。その場合、隣接交差点への経路に矢印を付け、隣接交差点を指し示す他の矢印をすべて消去します。現在の交差点の各隣接交差点までの距離が評価された後、現在の交差点は訪問済みとしてマークされます。ラベルが最小の未訪問の交差点が現在の交差点となり、目的地のラベルよりも小さいラベルを持つすべてのノードが訪問されるまで、このプロセスが繰り返されます。
未訪問のノードのうち、宛先のラベルよりも小さいラベルを持つノードがなくなると、残りの矢印が最短経路を示す。
次の擬似コードでは、dist はソースから他の頂点までの現在の距離を含む配列です。つまり、 dist[ u ]はソースから頂点uまでの現在の距離です。prev配列には、ソースから指定された頂点までの最短パス上の前のホップのノードへのポインタが含まれています (つまり、指定された頂点からソースまでのパス上の次のホップです)。コードu ← vertex in Q with min dist[u] は、 dist[ u ]の値が最小の頂点u を頂点セットQ内で検索します。Graph.Distance ( u , v )は、2 つの隣接ノードuとvを結ぶエッジの長さ (つまり、それらの間の距離) を返します。14 行目の変数altは、ソースノードから隣接ノードvまでのパスがu を経由する場合の長さです。この経路がvに対して記録されている現在の最短経路よりも短い場合、 vの距離はaltに更新されます。[ 7 ]

1 関数Dijkstra( Graph , source ): 2 Graph.Verticesの各頂点vに対して 3 : 4 dist[ v ] ← 無限大 5 前へ[ v ] ← 未定義 6 vをQに追加 7 dist[ソース] ← 0 8 9 Qが空でない間: 10 u ← Q内の最小距離[u]を持つ頂点 11 Q.remove(u) 12 グラフ内の各エッジ(u, v)について 13 : 14 alt ← dist[ u ] + Graph.Distance( u , v ) 15 もしalt < dist[ v ] ならば: 16 dist[ v ] ← alt 17 prev[ v ] ← u 18 19 戻り値 dist[], prev[]
頂点sourceとtarget間の最短経路を見つけるには、 u = targetの場合、 10 行目で探索を終了します。source からtargetへの最短経路は、逆反復によって得られます。
1 S ← 空のシーケンス 2 u ← target 3 if prev[ u ] is defined or u = source : // 頂点に到達可能であれば続行 4 while u is defined: // スタック S を使用して最短経路を構築 5 S.push(u) // 頂点をスタックにプッシュ 6 u ← prev[ u ] // target から source へトラバース
ここで、シーケンスSは、始点から終点までの最短経路の1つを構成する頂点のリストであり、経路が存在しない場合は空のシーケンスです。
より一般的な問題は、ソースとターゲット間の最短パスをすべて見つけることです(同じ長さのパスが複数存在する可能性があります)。次に、prev[]の各エントリに単一のノードのみを格納する代わりに、緩和条件を満たすすべてのノードを格納できます。たとえば、rとソースの両方がターゲットに接続し、ターゲットを通る異なる最短パス上にある場合(エッジのコストがどちらの場合も同じであるため)、rとソースの両方がprev[ target ]に追加されます。アルゴリズムが完了すると、prev[]データ構造は、元のグラフから一部のエッジが削除された部分集合であるグラフを記述します。その重要な特性は、アルゴリズムが何らかの開始ノードで実行された場合、そのノードから新しいグラフ内の他の任意のノードへのすべてのパスが、それらのノード間の最短パスであり、元のグラフからのその長さのすべてのパスが新しいグラフに存在することです。次に、実際に 2 つの指定されたノード間のこれらの最短パスをすべて見つけるには、深さ優先探索などの新しいグラフ上のパス探索アルゴリズムが機能します。
最小優先度キューは、add_with_priority()、decrease_priority()、extract_min() という3 つの基本操作を提供する抽象データ型です。前述のように、このようなデータ構造を使用すると、基本的なキューを使用する場合よりも計算時間が短縮されます。特に、フィボナッチヒープ[ 19 ]やブローダルキューは、これら 3 つの操作に対して最適な実装を提供します。アルゴリズムは見た目が若干異なるため、ここでは擬似コードで別途実装します。
1 関数Dijkstra( Graph , source ): 2 Q ← 頂点優先度を格納するキュー 3 4 dist[ source ] ← 0 // 初期化 5 Q .add_with_priority( source , 0) // 関連付けられた優先度は dist[·] と等しい 6 7 各頂点vについてGraph.Vertices : 8 v ≠ sourceの場合 9 prev[ v ] ← UNDEFINED // v の先行要素 10 dist[ v ] ← INFINITY // source から v までの距離が不明 11 Q.add_with_priority(v, INFINITY) 12 13 14 while Q is not empty: // メインループ 15 u ← Q .extract_min() // 最適な頂点を削除して返す 16 for each edge (u, v) : // u のすべての v 近傍を走査する 17 alt ← dist[ u ] + Graph.Distance( u , v ) 18 もしalt < dist[ v ] ならば: 19 prev[ v ] ← u 20 dist[ v ] ← alt 21 Q .decrease_priority( v , alt ) 22 23 戻り値(距離、前)
初期化フェーズで優先度キューにすべてのノードを投入する代わりに、ソースのみを含むように初期化することも可能です。その場合、ブロック内でdecrease_priority()はadd_with_priority()操作になります。[ 7 ] : 198ifalt < dist[v]
もう一つの選択肢は、ノードを無条件に優先度キューに追加し、抽出後に()再訪問していないか、またはブロック内でより短い接続がまだ見つかっていないかを確認することです。これは、キューから関連する優先度を追加で抽出し、ループ内でのみさらに処理することで実現できます。[ 20 ]u ← Q.extract_min()if alt < dist[v]pifp == dist[u]whileQ is not empty
これらの代替案では、キー減少機能のない完全に配列ベースの優先度キューを使用することができ、実際にはさらに高速な計算時間を実現できることがわかっています。ただし、グラフが密なほどパフォーマンスの差は小さくなることがわかっています。[ 21 ]
ダイクストラ法の正しさを証明するために、訪問したノードの数に対して数学的帰納法を用いることができる。 [ 22 ]
不変仮説:訪問済みノードvごとに、は出発地からvまでの最短距離であり、未訪問ノードuごとに、は訪問済みノードのみを経由して移動する場合の出発地からuまでの最短距離、またはそのような経路が存在しない場合は無限大である。(注: は未訪問ノードの実際の最短距離であるとは仮定せず、は実際の最短距離であると仮定する。)dist[v]dist[u]dist[u]dist[v]
基本ケースは、訪問ノードが1つ(ソース)のみの場合です。負の重みは許容されないため、その距離はゼロと定義され、これが最短距離となります。したがって、仮説は成り立ちます。
仮説が成り立つと仮定すると訪問したノード、それが成り立つことを示すためにノードを とします。次に訪問するノード、つまり が最小のノードをuとします。主張は、がソースからuまでの最短距離であるということです。dist[u]dist[u]
証明は背理法による。より短い経路が存在するならば、その短い経路には未訪問のノードが含まれているか、含まれていないかのどちらかである。
dist[u]dist[w]dist[w]dist[u]dist[w]dist[w]dist[u]dist[w] + Graph.Edges[w,u] < dist[u]dist[u]dist[w] + Graph.Edges[w,u]他の訪問済みノードvについては、帰納的仮説により、ソースからの最短距離であることが既にわかっているため、これらの値は変更されません。dist[v]
uを処理した後も、未訪問のノードwごとに、訪問済みのノードのみを使用してソースからwまでの最短距離が であるという事実は変わりません。uを使用しないより短いパスは既に発見されており、u を使用したより短いパスは、 u の処理時に更新されています。dist[w]
すべてのノードを訪問した後、始点から任意のノードvへの最短経路は、訪問済みのノードのみで構成されます。したがって、が最短距離となります。dist[v]
エッジEと頂点Vを持つグラフ上でのダイクストラ法の実行時間の上限は、エッジの数の関数として表すことができ、、頂点の数、ビッグオー記法を使用。複雑度の上限は主に集合Q を表現するために使用されるデータ構造に依存します。以下では、上限を簡略化できます。は任意の単純グラフに対しては、この単純化は、いくつかの問題では、他の上限が保持する可能性がある。
頂点集合Qの任意のデータ構造の場合、実行時間は次のとおりです。[ 2 ]
どこそしてこれらはそれぞれ、 Qにおけるデクリメントキー操作と抽出ミニマム操作の複雑度です。
ダイクストラ法の最も単純なバージョンでは、頂点集合Q をリンクリストまたは配列として、エッジを隣接リストまたは行列として格納します。この場合、最小値抽出は単にQ内のすべての頂点に対する線形探索であるため、実行時間は。
疎なグラフ、つまり、エッジに関して、ダイクストラ法は、グラフを隣接リストの形式で格納し、自己平衡二分探索木、二分ヒープ、ペアリングヒープ、フィボナッチヒープ、または優先度ヒープを優先度キューとして使用して最小値の抽出を効率的に実装することで、より効率的に実装できます。二分ヒープでキー減少ステップを効率的に実行するには、各頂点をヒープ内の位置にマッピングする補助データ構造を使用し、優先度キューQが変化するにつれてこの構造を更新する必要があります。自己平衡二分探索木または二分ヒープを使用する場合、アルゴリズムは最悪の場合の時間。連結グラフの場合、この時間制限は次のように簡略化できます。フィボナッチヒープはこれを改善し、。
バイナリヒープを使用する場合、平均時間計算量は最悪ケースよりも低くなります。エッジコストが共通の確率分布から独立に抽出されると仮定すると、キー減少操作の期待値は以下で制限されます。合計実行時間は[ 7 ]: 199~200です。
ダイクストラ法の一般的な表現では、最初はすべてのノードが優先度キューに入力されます。しかし、これは必須ではありません。アルゴリズムは、1 つの項目のみを含む優先度キューから開始し、新しい項目が発見されるたびに挿入することができます (キーを減らす代わりに、キーがキューにあるかどうかを確認します。ある場合はキーを減らし、ない場合は挿入します)。[ 7 ] : 198このバリアントは、一般的なバリアントと同じ最悪の場合の境界を持ちますが、実際には優先度キューが小さくなるため、キュー操作が高速化されます。[ 12 ]
さらに、グラフにすべてのノードを挿入しないことで、アルゴリズムを拡張して、無限グラフやメモリに表現するには大きすぎるグラフ上の、単一のソースからターゲットノードの集合のうち最も近いノードまでの最短経路を見つけることが可能になります。結果として得られるアルゴリズムは、人工知能の文献では均一コスト探索(UCS)と呼ばれ[ 12 ] [ 23 ] [ 24 ]、擬似コードでは次のように表現できます。
手続きuniform_cost_search(start)は ノード ← 開始 フロンティア ← ノードのみを含む優先度キュー 展開済み ← 空集合 フロンティアが空の場合は 失敗を返す ノード ← frontier.pop() もしノードが目標状態であれば、 ソリューション(ノード)を返す。 expanded.add(node) 各ノードの隣接ノードnについて、nが拡張ノードでもフロンティアノードでもない場合は、 frontier.add( n ) を実行する。そうでない場合は、n がより高いコストでフロンティアノードに含まれている場合は、n を追加する。 既存のノードをnに置き換える
非常に大きなグラフの場合、その複雑さは別の方法で表現できます。C * が開始ノードから「目標」述語を満たす任意のノードまでの最短パスの長さであり、各エッジのコストが少なくともεであり、ノードごとの隣接ノードの数がbに制限されている場合、アルゴリズムの最悪ケースの時間計算量と空間計算量はどちらもO ( b 1+⌊ C * ⁄ ε ⌋ )です。[ 23 ]
単一ターゲットの場合のさらなる最適化には、双方向バリアント、 A* アルゴリズムなどの目標指向バリアント( § 関連問題とアルゴリズムを参照)、最短経路の中間セグメントを形成する可能性のあるノードを決定するためのグラフ剪定 (到達ベースルーティング)、およびs - tルーティングをsとtをそれぞれの「トランジットノード」に接続し、その後「ハイウェイ」を使用してこれらのトランジットノード間の最短経路計算を行うように削減する入力グラフの階層的分解が含まれます。[ 25 ]特定の問題で最適な実用的パフォーマンスを得るには、このような手法の組み合わせが必要になる場合があります。[ 26 ]
双方向ダイクストラ法は、すべての頂点ではなく、与えられた始点頂点sと終点頂点tの間の最短経路を効率的に計算するように設計されたダイクストラ法の変種です。重要なアイデアは、2 つの同時探索を実行することです。1 つは元のグラフ上のsからの順方向探索、もう 1 つはエッジが反転したグラフ上のtからの逆方向探索です。各探索は、独自の暫定的な距離推定値、優先度キュー、および「確定済み」頂点のセットを保持します。2 つのフロンティアは互いに近づき、最短のs–t経路上のどこかで出会います。[ 27 ]
2 つの距離配列d f [ v ] ( sからvまでの距離) とd b [ v ] ( vからtまでの距離) が保持され、d f [ s ] = 0およびd b [ t ] = 0の場合を除き、すべて∞に初期化されます。2 つの優先度キューQ fとQ bは、まだ完全に処理されていない頂点を保持し、2 つのセットS fとS b は、各方向で最短経路距離が確定した頂点を格納します。変数μ は、これまでに見つかった最良の完全なs–t経路の長さを格納し、初期値は∞ です。
このアルゴリズムは、現在より小さいキーを持つキューから最小距離の頂点を繰り返し抽出し、その出力(または入力)エッジを緩和し、2つの確定済み集合間の接続が発見されるたびにμを更新します。
そして、後方探索についても同様に同じことが言える。
重要な特徴は停止条件です。両方のキューの現在の最小優先度の合計が少なくともμになると、まだ確定していないパスはμよりも改善できません。この時点でμは真の最短パス距離δ( s , t )に等しくなり、探索は終了します。[ 27 ]
この基準を用いることで、2つの国境が接した時点で停止してしまうというよくある間違いを避けることができる。そうすると、別の場所でより短い代替ルートを見落としてしまう可能性があるからだ。
一般的なグラフでは、各検索で探索する範囲は探索空間の約半分程度で済むため、双方向ダイクストラ法は、単一ペアのクエリに対して一方向ダイクストラ法を用いる場合と比べて、訪問する頂点数や緩和するエッジ数がはるかに少なくて済むことが多い。道路網のようなグラフでは、その効果は劇的で、探索領域が指数関数的に大きな球体から、より小さな2つの半球体に縮小される場合もある。
この方法は、地図やナビゲーションソフトウェアのポイントツーポイントルーティングで広く使用されており、ALT、縮約階層、リーチベースルーティングなどの多くの高速化技術の基礎となっています。[ 28 ]
実際の最短経路(距離だけでなく)が必要な場合は、両方の検索で先行ポインタを保存できます。μ が何らかの交差点xを介して更新されると、アルゴリズムはこの交差点を記録し、sからxへの順方向経路とxからtへの逆方向経路を連結した最終経路を再構築します。
理論的な研究によると、最適化された双方向アプローチはインスタンス最適になり得る、つまり、同じグラフインスタンス上で漸近的に緩和できるエッジ数を減らす正しいアルゴリズムは存在しないということである。[ 29 ]
ダイクストラ法は非負のエッジ重みを持つグラフに対して最適ですが、実際の実行時間はデータ構造とグラフの特性の両方に依存します。バイナリヒープを使用すると、実行時間は O((V+E)logV) になります。フィボナッチヒープなどの代替手段は理論上の上限はより優れていますが、定数係数が大きいため、実際のアプリケーションではパフォーマンスが低下することがよくあります。[ 30 ]
グラフ構造も重要な役割を果たします。道路地図のような疎なネットワークでは、ほとんどの頂点の次数が低いため、ダイクストラ法が効率的に動作します。密なグラフでは緩和が増加し、処理が遅くなります。このため、最新のルーティングシステムでは、ダイクストラ法をA*探索、ランドマークヒューリスティクス、縮約階層などの前処理方法と組み合わせて使用することが多く、これにより探索空間が大幅に削減されます。[ 31 ]
メモリ局所性も重要な要素です。キャッシュ最適化された優先度キューと隣接レイアウトは、CPU キャッシュの制限を超える大規模グラフのレイテンシを削減できます。[ 32 ]
こうした理由から、実際のシステムでは、特定のグラフの種類やハードウェアの制約に合わせて調整された、特殊なダイクストラ法の変種が使用されることが多い。
ダイクストラ法は、単に距離や経路を計算するだけでなく、与えられた開始頂点からの距離に基づいて頂点をソートするためにも使用できます。2023年に、Haeupler、Rozhoň、Tětek、Hladík、およびTarjan(1984年のヒープの発明者の1人)は、正の重みを持つ有向グラフ上のこのソート問題に対して、特別なヒープデータ構造を持つダイクストラ法のバージョンの実行時間と比較回数が、同じグラフと開始頂点上の同じソート問題に対して可変エッジ重みを持つ比較ベースのアルゴリズムの中で最適値の定数倍以内であることを証明しました。これを実現するために、彼らは、ヒープから最小要素を返す/削除するコストが、ヒープ内の要素数ではなく、その後に挿入された要素数に対して対数となる比較ベースのヒープを使用しています。[ 33 ] [ 34 ]
弧の重みが小さな整数である場合(パラメータによって制限される))速度向上のために専用キューを使用できる。この種の最初のアルゴリズムは、正の整数エッジ重みを持つグラフに対するDial のアルゴリズム[ 35 ]であり、バケットキューを使用して実行時間を取得する。優先度キューとしてヴァン・エムデ・ボアス木を使用すると、複雑さが[ 36 ]新しい基数ヒープとよく知られたフィボナッチヒープを組み合わせた別の興味深いバリアントは、[ 36 ]最後に、この特殊なケースにおける最良のアルゴリズムは、[ 37 ]時間と時間。[ 38 ]
ダイクストラのオリジナルアルゴリズムは、修正を加えることで拡張できます。例えば、数学的に最適ではない解を提示することが望ましい場合があります。最適ではない解の順位付けリストを作成するには、まず最適解を計算します。最適解に含まれる辺をグラフから1つ削除し、この新しいグラフの最適解を計算します。元の解の各辺を順番に削除し、新しい最短経路を計算します。次に、二次解を順位付けし、最初の最適解の後に表示されます。
ダイクストラ法は、リンクステート型ルーティングプロトコルの動作原理として一般的に用いられています。OSPFとIS - ISが最もよく知られています。
ダイクストラ法とは異なり、ベルマン・フォード法は、始点頂点sから到達可能な負のサイクルがグラフに存在しない限り、負のエッジ重みを持つグラフにも使用できます。このようなサイクルが存在すると、サイクルをたどるたびにラベルが小さくなるため、最短経路を見つけることができません。(この記述は、「パス」が頂点を繰り返すことを許容していると仮定しています。グラフ理論では通常、これは許容されません。理論計算機科学では、しばしば許容されます。)ダイクストラ法をベルマン・フォード法と組み合わせることで、負の重みを扱うように適応させることができます(負のエッジを除去し、負のサイクルを検出するため):ジョンソン法。
A *アルゴリズムは、ダイクストラ法の一般化であり、目標までの距離の下限値を示す追加情報が利用可能な場合、探索すべき部分グラフのサイズを縮小します。
ダイクストラ法の根底にあるプロセスは、プリム法で用いられる貪欲法と類似している。プリム法の目的は、グラフ内のすべてのノードを結ぶ最小全域木を見つけることである。一方、ダイクストラ法は2つのノードのみに着目する。プリム法は、始点ノードからの経路の総重みを評価せず、個々のエッジの重みのみを評価する。
幅優先探索は、重み付けされていないグラフにおけるダイクストラ法の特殊なケースと見なすことができ、優先度キューがFIFOキューに退化する。
高速マーチング法は、三角形メッシュ上の測地距離を計算するダイクストラ法の連続版と見なすことができる。
動的計画法の観点から見ると、ダイクストラ法は、最短経路問題に対する動的計画関数方程式をリーチング法によって解く逐次近似スキームである。[ 39 ] [ 40 ] [ 41 ]
実際、ダイクストラによるアルゴリズムの背後にある論理の説明は次のとおりです。[ 42 ]
問題2.与えられた2つのノードPとQ間の最小全長パスを求めます。RがPからQへの最小パス上のノードである場合、QがわかっているということはPからRへの最小パスがわかっていることを意味するという事実を利用します。
数学センターでは、ARMAC コンピュータの構築が主要なプロジェクトでした。1956 年の公式開所式のために、ダイクストラは、非技術者にとって興味深い問題を解決するプログラムを考案しました。都市を結ぶ道路網が与えられたとき、指定された 2 つの都市間の最短ルートは何か?
3 番目の古典的な最小全域木アルゴリズムは Jarník によって発見され、Prim と Dikstra によって再発見されました。これは一般に Prim のアルゴリズムとして知られています。