ダイクストラのアルゴリズムの詳細な説明

ダイクストラのアルゴリズムの詳細な説明

この記事では、まず単一ソース最短経路問題から始め、次にベルマン・フォード アルゴリズムについて説明し、最後にダイクストラアルゴリズムについて具体的に説明します。ダイクストラ アルゴリズムの各ステップを詳細に説明および分析し、このダイクストラ アルゴリズムを徹底的に理解できるようにします。

1. 単一ソース最短経路問題

単一ソースの最短経路問題とは、グラフ G=(V, E) が与えられたときに、固定ソース頂点 s<-V から各 v<-V までの最短経路を見つけることが求められる問題です。簡単に言えば、グラフ G 内の固定点 s を見つけ、次に s を開始点として使用して、s からグラフ G 内の残りの点までの最短距離または経路を見つけることです。

この単一ソースの最短経路問題には、次のバリエーションがあります。

I. 単一目的地最短経路問題: 各頂点 v から指定された目的地 t までの最短経路問題。つまり、単一ソース最短経路問題の相対的な問題です。

II. 単一の頂点ペアの最短経路問題: 頂点 u と v が与えられた場合、u から v への最短経路を見つけます。

III. 各頂点間の最短経路問題:

任意の 2 つの頂点 u と v について、u から v への最短経路を見つけます。最も単純なアイデアは、各頂点をソース ポイントとして扱い、単一ソース アルゴリズムを 1 回実行することでこの問題を解決することです。もちろん、もっと良い方法があります。

2. ベルマンフォードアルゴリズム

1. 回路の問題

最短パスには、負の重み付けされたループまたは正の重み付けされたループを含めることはできません。ダイクストラのアルゴリズムなどの一部の最短経路アルゴリズムでは、グラフ内のすべてのエッジの重みが非負である必要があります。たとえば、道路地図では、固定点 s から目的の頂点 v までの最短経路を見つける問題が解決されます。

2. ベルマンフォードアルゴリズム

Bellman-Ford アルゴリズムでは、ソース ポイントから到達可能な負の重みのループがない限り、入力グラフに負の重みのエッジが存在することが許可されます。簡単に言えば、グラフには負の重みのエッジが存在する可能性がありますが、これらの負の重みのエッジは負の重みのループを構成せず、ループの形成に影響を与えません。さらに、ベルマンフォード アルゴリズム自体は、グラフ内のソース ポイントから到達可能な負の重みループがあるかどうかを判断できます。負の重みループがある場合、アルゴリズムは FALSE を返し、ない場合は TRUE を返します。

ベルマンフォードアルゴリズムの詳細な説明

ベルマンフォード(G、w、s)

  1. INITIALIZE-SINGLE-SOURCE(G, s) // 各頂点を初期化する、O(V)  
  2. i ← 1 から |V[G]| - 1 まで
  3.   する 各辺(u, v)∈E[G]について
  4. RELAX(u, v, w) を実行します//各頂点 (V-1) に対して、緩和手法 O(E) を適用します (O((v-1)*E)) としてカウントされます)  
  5. 各辺(u, v)∈E[G]について
  6. する  d[v] > d[u] + w(u, v) の場合
  7. then return FALSE // グラフ内の各エッジをチェックして、負の重みループが含まれているかどうかを確認します。  
  8.                                      //d[v]>d[u]+w(u,v)の場合は包含を意味し、FALSEを返します。  
  9. TRUEを返す// 負の重みループが含まれていない場合は TRUE を返す 

上記から、ベルマンフォードアルゴリズムの時間計算量は O(V*E) であることがわかります。

3. グラフに負の重みループが含まれているかどうかという質問に関して:

定理によれば、uはvの親であると仮定する。すると、G(V,E)が有向グラフまたは無向グラフ(負の重みループを含まない)の場合、s<-V、sはGの任意の頂点であり、任意の辺(u、v)<-Vに対して、

d[s,v] <= d[s,u]+1 である。

この定理の詳細な証明については、『アルゴリズム入門』の第 22 章の補題 22.1 の証明を参照してください。あるいは、第 24 章の三角不等式を使用したベルマン-フォードアルゴリズムの正しさの証明に基づいて、上記の定理のバリエーションを導き出すこともできます。

つまり、グラフGに負の重みループが含まれていないと仮定すると、次のことが証明できる。

  1. d[v]=$(s,u)
  2. <=$(s,u)+w(u,v) //三角不等式によれば 
  3. =d[u]+w[u,v]

