Kruskal Algoritması
Kenarları hafiften ağıra deneyip döngü kurmayanları alarak minimum kapsayan ağacı bulan algoritma.
Önce bunlara göz at
#Nasıl çalışır?
Minimum kapsayan ağaç (Minimum Spanning Tree, MST), ağırlıklı ve bağlı bir graftaki tüm düğümleri birbirine bağlayan, döngü içermeyen ve toplam ağırlığı en küçük olan kenar kümesidir. V düğümlü bir grafta MST tam olarak V − 1 kenardan oluşur.
Kruskal algoritması (1956) kenarları ağırlığa göre sıralar ve en hafiften başlayarak dener. Bir kenar, uçları henüz bağlı değilse ağaca alınır; zaten bağlıysa döngü oluşturacağı için atlanır.
"Uçlar zaten bağlı mı?" sorusunu hızlıca yanıtlamak için Union-Find (ayrık kümeler) kullanılır: her kabul edilen kenar iki kümeyi birleştirir. Böylece algoritma ormandaki parçaları adım adım tek bir ağaca dönüştürür.
#Kendin dene
Komşuluk listesi
- 1: 2 (4), 3 (1)
- 2: 1 (4), 4 (5), 5 (2)
- 3: 1 (1), 5 (2), 6 (4)
- 4: 2 (5), 7 (3)
- 5: 2 (2), 3 (2), 7 (6)
- 6: 3 (4), 7 (1)
- 7: 4 (3), 5 (6), 6 (1)
Kruskal kenarları en hafiften en ağıra doğru dener; döngü oluşturmayan her kenarı ağaca alır. Bir kenarı silip sonucun nasıl değiştiğine bak.
#Adım adım
- 01Tüm kenarları ağırlığa göre küçükten büyüğe sırala.
- 02Her düğüm kendi başına bir küme olsun.
- 03Sıradaki kenarın (u, v) uçları farklı kümelerdeyse kenarı al ve kümeleri birleştir; aynı kümedeyse atla.
- 04Ağaçta V − 1 kenar olunca dur.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
EDGES = [(1, 2, 4), (1, 3, 1), (2, 4, 5), (2, 5, 2), (3, 5, 2), (3, 6, 4), (4, 7, 3), (5, 7, 6), (6, 7, 1)]
N = 7
parent = list(range(N + 1)) # union-find over nodes 1..7
def find(x: int) -> int:
while parent[x] != x:
parent[x] = parent[parent[x]] # path halving
x = parent[x]
return x
tree, total = [], 0
for a, b, w in sorted(EDGES, key=lambda e: (e[2], e[0], e[1])): # lightest first
ra, rb = find(a), find(b)
if ra == rb:
continue # already connected: this edge would close a cycle
parent[ra] = rb
tree.append(f"{a}-{b}")
total += w
if len(tree) == N - 1:
break
print(" ".join(tree)) # edges in the order they were taken
print(total)#Karmaşıklık
| İşlem | Süre |
|---|---|
| Kenarları sıralamak | O(E log E) |
| Union-Find işlemleri | O(E · α(V)) |
| Toplam | O(E log E) |
| Bellek | O(V + E) |
Süreyi sıralama belirler; union-find işlemleri pratikte sabit sürelidir. Kenarlar zaten sıralıysa ya da ağırlıklar küçük tamsayılarsa (counting sort) Kruskal neredeyse doğrusal çalışır. Seyrek graflarda (E ≈ V) çok verimlidir.
#Ne zaman kullanılır?
Ağ kablolaması, elektrik ve boru hattı tasarımı gibi "her noktayı en az maliyetle bağla" problemleri, kümeleme (en ağır MST kenarlarını silerek gruplar elde etmek), görüntü bölütleme ve Gezgin Satıcı problemi için yaklaşık çözümler MST kullanır.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
V düğümlü bağlı bir grafın minimum kapsayan ağacında kaç kenar vardır?
- 1V − 1
- 2V
- 3E
- 4V + 1
Kruskal kenarları hangi sırayla dener?
- 1Ağırlığa göre küçükten büyüğe
- 2Başlangıç düğümüne yakınlığa göre
- 3Rastgele
- 4Büyükten küçüğe
Kruskal bir kenarın döngü oluşturup oluşturmayacağını hangi yapıyla hızlıca anlar?
- 1Union-Find (ayrık kümeler)
- 2Yığın
- 3Trie
- 4Hash tablosu
Orta
Kenarlar: A–B 1, B–C 2, A–C 3, C–D 4. Kruskal'ın bulduğu ağacın toplam ağırlığı kaçtır?
- 17
- 210
- 36
- 49
Zor
Kruskal'ın çalışma süresini çoğunlukla ne belirler?
- 1Kenarları sıralamak: O(E log E)
- 2Union-Find işlemleri: O(V²)
- 3Düğümleri sıralamak: O(V log V)
- 4Öncelik kuyruğu: O(V²)