Union-Find maintains disjoint sets with find(x) (representative) and union(a,b) (merge). It’s used for connectivity and Kruskal’s MST; with path compression + union by rank, operations are almost O(1) amortized.
class DSU {
private parent: number[];
constructor(n: number) {
this.parent = Array.from({ length: n }, (_, i) => i);
}
find(x: number): number {
if (this.parent[x] === x) return x;
this.parent[x] = this.find(this.parent[x]);
return this.parent[x];
}
union(a: number, b: number) {
const ra = this.find(a);
const rb = this.find(b);
if (ra !== rb) this.parent[rb] = ra;
}
}Union-Find (Disjoint Set Union) maintains a partition of elements into disjoint sets and supports:
With two optimizations:
…each operation is effectively constant for real inputs: O(alpha(n)) amortized (inverse Ackermann, grows extremely slowly).
class DSU {
private parent: number[]
private size: number[]
constructor(n: number) {
this.parent = Array.from({ length: n }, (_, i) => i)
this.size = Array.from({ length: n }, () => 1)
}
find(x: number): number {
if (this.parent[x] === x) return x
this.parent[x] = this.find(this.parent[x])
return this.parent[x]
}
union(a: number, b: number) {
let ra = this.find(a)
let rb = this.find(b)
if (ra === rb) return
if (this.size[ra] < this.size[rb]) [ra, rb] = [rb, ra]
this.parent[rb] = ra
this.size[ra] += this.size[rb]
}
}