Düğümleri yeniden yerleştirmek yerine azaltma anahtarını kullanmanın nedeni, öncelik kuyruğundaki düğüm sayısını küçük tutmak, böylece toplam öncelik kuyruğu sayısını küçük tutmak ve her bir öncelik kuyruğu bakiyesinin maliyetini düşük tutmaktır.
Dijkstra'nın düğümleri yeni öncelikleriyle öncelik sırasına yeniden yerleştiren algoritmasının bir uygulamasında, grafikteki her bir m kenarı için öncelik sırasına bir düğüm eklenir. Bu, öncelik kuyruğunda m kuyruğa alma işlemleri ve kuyruktan çıkarma işlemleri olduğu anlamına gelir ve toplam çalışma süresi O e + m T d ) verir, burada T e , öncelik kuyruğuna kuyruğa girmek için gereken süredir ve T d olan öncelik kuyruğundan çıkmak için gereken süre.
Dijkstra algoritmasının azaltma anahtarını destekleyen bir uygulamasında, düğümleri tutan öncelik sırası içindeki düğümlerle başlar ve algoritmanın her adımında bir düğümü kaldırır. Bu, toplam yığın kuyruk sayısının n olduğu anlamına gelir. Her bir düğüm, kendisine gelen her kenar için potansiyel olarak bir kez çağrılan bir azaltma anahtarına sahip olacaktır, bu nedenle yapılan toplam azaltma anahtarı sayısı en fazla m'dir. Bu, (n T e + n T d + m T k ) , burada T k , azaltma tuşunu çağırmak için gereken süredir.
Peki bunun çalışma zamanı üzerinde nasıl bir etkisi var? Bu, hangi öncelik sırasını kullandığınıza bağlıdır. İşte farklı öncelik sıralarını ve farklı Dijkstra algoritma uygulamalarının genel çalışma zamanlarını gösteren hızlı bir tablo:
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)
Gördüğünüz gibi, çoğu öncelik kuyruğu türlerinde, asimptotik çalışma zamanında gerçekten bir fark yoktur ve azaltma anahtarı sürümünün daha iyi sonuç vermesi olası değildir. Ancak, öncelik kuyruğunun Fibonacci yığın uygulamasını kullanırsanız , aslında Dijkstra'nın algoritması, azaltma anahtarını kullanırken asimptotik olarak daha verimli olacaktır.
Kısacası, azaltma anahtarı ve iyi bir öncelik kuyruğu kullanmak, Dijkstra'nın asimptotik çalışma zamanını, kuyruğa alma ve kuyruktan çıkarma yapmaya devam ederseniz mümkün olanın ötesine düşürebilir.
Bu noktanın yanı sıra, Gabow'un En Kısa Yollar Algoritması gibi bazı daha gelişmiş algoritmalar, Dijkstra'nın algoritmasını bir alt program olarak kullanır ve büyük ölçüde azaltma anahtarı uygulamasına dayanır. Geçerli mesafelerin aralığını önceden biliyorsanız, bu gerçeğe dayanarak süper verimli bir öncelik sırası oluşturabileceğiniz gerçeğini kullanırlar.
Bu yardımcı olur umarım!