Floyd-Warshall, Dijkstra ve Bellman-Ford algoritmaları arasındaki farklar konusunda haklı mıyım?


16

Üçünü inceledim ve çıkarımlarımı aşağıda belirtiyorum. Birisi bana bunları yeterince doğru anlayıp anlamadığımı söyleyebilir mi? Teşekkür ederim.

  1. Dijkstra algoritması yalnızca tek bir kaynağınız olduğunda ve bir düğümden diğerine en küçük yolu bilmek istediğinizde kullanılır, ancak bu gibi durumlarda başarısız olur .

  2. Floyd-Warshall algoritması , tüm düğümlerden herhangi biri kaynak olabiliyorsa kullanılır, böylece en kısa mesafenin herhangi bir kaynak düğümden herhangi bir hedef düğüme ulaşmasını istersiniz. Bu sadece negatif döngüler olduğunda başarısız olur.

  3. Bellman-Ford , tek bir kaynak olduğunda Dijkstra gibi kullanılır. Bu negatif ağırlıkları kaldırabilir ve çalışması tek bir kaynak hariç Floyd-Warshall ile aynıdır, değil mi? (En az emin olduğum bu.)


Hoşgeldiniz! Gereksiz kod parçalarını düzenledim; kullanıcılar kendi başlarına Wikipedia'ya tıklayabilir veya en sevdikleri ders kitaplarındaki algoritmaları kontrol edebilir. Sorunuzun sorulması tuhaf bir soru olduğuna dikkat edin, çünkü "evet" yanıtı başka bir şeyden oluşabilir.
Raphael

Yanıtlar:


23

Dijkstra'nın algoritması yalnızca tek bir kaynağınız olduğunda ve bir düğümden diğerine en küçük yolu bilmek istediğinizde kullanılır, ancak başarısız olur [negatif kenarlı grafiklerde]

ssprevious[v]v

Dijkstra algoritmasının negatif kenarlı grafiklerde davranışı, tartışılan kesin değişkene bağlıdır. Algoritmanın bazı varyantları, Wikipedia'daki gibi, her zaman hızlı çalışır, ancak negatif kenarlar olduğunda en kısa yolları doğru hesaplamaz. Bu ders notlarındaki gibi diğer varyantlar her zaman en kısa yolları doğru olarak hesaplar (kaynaktan ulaşılabilen negatif bir döngü yoksa), ancak negatif kenarlar varsa en kötü durumda üssel süre gerektirebilir.

Floyd-Warshall'ın algoritması, tüm düğümlerden herhangi biri bir kaynak olduğunda kullanılır, bu nedenle en kısa mesafenin herhangi bir kaynak düğümden herhangi bir hedef düğüme ulaşmasını istersiniz. Bu sadece negatif döngüler olduğunda başarısız olur.

Bu doğru. Floyd-Warshall, tüm çiftler arasındaki en kısa yol algoritmasının bir örneğidir , yani her bir düğüm çifti arasındaki en kısa yolları hesaplar . Başka bir örnek "her bir v düğümü için, kaynak düğüm olarak Dijkstra'yı v ile çalıştırın". Birkaç tane daha var.

Bellman-Ford, tek bir kaynak olduğunda Dijkstra'nınki gibi kullanılır. Bu negatif ağırlıkları kaldırabilir ve çalışması tek bir kaynak hariç Floyd-Warshall'ınkiyle aynıdır, değil mi?

Ö(V3)Ö(V2E)Ö(VE)

Daha fazla ayrıntı için, en sevdiğiniz algoritmalar ders kitabına başvurun. (Bunu yapmak zorunda Eğer bir favori algoritmalar ders kitabı değil mi?)


En sevdiğiniz algoritmalar ders kitabını paylaşmak ister misiniz?
Abdul


@Abdul yemledi. - MIT / Stanford'da kullanılan ders kitabı T. Cormen ve ark. Algoritmalara Giriş. Cornell'de kullanılan ders kitabı J. Kleinberg ve diğerleri Algorithm Design'dır. cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/…
AffluentOwl

2

Her üç algoritma da Prof. Jaehyun Park'ın (Stanford Üniversitesi) ders slaytlarında yer almaktadır. İşte En Kısa Yol Algoritmaları linki


Bu, farklılıklar hakkındaki soruya cevap vermez ve bağımsız değildir, sadece özetsiz bir bağlantı iyi cevap olarak sayılmaz. Ayrıca, mevcut cevaplardan daha fazlasını kapsamadığı için gereksiz görünüyor.
Evil

1

En kısa yol sorunundaki Wikipedia sayfasında iki farklı sorun açıklanmaktadır: SSSP ve APSP.

Tek kaynaklı en kısa yol (SSSP):

  • Dijkstra'nın algoritması: tek kaynaklı en kısa yol problemini çözer.
    • Kısıtlamalar: Yalnızca işleyemediği negatif kenarlar.
    • Ağırlıksız grafikler: Dijkstra'lar BFS ile aynıdır.
  • Bellman-Ford algoritması: kenar ağırlıkları negatif olabilirse tek kaynaklı sorunu çözer. Bu, şimdi negatif ağırlıkları da kaldırabildiği Dijkstra'daki iyileştirmedir.

En kısa yol çifti (APSP):

  • Floyd – Warshall algoritması: tüm çiftleri en kısa yolları çözer. Hem pozitif hem de negatif kenarları işler.
    • Kısıtlamalar: Negatif döngüler ele alınamaz.

Bu nedenle, Floyd – Warshall, BFS ile aynı değildir, ancak altta yatan metodoloji aynı dinamik programlamadır.


1

Belki de bu bir cevaptan ziyade bir yorum olmalıdır, ancak diğer algoritmaların bahsetmediği bu algoritmalar arasındaki bir ayrımdır.

İnsanlar Floyd'un algoritması Floyd-Warshall'ı arama eğilimindedir , ancak Floyd'un ve Warshall'ın algoritmaları aynı değildir.

Ö(1)Ö(n2)

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.