一、认识并查集
1. 定义与核心功能
并查集(Disjoint Set)是一种用于管理不相交集合的数据结构,主要用于处理需要动态维护集合合并和查询的问题。它的核心在于高效支持两个基本操作:
- Find(查找):确定某个元素属于哪一个集合。
- Union(合并):将两个元素所在的集合合并为一个集合。
2. 基本原理
2.1 集合表示
并查集通常使用一个数组(parent 数组)来表示每个元素的父节点,形成森林结构。每个集合对应一棵树,树的根节点即为该集合的代表元素。
例如,初始时有 5 个独立元素(0, 1, 2, 3, 4),每个元素自成一派,parent 数组为 [0, 1, 2, 3, 4]。
2.2 合并与查询
合并操作:将两个集合的根节点连接起来。例如将 0 和 1 合并,可以将 0 的父节点设为 1,此时 0 和 1 同属一个集合。
查询操作:通过不断向上寻找父节点,直到找到根节点。例如查询 0 的归属,若 parent[0]=1 且 parent[1]=1,则 0 属于以 1 为根的集合。
3. 核心实现与优化
为了保持性能,实际应用中必须引入优化策略。下面是一个完整的 Java 实现,包含了初始化、查找、合并以及关键的优化技巧。
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 {
(parent[x] != x) {
parent[x] = find(parent[x]);
}
parent[x];
}




