SORU
13 ŞUBAT 2012, PAZARTESİ


Neden Dijkstra'In algoritması kullanmak-anahtar azaltıyor mu?

Dijkstra'nın algoritması için aşağıdaki bendim olarak öğretildi

while pqueue is not empty:
    distance, node = pqueue.delete_min()
    if node has been visited:
        continue
    else:
        mark node as visited
    if node == target:
        break
    for each neighbor of node:
         pqueue.insert(distance   distance_to_neighbor, neighbor)

Ancak algoritma ile ilgili biraz okuma yaptım ve işime görmek versiyonunu Ekle aksine azaltmak-anahtar.

Bu yüzden, iki yaklaşım arasındaki farklar nelerdir?

CEVAP
13 ŞUBAT 2012, PAZARTESİ


Bu nedenle kullanarak azaltmak-anahtar yerine geri takmadan düğümleri tutmak numarası düğümlerin öncelik sırası küçük, böylece azalan toplam sayısı, öncelik sırası dequeues küçük ve maliyeti her bir öncelik sırası dengesi düşük.

Yeni öncelikleri ile öncelikli sıraya düğümleri reinserts bu dijkstra'nın algoritması uygulaması, bir düğüm grafikte m kenarları her biri için öncelik sırasına eklenir. Bu öncelik sırası, O toplam çalışma zamanı(m T . veren m enqueue işlemleri ve m sıradan çıkarma işlemleri var demektir ^alt>em TdT.), ^alt>ezaman öncelik sırası ve T içine enqueue için gereklidirdzaman önceliği sıradan sıradan çıkarma için gereklidir.

Düşüş-anahtar destekleyen dijkstra'nın algoritması uygulaması, öncelik sırasına düğümleri holding algoritmanın her adımında ve n düğüm ile başlar kaldırır bir düğüm. Bu yığın dequeues sayısı n olduğu anlamına gelir. Her düğüm azaltmak-key azaltmak-anahtarları yapılır toplam sayısı m en fazla yani her kenarı içine lider için potansiyel bir kez aradı. Bu (n T . bir çalışma zamanı verir ^alt>en Tdm TkT.), ^alt>kzaman aramak için gerekli anahtar azalma.

Ne etkisi bu çalışma zamanı var mı? Bu kullanma sırası ne bağlıdır. Burada farklı bir öncelik sırası ve farklı dijkstra'nın algoritması uygulamaları genel çalışma zamanları gösteren hızlı 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)

Öncelik kuyrukları çoğu türleri ile gördüğünüz gibi, gerçekten asimptotik çalışma zamanında bir fark yok, ve düşüş-anahtar sürüm çok daha iyi yapmak olası değildir. Eğer öncelik sırası Fibonacci heap bir uygulama kullanırsanız, ancak, o zaman gerçekten dijkstra'nın algoritması sınıfları azaltmak-anahtar kullanıldığında daha verimli olacaktır.

Kısacası azaltmak-anahtar kullanarak, artı iyi bir öncelik sırası, eğer enqueues ve dequeues yapmaya devam edersen mümkün olanın ötesinde dijkstra'nın asimptotik çalışma zamanı bırakabilir.

Bu noktada ayrıca, bazı daha gelişmiş algoritmalar, Gabow. en Kısa yol Algoritması gibi bir yordam olarak dijkstra'nın algoritması kullanmak ve ağır azaltmak-anahtar uygulaması güveniyor. Eğer önceden geçerli mesafeleri aralığını biliyorsanız, süper verimli bir önceliği olan gerçeklere dayalı bir sıra oluşturabilirsiniz gerçeğini kullanırlar.

Bu yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • George McCarron

    George McCar

    29 Mayıs 2013
  • HTC

    HTC

    12 Ocak 2006
  • Unbox Therapy

    Unbox Therap

    21 Aralık 2010