したがって、負の重みサイクルを含まないグラフでは、d[v]<=d[u]+w(u,v) と結論付けることができます。

したがって、上記のベルマンフォードアルゴリズムでは、d[v] > d[u]+w(u,v)の場合、=> 負の重みループが含まれ、FASLEが返されることは理解しにくいことではありません。

そうでない場合、=> に負の重みループが含まれていない場合は、TRUE を返します。

さて、ダイクストラアルゴリズムに移りましょう。

3. ダイクストラアルゴリズムをわかりやすく説明し、徹底的に分析する

I. リラクゼーションテクニックの紹介 RELAX

ダイクストラアルゴリズムは緩和技術を使用します。各頂点 v<-V に対して、ソースポイント s から v までの最短パスの重みの上限を記述する属性 d[v] が設定されます。
これを最短経路推定と呼びます。

まず、最短経路を推定し、先行ノードを初期化するのに O(V) の時間がかかります。

  1. 単一ソースの初期化(G, s)
  2.  各頂点v∈V[G]について
  3.    d[v] ← ∞ を実行する
  4. π[v] ← NIL //O(V)  
  5. d[s] 0
  6.  
  7. リラックス(u, v, w)
  8. d[v] > d[u] + w(u, v) の場合
  9. するとd[v] ← d[u] + w(u, v)となる。
  10. π[v] ← u //O(E) グラフ。  

II. ダイクストラアルゴリズム

このダイクストラ アルゴリズムには、INSERT (行 3)、EXTRACT-MIN (行 5)、および DECREASE-KEY (行 8 の RELAX、この減分キー操作を呼び出す) の 3 つのステップがあります。

  1. ダイクストラ(G, w, s)
  2. INITIALIZE-SINGLE-SOURCE(G, s) // 各頂点を初期化する、O(V)  
  3. S ← Ø
  4. Q ← V[G] //挿入、O(1)  
  5.   Q ≠ Øであるが
  6.     do u ← EXTRACT-MIN(Q) // 単純 O(V*V); バイナリ/アイテム ヒープと FIB-HEAP はどちらも O(V*lgV) です。  
  7. S ← S ∪{u}
  8.      各頂点v ∈ Adj[u]について
  9.            do RELAX(u, v, w) //単純な方法: O(E)、バイナリ/アイテムヒープ、E*O(lgV)、FIB-HEAP、E*O(1)。  

4. ダイクストラアルゴリズムの実行時間

先に進む前に、問題を述べなければなりません。DIJKSTRA (G, w, s) アルゴリズムの 5 行目、EXTRACT-MIN (Q) は、最小優先度キューの具体的な実装です。ダイクストラ アルゴリズムの実行時間は、この最小優先度キューの特定の実装によって異なります。

最小優先度キューの 3 つの実装方法:

1. 1 から |V| まで番号が付けられた頂点を使用して、各 d[v] を、上記の DIJKSTRA(G, w, s) に示すように、配列内の対応する v 番目の項目に格納します。ダイクストラのアルゴリズムの実行時間は O(V^2+E) です。

2. 最小優先度キューがバイナリ/アイテムヒープによって実装されている場合、EXTRACT-MIN(Q) の実行時間は O(V*lgV) なので、ダイクストラのアルゴリズムの実行時間は O(V*lgV+E*lgV) です。すべての頂点がソースポイントから到達可能な場合、O((V+E)*lgV)=O(E*lgV) です。疎グラフの場合、E=O(V^2/lgV)となり、このダイクストラアルゴリズムの実行時間はO(V^2)となります。

3. フィボナッチヒープを使用して最小優先度キューを実装する場合、EXTRACT-MIN(Q) の実行時間は O(V*lgV) なので、このダイクストラアルゴリズムの実行時間は O(V*lgV+E) になります。

要約すると、この最小優先度キューの 3 つの実装方法は次のように比較されます。

|V|<<|E|の場合、DIJKSTRA(G, w, s) + FIB-HEAP-EXTRACT-MIN(Q)、つまりフィボナッチヒープを使用して最小優先度キューを実装します。
メリットが反映されます。

5. ダイクストラアルゴリズム + FIB-HEAP-EXTRACT-MIN(H)、最小優先度キューを実装するためのフィボナッチヒープ

上記から、フィボナッチ ヒープを使用して最小優先度キューを実装すると、実行時間が O (VlgV + E) に改善されることがすでにわかっています。 |V| EXTRACT-MIN操作(それぞれ償却コストO(lgV))、および|E| DECREASE-KEY操作(それぞれ償却時間O(1))。

