SorryToPerson logo
返回
算法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