简要介绍
并查集是很多高级数据结构的基础。它可以高效地查询几个事物是否属于同一个子类,高效地对几个子类进行合并,广泛被应用于解决各种连通性问题。
基本操作
并查集的基本操作有如下两个查询、合并。
- 查询:得到某个元素所在类别的标签
- 合并:将两个类别进行合并
代码实例
定义并查集类:
public class UnionFind {
}
并查集初始化:(一般为每个元素定义一个类别)
private int[] labels;
public UnionFind(int n){
labels = new int[n];
for (int i = 0; i < n; i++) {
labels[i] = i;
}
}
并查集的实现方案主要有染色、树结构两种方案,每种方案有其自身的优点与缺点,现在逐个介绍如下:
染色方案
染色方案的合并操作,如以下代码:
public void union(int p, int q){
int lab_p = labels[p], lab_q = labels[q];
for (int i = 0; i < labels.length; i++) {
if(lab_p == labels[i]){
labels[i] = lab_q;
}
}
}
查询操作,如以下代码:
public int find(int q){
return labels[q];
}
其查询算法为常数时间复杂度,合并操作为线性时间复杂度。
树方案
树方案的查询操作如下:
public int find(int q){
int parent = labels[q];
while (parent != -1){
q = parent; //迭代查找该子树的根节点
parent = labels[q];
}
return q;
}
树方案的合并操作如下:
// 将p类合并到q类,成为q类的子类
public void union(int p, int q){
int parent_p = find(p), parent_q = find(q);
labels[parent_p] = parent_q;
}