次に、DIJKSTRA(G, w, s) におけるフィボナッチヒープを用いた最小優先度キューの実装操作に焦点を当てます。

上記から、DIJKSTRA アルゴリズムには次の 3 つのステップが含まれていることがすでにわかっています。

INSERT (行 3)、EXTRACT-MIN (行 5)、および DECREASE-KEY (行 8 の RELAX)。

まず、ダイクストラアルゴリズム + FIB-HEAP-EXTRACT-MIN(H) のアルゴリズムを直接示します。

  1. ダイクストラ(G, w, s)
  2. 単一ソースの初期化(G, s)
  3. S ← Ø
  4. Q ← V[G] // 行3、INSERT操作、O(1)  
  5.   Q ≠ Øであるが
  6.     do u ← EXTRACT-MIN(Q) //行5、EXTRACT-MIN演算、V*lgV  
  7. S ← S ∪{u}
  8.        各頂点v ∈ Adj[u]について
  9.            do RELAX(u, v, w) // 8行目、RELAX操作、E*O(1)  
  10.  
  11. FIB-HEAP-EXTRACT-MIN(H) //償却コストはO(lgV)  
  12. z ← 最小[H]
  13.    z ≠ NILの場合
  14. 次に、 zの子xごと
  15.                Hのルートリストにxを追加する
  16. p[x] ← ゼロ
  17. Hのルートリストからzを削除する
  18.            z = 右[z]の場合
  19. min[H] ← NIL
  20.             そうでない場合はmin[H] ← right[z]
  21. 統合(H)
  22. n[H] ← n[H] - 1
  23. zを返す

6. ダイクストラ法+フィボナッチヒープの各ステップの詳細な分析

さて、次に、上記の操作を段階的に詳しく説明します。

行3のINSERT操作:

  1. FIB-HEAP-INSERT(H, x) //償却コスト、O(1)。  
  2. 度[x] ← 0
  3. p[x] ← ゼロ
  4. 子[x] ← NIL
  5. 左[x] ← x
  6. 右[x] ← x
  7. マーク[x] ← FALSE
  8. xを含むルートリストをルートリストHと連結する
  9.    min[H] = NIL または key[x] < key[min[H]]の場合
  10. すると min[H] ← x
  11. n[H] ← n[H] + 1

5行目のEXTRACT-MIN演算:

  1. FIB-HEAP-EXTRACT-MIN(H) //償却コストはO(lgV)  
  2. z ← 最小[H]
  3.    z ≠ NILの場合
  4. 次に、 zの子xごと
  5.               Hのルートリストにxを追加する
  6. p[x] ← ゼロ
  7. Hのルートリストからzを削除する
  8.          z = 右[z]の場合
  9. min[H] ← NIL
  10.           そうでない場合はmin[H] ← right[z]
  11. CONSOLIDATE(H) //CONSOLIDATEアルゴリズムは以下の通りです。  
  12. n[H] ← n[H] - 1
  13. zを返す

次の図は、FIB-HEAP-EXTRACT-MIN プロセスの概略図です。

  1. 統合(H)
  2.   i ← 0 から D(n[H]) まで
  3.        A[i] ← NILを実行する
  4.   Hのルートリストの各ノードwについて
  5.        x ← wを実行する
  6. d ← degree[x] // 子の数 
  7.           A[d] ≠ NILであるが
  8.              する← A[d]
  9.                 キー[x] > キー[y]の場合
  10. x <-> yを交換する
  11. FIB-HEAP-LINK(H, y, x) // 以下に示す。  
  12. A[d] ← ゼロ
  13. d ← d + 1
  14. A[d] ← x
  15. min[H] ← ゼロ
  16.   i ← 0 から D(n[H]) まで
  17.     する  A[i] ≠ NILの場合
  18. 次にA[i]をHのルートリストに追加する
  19.                min[H] = NIL または key[A[i]] < key[min[H]] の場合
  20. すると min[H] ← A[i]
  21.  
  22. FIB-HEAP-LINK(H, y, x) //yはxにリンクされています。  
  23. Hのルートリストからyを削除する
  24. yをxの子にして、degree[x]を増分する
  25. マーク[y] ← FALSE

8行目のRELAXの操作は上記に示されています。

  1. リラックス(u, v, w)
  2.   d[v] > d[u] + w(u, v) の場合
  3. するとd[v] ← d[u] + w(u, v)となる。
  4. π[v] ← u //O(E)  

