一、认识并查集
1. 并查集的定义
并查集是一种用于管理不相交集合(Disjoint Set)的数据结构。它主要用于处理一些需要动态维护集合的合并和查询操作的问题。并查集的核心功能是高效地支持以下两个基本操作:
Find(查询):确定某个元素属于哪一个集合。 Union(合并):将两个元素所在的集合合并为一个集合。
2. 基本概念
2.1. 集合的表示
并查集通过一个数组(通常称为 parent 数组)来表示每个元素的'父节点',从而形成一个森林结构。每个集合用一个树来表示,树的根节点即为该集合的代表元素。 例如,假设我们有 5 个元素(0, 1, 2, 3, 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 和元素 0 属于同一个集合,集合的根节点是 1。
2.3. 查询操作
查询某个元素属于哪个集合时,我们只需要找到该元素所在树的根节点。例如,查询元素 2 属于哪个集合:find(0) -> find(1) -> 1
元素 0 的根节点是 1,因此元素 2 属于根节点为 1 的集合。
3. 基本操作
3.1 初始化
初始化时,每个元素的父节点指向自己,表示每个元素初始时都是一个独立的集合。
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
}
}
}






