Küme elemanlarının birbirleriyle olan bağlantılarını yöneten, ağırlık dengeleme ve yol yassılaştırma (Path Compression) ile neredeyse sabit zamanda birleştirme/sorgulama sunan veri yapısıdır.
Ayrık Küme (Disjoint-Set) veya Union-Find, bir grup elemanın birbiriyle çakışmayan alt kümelere ayrılmasını ve bu kümelerin birleştirilmesini yöneten son derece verimli bir veri yapısıdır. İki temel operasyonu vardır: `Union` (iki kümeyi birleştirir) ve `Find` (bir elemanın hangi kümeye ait olduğunu belirler).
Basit Union-Find yapısı ağaç yüksekliğini dengelemediği için en kötü durumda doğrusal O(n) zincir yapısına dönüşebilir. Bu problemi çözmek için iki ana dengeleme tekniği kullanılır: Ağırlık Dengeli (Weight Balancing / Union by Size) küçük ağacı büyük ağacın altına bağlar. Yükseklik Dengeli (Height Balancing / Union by Rank) ise derinliği az olan ağacı derinliği fazla olan ağacın altına bağlar.
Yassılaştırıcı Bulma (Collapsing Find / Path Compression), `Find` operasyonu sırasında uğranan tüm düğümleri doğrudan kök düğüme bağlayarak ağacı tamamen düzleştirir. Bu iki optimizasyon birlikte kullanıldığında, operasyon başına çalışma süresi pratikte sabit zaman olan Ackermann fonksiyonunun tersi α(n) değerine iner.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1class DisjointSet {2 parent: number[];3 rank: number[];45 constructor(size: number) {6 this.parent = Array.from({ length: size }, (_, i) => i);7 this.rank = Array(size).fill(0);8 }910 find(i: number, trace?: string[]): number {11 if (this.parent[i] === i) return i;12 13 const root = this.find(this.parent[i], trace);14 if (this.parent[i] !== root) {15 if (trace) {16 trace.push(` [Yol Yassılaştırma] Düğüm ${i} ebeveyni güncellendi: ${this.parent[i]} -> ${root}`);17 }18 this.parent[i] = root; // Path compression19 }20 return root;21 }2223 union(i: number, j: number, trace?: string[]): boolean {24 const rootX = this.find(i, trace);25 const rootY = this.find(j, trace);2627 if (rootX === rootY) {28 if (trace) trace.push(`${i} ve ${j} zaten aynı kümede (Kök: ${rootX}).`);29 return false;30 }3132 if (trace) {33 trace.push(`Birleştiriliyor: Kök ${rootX} (Rütbe: ${this.rank[rootX]}) ve Kök ${rootY} (Rütbe: ${this.rank[rootY]})`);34 }3536 if (this.rank[rootX] < this.rank[rootY]) {37 this.parent[rootX] = rootY;38 if (trace) trace.push(` Kök ${rootX} -> Kök ${rootY} altına bağlandı.`);39 } else if (this.rank[rootX] > this.rank[rootY]) {40 this.parent[rootY] = rootX;41 if (trace) trace.push(` Kök ${rootY} -> Kök ${rootX} altına bağlandı.`);42 } else {43 this.parent[rootY] = rootX;44 this.rank[rootX]++;45 if (trace) trace.push(` Rütbeler eşit. Kök ${rootY} -> Kök ${rootX} altına bağlandı, rütbe ${this.rank[rootX]} yapıldı.`);46 }47 return true;48 }49}Küme boyutu ve birleştirme/bulma işlemlerini girin (U x y: Birleştir, F x: Bul). Örnek: 5; U 0 1, U 2 3, U 1 2, F 0
Küme boyutu ve birleştirme/bulma işlemlerini girin (U x y: Birleştir, F x: Bul). Örnek: 5; U 0 1, U 2 3, U 1 2, F 0
En İyi Durum: O(1)
Ortalama Durum: O(α(n))
En Kötü Durum: O(α(n))
O(n) parent ve rank dizileri - Bu algoritmanın karmaşıklığı belirtilmemiş.
Ayrık Küme (Disjoint-Set / Union-Find) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: