Apakah versi algoritma Kruskal yang padat ini terkenal?

15

Sekitar setahun yang lalu, seorang teman dan saya memikirkan cara untuk mengimplementasikan algoritma Kruskal untuk grafik padat di lebih baik daripada terikat biasa (tanpa mengasumsikan tepi pre-sortir). Secara khusus, kami mencapai dalam semua kasus, mirip dengan Prim ketika diimplementasikan menggunakan matriks kedekatan.Θ ( n 2 )HAI(mcatatanm)Θ(n2)

Saya telah memposting sedikit tentang algoritma di blog saya , termasuk kode C ++ dan tolok ukur, tapi inilah ide umum:

  • Pertahankan satu simpul representatif untuk setiap komponen yang terhubung. Awalnya, semua node mewakili diri mereka sendiri.

  • Pertahankan vektor dist[i]sedemikian rupa sehingga, untuk setiap komponen i, memiliki insiden tepi penyilangan komponen paling ringan i.

  • Ketika menemukan tepi paling ringan yang melintasi partisi, cukup temukan iyang meminimalkan bobot dist[i], dalam waktu linier.

  • Saat menggabungkan dua komponen dan c j , ubah matriks adjacency A , sehingga sekarang A i , k = min { A i , k , A j , k } untuk semua komponen k , dan tandai sebagai tidak lagi mewakili komponennya komponen yang terhubung (hanya sekarang akan tetap).csayacjSEBUAHSEBUAHsaya,k=min{SEBUAHsaya,k,SEBUAHj,k}ksayaj

Dengan demikian, pengontrakan tepi teringan dan penemuan tepi tersebut dapat dilakukan dalam waktu linier. Kami melakukan ini kali untuk menemukan MST. Dibutuhkan sedikit pembukuan untuk benar-benar menemukan sisi mana yang ingin kita tambahkan ke MST, tetapi tidak menambah kerumitan. Jadi runtime adalah . Implementasinya hanya beberapa untuk loop.n-1Θ(n2)

Apakah versi Kruskal ini terkenal dalam literatur?

Federico Lebrón
sumber

Jawaban:

19

HAI(n2)HAI(n2)

  1. Gunakan Prim – Dijkstra – Jarník sebagai gantinya dan kemudian urutkan tepi untuk mendapatkan urutan penyisipan yang akan diberikan Kruskal, atau

  2. Gunakan struktur data pasangan terdekat quadtree yang dijelaskan dalam makalah, melihat Kruskal sebagai prosedur pengelompokan aglomeratif standar di mana kami menggabungkan dua kluster terdekat menjadi supercluster pada setiap langkah, dengan "terdekat" didefinisikan sebagai panjang tepi terpendek yang menghubungkan dua kluster. .

Solusi 2 serupa dalam semangat dengan apa yang Anda gambarkan tetapi rincian tentang cara melacak jarak antar cluster sedikit berbeda. Anda menyimpan minima baris-bijaksana dari matriks jarak cluster, memungkinkan Anda untuk memindai daftar baris-minima ini dalam waktu linier untuk menemukan minimum global, sementara makalah saya melapisi quadtree pada matriks yang sama dan melacak minimum di setiap kuadratree persegi. Metode Anda lebih sederhana, tetapi kurang fleksibel untuk beberapa masalah pasangan dinamis terdekat lainnya (itu tergantung pada fakta bahwa menggabungkan dua kelompok menyebabkan jarak mereka ke kelompok lain menurun, berlaku untuk masalah ini tetapi tidak harus untuk yang lain).

HAI(n2)HAI(n2)HAI(n)

David Eppstein
sumber