Algoritmalar

Union-Find (Ayrık Küme)

Veri Yapıları O(α(n)) O(n)

Küme ormanı: find köke yürür ve arkasındaki yolu düzleştirir, union düşük rütbeli kökü yükseğin altına asar.

0r01r02r03r04r05r06r07r0
1/37

makeSets(8): her eleman rütbesi 0 olan kendi köküdür.

DeğişmezHer eleman kümesinin kökünü gösterir; iki eleman tam olarak aynı kökü paylaştıklarında aynı kümededir.

union-find.c
int parent[N], rank_[N];
void makeSets(int n) {
for (int i = 0; i < n; i++) {
parent[i] = i;
rank_[i] = 0;
}
}
int find(int x) {
if (parent[x] != x)
parent[x] = find(parent[x]); /* compress */
return parent[x];
}
void unionSets(int a, int b) {
int ra = find(a), rb = find(b);
if (ra == rb) return; /* same set */
if (rank_[ra] < rank_[rb]) {
parent[ra] = rb;
} else if (rank_[ra] > rank_[rb]) {
parent[rb] = ra;
} else {
parent[rb] = ra;
rank_[ra]++;
}
}

Union-Find (Ayrık Küme) nasıl çalışır?

Her küme bir ağaçtır; kök kümenin temsilcisidir. find(x) köke yürür, union bir kökü diğerinin altına bağlar. Yol sıkıştırma, ziyaret edilen her düğümü doğrudan köke bağlar — kullanım yan etkisi olarak ağaçlar düzleşir.

En iyi durum

Düzleşmiş ağaçlar — find tek sıçrama: fiilen O(1).

En kötü durum

Rütbeye göre birleştirme + yol sıkıştırmayla: amorti O(α(n)) — ters Ackermann, pratikte ≤ 4.

Ne zaman kullanılır?

Dinamik bağlantılılık: Kruskal MST, döngü tespiti, eşdeğer öğeleri gruplama.