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

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

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

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日に発表したアルゴリズム改善策の分析

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

ブログ    
ブログ    

推薦する

AI、機械学習、ディープラーニングの謎を解く

ディープラーニング、機械学習、人工知能 — これらの流行語は分析の未来を表しています。この記事では、...

二分木の再帰的および非再帰的トラバーサルアルゴリズムテンプレート

[[423968]] Leetcode を実践するには、いくつかのアルゴリズム テンプレートを知って...

認知的ブレークスルー II: 人工知能の時代に私たちが経験している社会的、文化的変化

人類はアフリカでホモ・サピエンスとして誕生して以来、約50万年にわたる進化の過程を経てきました。人類...

...

制御可能な人工知能には未来がある

8月29日、2019年世界人工知能会議が上海で開幕した。世界各国の著名なテクノロジー企業や学界、産業...

AIGCの投資刺激策のおかげで、マイクロソフトとグーグルのクラウドコンピューティング事業は大幅に成長した

MicrosoftとGoogleはAI市場の支配を競っており、両社ともAIハードウェアに多額の投資を...

自動車業界における人工知能の5つの主要な応用

[51CTO.com からのオリジナル記事] 自動車業界における人工知能の応用を考えるとき、最初に思...

人工知能について知っておくべき12の秘密

人類は、自分たちの仕事を担ってくれる全知全能のエルフを持つことを常に夢見てきました。現在、研究室のコ...

...

ロボットを活用する3つの革新的な方法

ロボット産業は創業以来、大幅な収益成長を遂げてきました。 2023年までに、世界のロボット市場は年間...

2021年中国の人工知能産業市場規模とサブ産業の市場予測分析

人工知能は、人間による情報の統合、データの分析、機械の助けを借りた洞察の獲得のプロセスを再構築し、人...

...

エッジAIの台頭

「今日のテクノロジーの世界では、クラウドにおける AI とエッジにおける AI の統合が重要です」と...

歯科サービスを変える人工知能の6つのトレンド

ロボット歯科医はすでに存在するのでしょうか?まだ……。しかし、歯科医院では、日常的なケアに新しい技術...

顔認識:攻撃の種類となりすまし防止技術

コンピュータサイエンスとエレクトロニクスの急速な発展により、顔認証は現在、指紋に次いで世界第2位の市...