一般的に、ダイクストラのアルゴリズムでは、DECREASE-KEY は EXTRACT-MIN よりもはるかに頻繁に呼び出されます。
したがって、EXTRACT-MIN 操作の償却時間を増やすことなく、DECREASE-KEY 操作の償却時間を最小限に抑えることで、バイナリ ヒープよりも高速な実装を実現できます。

以下は、バイナリ ヒープ、二項式ヒープ、フィボナッチ ヒープのさまざまな操作の時間計算量の比較です。

操作 バイナリヒープ(最悪の場合) 二項式ヒープ(最悪の場合) フィボナッチヒープ(償却)

ヒープを作る Θ(1) Θ(1) Θ(1)
Θ(lg n) O(lg n) Θ(1) を挿入する
最小Θ(1) O(lg n) Θ(1)
抽出最小Θ(lg n) Θ(lg n) O(lg n)
和集合Θ(n) O(lg n) Θ(1)
減少キー Θ(lg n) Θ(lg n) Θ(1)
削除 Θ(lg n) Θ(lg n) O(lg n)

フィボナッチ ヒープについては、今後このブログでさらに詳しく調査し、詳しく説明する予定です。同時に、この記事は今後も深化と拡張を続けていきます。

オリジナルリンク: http://blog.csdn.net/v_JULY_v/archive/2011/02/13/6182419.aspx

【編集者のおすすめ】

  1. ダイクストラアルゴリズムに関する予備的研究
  2. 現在世界で最も重要な古典的アルゴリズムトップ10
  3. C/C++アルゴリズム設計における任意のビット幅の使用
  4. 14.8 数値アルゴリズムの威力(サイドバー)

<<:  Googleが4月22日に発表したアルゴリズム改善策の分析

>>:  ダイクストラアルゴリズムに関する予備的研究

ブログ    
ブログ    
ブログ    

推薦する

まだ人工知能を理解していないのですね?チューリングに「直接」説明してもらってはいかがでしょうか?

[[335755]]タイムトラベルの超能力を与えられたら、どの歴史上の人物と話をして過去に戻りたい...

近年、軍事用人工知能スタートアップが人気を集めている理由

ロシアとウクライナの紛争が始まって2週間、データ分析会社パランティアのCEO、アレクサンダー・カープ...

...

企業が人工知能を応用する際に直面する課題

[[340820]] [51CTO.com クイック翻訳] 過去10年間、人工知能をめぐって大きな議...

成功の秘訣: AIを活用したオンライン文書検証

[[410827]] [51CTO.com クイック翻訳]急速な技術開発と進歩の時代において、個人情...

AIが自ら騙された!生成された写真詐欺はAI識別器の目を楽々と逃れ、マスクのロボットガールフレンドと3メートルの巨人は両方とも「実現」

AI が生成した画像は非常にリアルなので、AI 自身も違いを区別できません。マスク氏とロボットのガ...

AI ライティングの限界はどこにあるのでしょうか?

[[248875]]画像出典: Visual China本質的に、この記事は AI ライティングを...

...

孤独を研究していますか? Reddit のホットな話題: AI のゴッドファーザー、ヤン・ルカンが提案した「エネルギー モデル」とは一体何でしょうか?

「エネルギー自己教師学習っていったい何?」と多くのRedditネットユーザーがコメントした。ちょう...

心が開かれました! Adobeなどの研究者が「自撮り」を「他人が撮った写真」に変え、感動的な魔法の写真編集効果を実現

自撮り写真を他人が撮った写真に変えることもできます。魔法の写真編集の世界に新しいトリックが登場し、そ...

人工知能アルゴリズム: 遺伝的アルゴリズム

この本の最初の 2 章では、進化アルゴリズムをやや抽象的な意味で定義しています。スコアリング、選択、...

米国の専門家:中国のロボット優位性が懸念される

フォーブスは10月2日、寄稿者ティム・バジャリン氏による記事を掲載し、中国ロボットの利点と、中国と米...

2023 年のエンタープライズ AI の現状: AI は仕事にどのような影響を与えるでしょうか?

11月8日、英国アバディーン大学の研究機関がAIがもたらす変化について詳細な調査を実施し、最新の研...

逆転!清華大学の卒業生の死はグーグルのレイオフとは無関係、家庭内暴力の詳細が明らかに、男性は殺人罪で起訴された

地元警察は、ここ数日話題になっている「グーグルの人員削減により清華大学の夫婦が自殺」事件の詳細を発表...