Kruskal'ı Prim'in aksine ne zaman kullanmalıyım (ya da tam tersi)?


Yanıtlar:


201

Çok sayıda kenara sahip bir grafiğiniz olduğunda Prim'in algoritmasını kullanın.

V köşeleri E kenarları olan bir grafik için , Kruskal'ın algoritması O (E log V) zamanında çalışır ve bir Fibonacci Heap kullanıyorsanız Prim algoritması O (E + V log V) amortisman süresi içinde çalışabilir .

Köşelerden çok daha fazla kenara sahip gerçekten yoğun bir grafiğe sahip olduğunuzda Prim'in algoritması sınırda önemli ölçüde daha hızlıdır. Kruskal, daha basit veri yapıları kullandığı için tipik durumlarda (seyrek grafikler) daha iyi performans gösterir.


8
Ortalama yerine "tipik durumlar" diyebilirim. Bence bu kullanımı belirsiz bir terim, örneğin bir karma tablonun "ortalama boyutu" nedir? fikrim yok.
yairchu

2
@SplittingField: Elma ve portakalları karşılaştırdığınıza inanıyorum. İtfa edilmiş analiz, fonksiyonun bir ölçümünü almanın bir yoludur (tabiri caizse) - en kötü durum mu yoksa ortalama durum mu kanıtladığınıza bağlıdır. Aslında (şimdi baktığımda), wiki makalesi sadece en kötü durum analizi için kullanıldığını ima eden bir dil kullanıyor . Şimdi, böyle bir analiz kullanmak, belirli bir işlemin maliyeti hakkında güçlü vaatler veremeyeceğiniz anlamına gelir, ancak algoritma yapıldığında, aslında O (E + VlogV), en kötü durumda bile olacaktır.
agorenst

10
Teoride kulağa hoş geliyor, ama bahse girerim az insan Fibonacci yığınını uygulayabilir
Alexandru

2
@ tgamblin, en kötü durumda C (V, 2) kenarlar olabilir. Peki, fibonacci yığını durumunda Prim algoritmasının zaman komplikasyonu O (V ^ 2 + VlogV) yani O (V ^ 2) ile sınırlı değil mi?
Yeşil cin

7
Bir başka önemli faktör daha var: Prims çıkışı yalnızca grafik bağlıysa (çıkış bana başka türlü kullanmıyor gibi görünüyorsa) bir MST'dir, ancak Kruskal'ın çıkışı Minimum Yayılma ormanlarıdır (bazı kullanımlarla).
Andrei I

102

Netlikte farkı çok basit bir şekilde açıklayan çok güzel bir iplik buldum: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

Kruskal'ın algoritması, bir döngü oluşturmaması koşuluyla bir sonraki en ucuz kenarı ekleyerek en ucuz kenardan bir çözüm üretecektir.

Prim'in algoritması, bir sonraki en ucuz tepe noktasını, şu anda çözümde bulunmayan ancak en ucuz kenara bağlanan tepe noktasını ekleyerek rastgele bir tepe noktasından bir çözüm geliştirecektir.

Burada, bu konuyla ilgili ilginç bir sayfa var.resim açıklamasını buraya girinresim açıklamasını buraya girin

Hem Kruskal hem de Prim'i en uygun şekilde uygularsanız: sırasıyla bir birleşim bulması ve bir finbonacci yığını ile, Kruskal'ın Prim'e kıyasla nasıl uygulanmasının kolay olduğunu not edeceksiniz.

Prim, bir fibonacci öbeği ile daha zordur, çünkü grafik düğümleri ve yığın düğümleri arasındaki iki yönlü bağlantıyı kaydetmek için bir kitap tutma tablosu tutmanız gerekir. Bir Union Find ile tam tersi, yapı basittir ve hatta neredeyse hiçbir ek ücret ödemeden doğrudan mst üretebilir.


