Kapan saya harus menggunakan Kruskal sebagai lawan dari Prim (dan sebaliknya)?

Jawaban:

201

Gunakan algoritma Prim ketika Anda memiliki grafik dengan banyak sisi.

Untuk grafik dengan V sudut E tepi, algoritma Kruskal berjalan dalam waktu O (E log V) dan algoritma Prim dapat berjalan dalam waktu diamortisasi O (E + V log V) , jika Anda menggunakan Fibonacci Heap .

Algoritma Prim secara signifikan lebih cepat dalam batas ketika Anda memiliki grafik yang sangat padat dengan lebih banyak tepi daripada simpul. Kruskal berkinerja lebih baik dalam situasi khusus (grafik jarang) karena menggunakan struktur data yang lebih sederhana.

Todd Gamblin
sumber
8
Saya akan mengatakan "situasi khas" bukan rata-rata .. Saya pikir ini adalah istilah yang tidak jelas untuk digunakan, misalnya apa "ukuran rata-rata" dari tabel hash? tidak ada ide.
yairchu
2
@SplittingField: Saya yakin Anda membandingkan apel dan jeruk. Analisis diamortisasi adalah cara sederhana untuk mendapatkan pengukuran fungsi (sehingga untuk berbicara) --- apakah itu kasus terburuk atau rata-rata kasus tergantung pada apa yang Anda buktikan. Bahkan (seperti yang saya lihat sekarang), artikel wiki menggunakan bahasa yang menyiratkan bahwa itu hanya digunakan untuk analisis kasus terburuk. Sekarang, menggunakan analisis seperti itu berarti bahwa Anda tidak dapat membuat janji sekuat tentang biaya operasi tertentu, tetapi pada saat algoritma dilakukan, itu memang akan oleh O (E + VlogV), bahkan yang terburuk.
agorenst
10
Itu kedengarannya bagus secara teori, tetapi saya bertaruh beberapa orang dapat menerapkan Fibonacci heap
Alexandru
2
@tgamblin, mungkin ada tepi C (V, 2) yang terburuk. Jadi, bukankah waktu penyelesaian algoritma Prim bermuara ke O (V ^ 2 + VlogV) yaitu O (V ^ 2) dalam kasus tumpukan heap?
Green goblin
7
Ada juga faktor penting lainnya: output Prims adalah MST hanya jika grafik terhubung (output menurut saya tidak ada gunanya), tetapi output Kruskal adalah hutan Spanning Minimum (dengan beberapa penggunaan).
Andrei I
102

Saya menemukan utas yang sangat bagus di internet yang menjelaskan perbedaannya dengan cara yang sangat mudah: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

Algoritma Kruskal akan menumbuhkan solusi dari tepi termurah dengan menambahkan tepi termurah berikutnya, asalkan tidak menciptakan siklus.

Algoritma Prim akan menumbuhkan solusi dari titik acak dengan menambahkan titik termurah berikutnya, titik yang saat ini tidak ada dalam solusi tetapi terhubung ke sana oleh tepi termurah.

Terlampir di sini adalah lembar menarik tentang topik itu.masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini

Jika Anda menerapkan Kruskal dan Prim, masing-masing dalam bentuk optimal: dengan gabungan serikat dan tumpukan finbonacci, maka Anda akan mencatat bagaimana Kruskal mudah diterapkan dibandingkan dengan Prim.

Prim lebih sulit dengan tumpukan fibonacci terutama karena Anda harus mempertahankan tabel pembukuan untuk merekam tautan dua arah antara simpul grafik dan simpul tumpukan. Dengan Union Find, itu kebalikannya, strukturnya sederhana dan bahkan dapat menghasilkan langsung mst tanpa biaya tambahan.

