Apakah algoritma Dijkstra hanya BFS dengan antrian prioritas?

22

Menurut halaman ini , algoritma Dijkstra hanyalah BFS dengan antrian prioritas. Apakah sesederhana itu? Saya pikir tidak.

Barry Fruitman
sumber
1
Mengapa kamu berpikir begitu?
Raphael
@ Raphael Karena tampaknya terlalu sederhana, dan itu adalah: Saya mempelajarinya lagi dan saya melihat sekarang tidak melacak jarak antara node, jadi itu benar-benar BFS, bukan Dijkstra.
Barry Fruitman
1
Yah, Dijkstra tidak mengubah nilai-nilai antrian "diurutkan" dengan (sering disebut "relaksasi"); jika Anda melarang itu, itu tidak sama, benar.
Raphael

Jawaban:

20

Anda dapat mengimplementasikan algoritma Dijkstra sebagai BFS dengan antrian prioritas (meskipun itu bukan satu-satunya implementasi).

Algoritma Dijkstra bergantung pada properti bahwa jalur terpendek dari ke juga jalur terpendek ke salah satu simpul di sepanjang jalur. Inilah yang dilakukan BFS.tst

Atau dalam perspektif lain: bagaimana algoritma Dijkstra akan berperilaku jika semua bobotnya 1? Persis seperti BFS.

Shaull
sumber
4

Pertama, bagaimana kita mengadaptasi BFS ke grafik tertimbang yang lebih umum ?G=(V,E)

Berikut adalah ide dari buku "Algoritma (Bagian 4.4)" oleh Dasgupta et al:

Untuk setiap tepi dari (dengan bobot ), ganti dengan tepi dengan panjang , dengan menambahkan dummy node antara u dan v .E l e l e 1 l e - 1e=(u,v)Elele1le1uv

Akibatnya, tepi grafik hasil semuanya memiliki panjang satuan. Oleh karena itu, kita dapat menghitung jarak dalam G dengan menjalankan BFS pada G .GGG

Kedua, bagaimana algoritma Dijkstra pada mengalahkan BFS pada grafik transformasi G ?GG

BFS pada dapat benar-benar lambat jika beberapa l e besar karena limbah terlalu banyak waktu di jarak ke simpul boneka komputasi yang kita tidak peduli tentang sama sekali. Algoritma Dijkstra menghindari hal ini dengan menetapkan jarak perkiraan untuk node dan membuat mereka rileks jika memungkinkan.Gle

Ketiga, bagaimana perilaku algoritma Dijkstra pada grafik tidak tertimbang?

Berperilaku persis sama dengan BFS. Kami menguraikan ini dari dua poin utama.

  • Pada "relaksasi".

    Untuk algoritma Dijkstra pada grafik umum, tertimbang, relaksasi adalah

    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
    
  • Pada "antrian prioritas".

    Ketika algoritma Dijkstra dijalankan pada grafik tidak berbobot, setiap saat, antrian prioritas berisi paling banyak dua nilai (jarak) yang berbeda. Oleh karena itu, antrian FIFO BFS sudah mencukupi.

Hengxin
sumber