2
Nitpick: Her birindeki son 'slayt', "genişleyen bir ağaca sahip olana kadar tekrarla" yazmalıdır; MST'ye kadar, özyinelemeli bir görevdir - asgari olduğunu nasıl bilebilirim - bu yüzden Prim / Kruskal'ları takip ediyorum!
OJFord

@OllieFord Prim ve Kruskal algoritmalarının basit bir resmini aradığınız için bu konuyu buldum. Algoritmalar bir ağaç bulacağınızı ve o ağacın bir MST olduğunu garanti eder. Ve tam V-1 kenarlarınız olduğunda bir ağaç bulduğunuzu biliyorsunuz .
mikedu95

@ mikedu95 Doğru, önceki yorumumla aynı noktayı farklı bir açıdan yapıyorsunuz.
OJFord

Ancak, yalnızca köşeler arasında tek bir ağırlıkla seçmeniz gereken bir ön koşul değil, yukarıdaki grafikten bir kereden fazla 2 ağırlığı seçemezsiniz, bir sonraki ağırlığı seçmelisiniz: 3 @Snicolas
ani0904071

30

Bunu istemediğinizi biliyorum, ancak daha fazla işlem biriminiz varsa, Borůvka'nın algoritmasını her zaman düşünmelisiniz , çünkü kolayca paralelleştirilebilir - bu nedenle Kruskal ve Jarník-Prim algoritmasına göre bir performans avantajı vardır.


23

Kenarlar doğrusal sürede sıralanabilir veya zaten sıralanmışsa, Kruskal daha iyi performans gösterebilir.

Köşelere kadar kenar sayısı yüksekse astar daha iyidir.


19

Kruskal zaman karmaşıklığı en kötü durum O (E log E) , çünkü kenarları sıralamamız gerekiyor. Prim zaman karmaşıklığı en kötü durum öncelik kuyruğuna sahip O (E log V) veya daha iyisi, Fibonacci Heap ile O (E + V log V) . Grafik seyrekken, E = O (V) gibi küçük sayıda kenarda, kenarlar zaten sıralandığında veya bunları doğrusal zamanda sıralayabiliyorsak Kruskal'ı kullanmalıyız. Grafik yoğun olduğunda Prim kullanmalıyız, yani kenar sayısı yüksek, E = O (V²) gibi.


Bana göre Prim asla Kruskal'ın hızından daha kötü değildir. E en azından V-1 olması gerektiğinden yayılan bir ağaç vardır. Bence seyrek bir grafik için Kruskal'ı tercih etmemizin nedeni, veri yapısının çok basit olmasıdır.
Yu Gu

16

Orta primin algoritmasında algoritmayı durdurursak her zaman bağlı ağaç üretir, ancak diğer taraftan kruskal bağlantısı kesilmiş ağaç veya orman verebilir


5

Kruskal'ın algoritmasının önemli bir uygulaması tek bağlantı kümelemedir .

N köşe noktasını düşünün ve tam bir grafiğiniz var. Bu n noktanın ak kümelerini elde etmek için. Kruskal'ın algoritmasını sıralı kenar kümesinin ilk n- (k-1) kenarları üzerinde çalıştırın. aralık.


3

Kruskal'lar için en uygun zaman O (E logV). Prim'in fib yığınlarını kullanması için O (E + V lgV) alabiliriz. Bu nedenle, yoğun bir grafikte Prim'ler çok daha iyidir.


2

Prim'ler daha yoğun grafikler için daha iyidir ve bu da öncelikle düğümlerle uğraştığımız için bir kenar ekleyerek döngülere çok dikkat etmemiz gerekmez. Prim'ler, karmaşık grafikler söz konusu olduğunda Kruskal'dan daha hızlıdır.


2

Kruskal Algoritmasında belirli bir grafikte kenar sayısı ve köşe sayısı vardır, ancak her kenarda, döngüsel olmaması veya herhangi bir taraftan yakın olmaması gereken yeni bir grafik hazırlayabileceğimiz bir miktar veya ağırlık var.

böyle grafik _____________ | | | | | | | __________ | | A, b, c, d, e, f köşelerine isim verin.

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.