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.
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.
Yanıtlar:
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.
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.
İlk olarak, BFS'yi daha genel ağırlıklı grafik nasıl uyarlayabiliriz ?
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 .
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 ' .
İkinci olarak, yapar Dijkstra algoritması ne dönüştürülmüş grafikte BFS yendi G ' ?
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.
Üçü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)
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.