算法2026-04-15·6 分钟
算法知识库:并查集实现
并查集(Union-Find)及其路径压缩优化的 JavaScript/TypeScript 实现。
并查集实现
1. 基础并查集
ts
class UnionFind {
parent: number[];
rank: number[];
constructor(size: number) {
this.parent = Array.from({ length: size }, (_, i) => i);
this.rank = Array(size).fill(0);
}
// 时间复杂度: 近似 O(1) (路径压缩优化后)
find(x: number): number {
if (this.parent[x] !== x) {
this.parent[x] = this.find(this.parent[x]); // 路径压缩
}
return this.parent[x];
}
// 时间复杂度: 近似 O(1) (按秩合并优化后)
union(x: number, y: number) {
const rootX = this.find(x);
const rootY = this.find(y);
if (rootX !== rootY) {
if (this.rank[rootX] > this.rank[rootY]) {
this.parent[rootY] = rootX;
} else if (this.rank[rootX] < this.rank[rootY]) {
this.parent[rootX] = rootY;
} else {
this.parent[rootY] = rootX;
this.rank[rootX] += 1;
}
}
}
// 时间复杂度: 近似 O(1)
connected(x: number, y: number): boolean {
return this.find(x) === this.find(y);
}
}2. 应用示例:连通分量
ts
function countComponents(n: number, edges: number[][]): number {
const uf = new UnionFind(n);
for (const [u, v] of edges) {
uf.union(u, v);
}
const roots = new Set<number>();
for (let i = 0; i < n; i += 1) {
roots.add(uf.find(i));
}
return roots.size;
}3. 实现要点
- 路径压缩优化查找操作。
- 按秩合并避免树过深。
- 适合动态连通性问题。
算法并查集JavaScript