一、认识并查集
1. 定义
并查集(Disjoint Set Union, DSU)是一种用于管理不相交集合的数据结构。它主要用于处理需要动态维护集合合并和查询的问题。核心功能高效支持两个基本操作:
- Find(查找):确定某个元素属于哪一个集合。
- Union(合并):将两个元素所在的集合合并为一个集合。
2. 基本概念
2.1 集合表示
并查集通常通过一个数组(parent 数组)来表示每个元素的父节点,形成森林结构。每个集合用一棵树表示,根节点即为该集合的代表元素。
例如,5 个元素(0~4)初始时各自独立:
0 1 2 3 4
对应的 parent 数组为 [0, 1, 2, 3, 4],每个元素的父节点指向自己。
2.2 合并操作
合并两个集合时,将一个集合的根节点指向另一个集合的根节点。例如合并元素 1 和 0:
0 1 2 3 4
\ /
1
此时 parent 数组变为 [1, 1, 2, 3, 4],根节点为 1。
2.3 查询操作
查询元素所属集合即找到其所在树的根节点。例如 find(0) 会沿父节点向上直到根。
3. 核心实现与优化
3.1 初始化
初始化时,每个元素的父节点指向自己,秩(rank)设为 0。
public class UnionFind {
private int[] parent;
private int[] rank;
public UnionFind(int n) {
parent = new int[n];
rank = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
rank[i] = 0;
}
}
}
3.2 查找与路径压缩
查找根节点时,使用路径压缩技术可将查找路径上的所有节点直接指向根,减少后续查找深度。
public int find( x) {
(parent[x] != x) {
parent[x] = find(parent[x]);
}
parent[x];
}


