ノードを再挿入するのではなく減少キーを使用する理由は、優先キュー内のノードの数を少なくして、優先キューのデキューの総数を少なくし、各優先キューのコストを低く抑えるためです。
新しい優先度でノードを優先度キューに再挿入するダイクストラのアルゴリズムの実装では、グラフ内のm個のエッジのそれぞれについて、1つのノードが優先度キューに追加されます。つまり、優先キューにはm個のエンキュー操作とm個のデキュー操作があり、合計実行時間はO(m T e + m T d)になります。ここで、T eは優先キューにエンキューするのに必要な時間で、T dは優先キューからデキューするのに必要な時間。
減少キーをサポートするダイクストラのアルゴリズムの実装では、ノードを保持する優先度キューは、nノードで始まり、アルゴリズムの各ステップで1つのノードを削除します。これは、ヒープデキューの総数がnであることを意味します。各ノードには、それにつながる各エッジに対して1回ずつ減少キーが呼び出される可能性があるため、実行される減少キーの総数は最大でmです。これにより、(n T e + n T d + m T k)のランタイムが得られます。ここで、T kは減少キーを呼び出すのに必要な時間です。
では、これはランタイムにどのような影響を与えるのでしょうか?これは、使用する優先キューによって異なります。以下は、さまざまな優先キューと、さまざまなダイクストラのアルゴリズム実装の全体的な実行時間を示す簡単な表です。
Queue | T_e | T_d | T_k | w/o Dec-Key | w/Dec-Key
---------------+--------+--------+--------+-------------+---------------
Binary Heap |O(log N)|O(log N)|O(log N)| O(M log N) | O(M log N)
Binomial Heap |O(log N)|O(log N)|O(log N)| O(M log N) | O(M log N)
Fibonacci Heap | O(1) |O(log N)| O(1) | O(M log N) | O(M + N log N)
ご覧のように、ほとんどのタイプの優先度キューでは、漸近ランタイムに実際の違いはなく、Decrease-Keyバージョンの方がはるかに優れているとは言えません。ただし、優先度キューのフィボナッチヒープ実装を使用する場合、実際に減少キーを使用すると、ダイクストラのアルゴリズムが漸近的に効率的になります。
つまり、reduce-keyと適切な優先度キューを使用すると、エンキューとデキューを続けた場合に可能なことを超えて、ダイクストラの漸近ランタイムがドロップされる可能性があります。
この点に加えて、Gabowの最短パスアルゴリズムなどのいくつかのより高度なアルゴリズムは、サブルーチンとしてダイクストラのアルゴリズムを使用し、減少キーの実装に大きく依存しています。有効な距離の範囲が事前にわかっている場合は、その事実に基づいて非常に効率的な優先キューを作成できるという事実を使用します。
お役に立てれば!