认识并查集
核心定义
并查集(Disjoint Set)是一种用于管理不相交集合的数据结构,特别适合处理动态维护集合的合并和查询操作。它的核心功能非常明确:高效支持查找(Find)某个元素属于哪个集合,以及合并(Union)两个元素所在的集合。
Find(查询):确定某个元素属于哪一个集合。 Union(合并):将两个元素所在的集合合并为一个集合。
基本原理
集合表示
并查集通常使用一个数组(parent 数组)来存储每个元素的父节点,从而形成森林结构。每个集合对应一棵树,树的根节点即为该集合的代表元素。
假设初始有 5 个元素(0, 1, 2, 3, 4),每个元素独立成集,parent 数组为 [0, 1, 2, 3, 4],此时每个元素的父节点指向自己。
合并与查询
当需要合并两个元素时,只需将一个集合的根节点指向另一个集合的根节点。例如合并 0 和 1,若 1 成为新根,则 parent[0] 变为 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; // 每个元素的秩初始化为 0
}
}
}
查找操作
查找的目标是定位根节点。这里必须配合路径压缩技术,即在递归返回时将路径上的所有节点直接指向根节点,大幅降低后续查找深度。