Snicolas
sumber
2
Nitpick: Terakhir 'slide' di masing-masing harus membaca "ulangi sampai Anda memiliki pohon spanning"; tidak sampai MST, yang merupakan tugas rekursif - bagaimana saya tahu itu minimal - itu sebabnya saya mengikuti Prim's / Kruskal untuk memulai!
OJFord
@OllieFord Saya menemukan utas ini karena telah mencari ilustrasi sederhana algoritma Prim dan Kruskal. Algoritma menjamin bahwa Anda akan menemukan pohon dan pohon itu adalah MST. Dan Anda tahu bahwa Anda telah menemukan pohon ketika Anda memiliki tepi yang tepat V-1 .
mikedu95
@ mikedu95 Anda benar, membuat poin yang sama dengan komentar saya sebelumnya dari sudut yang berbeda.
OJFord
Tapi bukankah itu merupakan prasyarat bahwa Anda hanya harus memilih dengan satu bobot antar simpul, Anda tidak dapat memilih bobot 2 lebih dari sekali dari grafik di atas, Anda harus memilih bobot berikutnya, misalnya: 3 @Snicolas
ani0904071
30

Saya tahu bahwa Anda tidak meminta ini, tetapi jika Anda memiliki lebih banyak unit pemrosesan, Anda harus selalu mempertimbangkan algoritma Borůvka , karena itu mungkin mudah diparalelkan - karenanya ia memiliki keunggulan kinerja dibandingkan dengan algoritma Kruskal dan Jarník-Prim.

malejpavouk
sumber
23

Kruskal dapat memiliki kinerja yang lebih baik jika ujungnya dapat diurutkan dalam waktu linier, atau sudah diurutkan.

Prim lebih baik jika jumlah tepi ke simpul tinggi.

Daniel C. Sobral
sumber
19

Kruskal waktu kompleksitas kasus terburuk adalah O (E log E) , ini karena kita perlu mengurutkan tepi. Prim waktu kompleksitas kasus terburuk adalah O (E log V) dengan antrian prioritas atau bahkan lebih baik, O (E + V log V) dengan Fibonacci Heap . Kita harus menggunakan Kruskal ketika grafiknya tipis, jumlah tepi yang kecil, seperti E = O (V), ketika tepinya sudah diurutkan atau jika kita bisa mengurutkannya dalam waktu linier. Kita harus menggunakan Prim ketika grafik padat, yaitu jumlah tepi tinggi, seperti E = O (V²).

Ghiurutan Alexandru
sumber
Tampak bagi saya bahwa Prim tidak pernah lebih buruk daripada Kruskal dalam hal kecepatan. Karena E harus setidaknya V-1 adalah ada pohon spanning. Saya pikir alasan kita lebih suka Kruskal untuk grafik yang jarang adalah karena struktur datanya sederhana.
Yu Gu
16

Jika kita menghentikan algoritme dalam algoritma prim tengah selalu menghasilkan pohon terhubung, tetapi kruskal di sisi lain dapat memberikan pohon atau hutan yang terputus

Prakhar
sumber
5

Salah satu aplikasi penting dari algoritma Kruskal adalah dalam pengelompokan tautan tunggal .

Pertimbangkan n simpul dan Anda memiliki grafik yang lengkap. Untuk memperoleh kelompok-kelompok n dari titik-titik tersebut. Algoritma run Kruskal pada tepi n- (k-1) pertama dari kumpulan tepi yang diurutkan. Anda mendapatkan k-cluster grafik dengan maksimum jarak.

Jaskaran
sumber
3

Waktu terbaik untuk Kruskal adalah O (E logV). Untuk Prim yang menggunakan tumpukan fib, kita bisa mendapatkan O (E + V lgV). Oleh karena itu pada grafik yang padat, Prim jauh lebih baik.

Leon Stenneth
sumber
2

Prim lebih baik untuk grafik yang lebih padat, dan dalam hal ini kita juga tidak perlu terlalu memperhatikan siklus dengan menambahkan keunggulan, karena kita terutama berurusan dengan node. Prim lebih cepat daripada Kruskal dalam hal grafik kompleks.

Sakshi
sumber
2

Dalam Algoritma kruskal kita memiliki jumlah sisi dan jumlah simpul pada grafik yang diberikan tetapi pada setiap sisi kita memiliki beberapa nilai atau bobot atas nama yang kita dapat menyiapkan grafik baru yang tidak boleh siklik atau tidak menutup dari sisi manapun Sebagai contoh

grafik seperti ini _____________ | | | | | | | __________ | | Beri nama untuk titik mana saja a, b, c, d, e, f.

Abhishek
sumber