Menu
Coddy logo textTech

Kruskal Algoritması

Son güncelleme

Kruskal algoritması bir minimum yayılım ağacı (MST) oluşturur - tüm düğümleri döngü olmadan bağlayan en ucuz kenar kümesi. Tüm kenarları ağırlığa göre sıralar, ardından henüz bağlı olmayan iki düğümü birleştirdiği sürece bir sonraki en ucuz kenarı açgözlülükle ekler. Ağacın bir seferde bir güvenli ve ucuz kenarla büyümesini izlemek için yukarıda oynat'a basın.

"Zaten bağlı mı?" kontrolü bir union-find (ayrık küme) veri yapısıyla yapılır: bir kenarın iki uç noktası zaten aynı bileşendeyse o kenar atlanır, çünkü onu eklemek bir döngü oluşturur. Sıralama maliyeti domine eder ve toplamda O(E log E) verir. Kruskal seyrek grafiklerde parlar.

Zaman ve alan karmaşıklığı

ÖlçütKarmaşıklıkNotlar
ZamanO(E log E)Kenarların sıralanmasıyla domine edilir
Union-find işlemleri≈ O(E α(V))Yol sıkıştırma ile kontrol başına neredeyse sabit
AlanO(V + E)Kenar listesi + ayrık küme yapısı
En uygunSeyrek grafiklerGlobal bir kenar listesinden çalışır

Adım adım

AdımNe olur
1Her kenarı ağırlığa göre artan şekilde sırala.
2Her düğümü kendi bileşenine yerleştir (union-find).
3Bir sonraki en ucuz kenarı al.
4Uç noktaları farklı bileşenlerdeyse, ağaca ekle ve onları birleştir.
5Aksi halde atla (bir döngü oluşturur).
6Ağaç V − 1 kenara ulaştığında dur.

Çözümlü örnek

A, B, C, D düğümleri ve A-B(1), B-C(2), A-C(3), C-D(4), B-D(5) kenarlarına sahip grafik. Sıralanmış kenarlar: A-B(1), B-C(2), A-C(3), C-D(4), B-D(5):

Kenar (ağırlık)Öncesi bileşenlerEylem
A-B(1){A} {B} {C} {D}Farklı bileşenler - MST'ye ekle, {A,B} olarak birleştir.
B-C(2){A,B} {C} {D}Farklı bileşenler - MST'ye ekle, {A,B,C} olarak birleştir.
A-C(3){A,B,C} {D}A ve C zaten birlikte - atla (döngü oluştururdu).
C-D(4){A,B,C} {D}Farklı bileşenler - MST'ye ekle, {A,B,C,D} olarak birleştir.
Dur{A,B,C,D}Ağaçta V - 1 = 3 kenar var. MST = A-B, B-C, C-D, toplam ağırlık 7.

Kruskal algoritması ne zaman kullanılır

Şu durumda kullanŞu durumda kaçın
Grafik seyrekse (düğümlere göre az kenar).Grafik yoğunsa - yığınlı Prim genellikle daha hızlıdır.
Kenarlar sıralayabileceğin global bir liste olarak zaten mevcutsa.Kenarlar yalnızca düğüm başına taraman gereken komşuluk listeleriyle geliyorsa.
Union-find ile desteklenen basit bir uygulama istiyorsan.Ağacın belirli bir başlangıç düğümünden büyümesini gerekiyorsa.
Bağlantısız bir grafiğin yayılım ormanını oluşturmak istiyorsan.Tam bir sıralama olmadan akışla gelen kenarları işlemen gerekiyorsa.

Kruskal's Algorithm kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Kruskal's Algorithm uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Kruskal's Algorithm kodu

Python
1def find(parent, x):2    while parent[x] != x:3        parent[x] = parent[parent[x]]  # path compression4        x = parent[x]5    return x6
7
8def kruskal(vertices, edges):9    # Take the cheapest edge that does not close a cycle10    parent = {v: v for v in vertices}11    mst, total = [], 012    for w, u, v in sorted(edges):13        root_u, root_v = find(parent, u), find(parent, v)14        if root_u != root_v:15            parent[root_u] = root_v16            mst.append((u, v, w))17            total += w18    return mst, total19
20
21vertices = ["A", "B", "C", "D", "E"]22edges = [23    (4, "A", "B"), (1, "A", "C"), (3, "B", "C"), (2, "B", "D"),24    (5, "C", "D"), (6, "C", "E"), (7, "D", "E"),25]26
27mst, total = kruskal(vertices, edges)28for u, v, w in mst:29    print(f"{u} - {v} (weight {w})")30print("Total MST weight:", total)
Bu kodu Python Playground'da çalıştır

Kruskal Algoritması SSS

Minimum yayılım ağacı nedir?
Bağlı ağırlıklı bir grafiğin minimum yayılım ağacı (MST), tüm düğümleri döngü olmadan ve mümkün olan en küçük toplam ağırlıkla bağlayan bir kenar alt kümesidir. V düğüm için tam olarak V - 1 kenarı vardır.
Kruskal ve Prim algoritması arasındaki fark nedir?
İkisi de minimum yayılım ağacını açgözlülükle oluşturur. Kruskal tüm kenarları global olarak sıralar ve union-find kullanarak döngü oluşturmayan en ucuz kenarı ekler. Prim tek bir ağacı bir başlangıç düğümünden dışa doğru büyütür, her zaman ağaçtan çıkan en ucuz kenarı ekler. Kruskal seyrek grafiklere uygundur; Prim (yığınla) yoğun grafiklere.
Kruskal algoritması neden union-find kullanır?
Bir kenar eklemeden önce Kruskal, iki uç noktasının zaten bağlı olup olmadığını kontrol etmelidir - böyle bir kenar eklemek bir döngü oluşturur. Union-find (ayrık küme) "aynı bileşende mi?" sorusunu yanıtlar ve bileşenleri neredeyse sabit amortize edilmiş zamanda birleştirir, bu da algoritmayı verimli tutar.
Prim yerine Kruskal algoritmasını ne zaman kullanmalıyım?
Grafik seyrekse ve tüm kenarlar sıralayabileceğin bir liste halinde zaten elindeyse Kruskal'ı tercih et - E küçük olduğunda O(E log E) sıralaması ucuzdur. İkili veya Fibonacci yığınlı Prim algoritması, E'nin 'ye yaklaştığı yoğun grafiklerde genellikle kazanır çünkü tüm kenarları önceden sıralamaktan kaçınır.
Kruskal algoritması bağlantısız grafiklerde çalışır mı?
Evet. Grafik bağlantısızsa, Kruskal V - 1 kenara ulaşamaz ve bunun yerine bir minimum yayılım ormanı üretir - her bağlı bileşen için bir MST. Bu doğal olarak ortaya çıkar çünkü union-find aralarında yol olmayan düğümleri asla birleştirmez.
Kruskal algoritmasını uygularken en yaygın hata nedir?
Union-find'ın yol sıkıştırma ve rütbeye göre birleştirme özelliklerini atlamak, her bağlantı kontrolünü neredeyse sabitten neredeyse doğrusala düşürür ve çalışma süresini domine edebilir. Bir diğer sık hata, bir kenar ekledikten sonra iki bileşeni gerçekten birleştirmeyi unutmaktır, bu da sonraki kenarların döngü oluşturmasına izin verir.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA