Dijkstra'nın algoritması sadece öncelik sırası olan BFS mi?


22

Bu sayfaya göre , Dijkstra'nın algoritması sadece öncelik sırasına sahip BFS'dir. Gerçekten bu kadar basit mi? Bence değil.


1
Neden böyle düşünüyorsun?
Raphael

@Raphael Çok basit göründüğünden ve öyle: Tekrar inceledim ve şimdi düğümler arasındaki mesafeyi takip etmediğini görüyorum, bu yüzden gerçekten bir BFS, Dijkstra değil.
Barry Fruitman

1
Eh, Dijkstra yapar kuyruk (genellikle sözde "gevşeme") ile "kriteri" olduğu değerleri değiştirmek; bunu yasaklarsanız, bu aynı değil, doğru.
Raphael

Yanıtlar:


20

Dijkstra'nın algoritmasını öncelik sırası ile BFS olarak uygulayabilirsiniz (tek uygulama olmasa da).

Dijkstra algoritması en kısa yolu bu özelliği dayanır için t , aynı zamanda yol boyunca herhangi bir köşe için en kısa yoldur. BFS tam olarak bunu yapar.st

Ya da başka bir bakış açısıyla: tüm ağırlıklar 1 olsaydı Dijkstra'nın algoritması nasıl davranırdı? Aynen BFS gibi.


4

İlk olarak, BFS'yi daha genel ağırlıklı grafik nasıl uyarlayabiliriz ?G=(V,E)

Dasgupta ve ark.'nın "Algoritmalar (Bölüm 4.4)" kitabından bir fikir:

Herhangi bir kenar için ve E (ağırlık ile L e ) tarafından yerine l e uzunlukta kenarları 1 eklenmesiyle, l e - 1 arasında bulunan bir taklit düğümleri u ve v .e=(u,v)Elele1le1uv

Bunun bir sonucu olarak, sonuç grafik kenarları tüm birim uzunluğuna sahiptir. Bu nedenle, biz mesafeleri hesaplayabilir G üzerinde BFS'ye çalıştırarak G ' .GGG

İkinci olarak, yapar Dijkstra algoritması ne dönüştürülmüş grafikte BFS yendi G ' ?GG

BFS bazı eğer gerçekten yavaş olabilir l e biz hiç umurumda değil o kukla düğümlerine mesafeleri hesaplamak çok fazla zaman harcar, çünkü büyük. Dijkstra algoritması, düğümler için tahmini mesafeleri ayarlayarak ve mümkün olduğunda onları gevşeterek bunu önler.Gle

Üçüncüsü, Dijkstra algoritması ağırlıksız grafiklerde nasıl davranır?

BFS'nin yaptığı gibi davranır. Bunu iki önemli noktadan ele alıyoruz.

  • "Gevşeme".

    Genel, ağırlıklı grafikte Dijkstra algoritması için gevşeme

    for all edges (u,v) in E:
        if dist(v) > dist(u) + w(u,v)
           dist(v) = dist(u) + w(u,v)
    

    dist(v)=w(u,v)=1

    for all edges (u,v) in E:
        if dist(v) = \infty
           dist(v) = dist(u) + 1
    
  • "Öncelik kuyruğunda".

    Dijkstra algoritması ağırlıksız grafik üzerinde çalıştırıldığında, herhangi bir zamanda öncelik sırası en fazla iki farklı (mesafe) değer içerir. Bu nedenle, bir FIFO BFS sırası yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.