Ⅰ、并查集是一种树型结构,有如下特点:
1、每个元素都对应一个结点
2、一个数据组对应一个树,每组数据中的多个元素都在同一个树中
3、树与树之间没有联系
4、元素在树中没有子父级关系
Ⅱ、并查集可以高效的进入如下操作:
·查询pq元素是否属于同一组
·合并pq元素所在的组
Ⅲ、并查集底层使用一个eleGroup数组实现,该数组有如下特点:
package linear.uf;
public class UF {
//记录结点元素和该元素所在分组的标识
private int[] eleAndGroup;
//记录并查集中数据的分组个数
private int count;
public UF(int N) {
//初始化分组的数量,初始情况下每个元素都在独立的分组中,所以有N个分组
this.count = N;
//初始化eleAndGroup数组
this.eleAndGroup = new int[N];
//初始化eleAndGroup中的 元素及其所在的分组的标识符,让eleAndGroup数组的索引作为并查集的每个结点的元素,并且让每个索引处的值就是该索引
for (int i = 0; i < eleAndGroup.length; i++) {
eleAndGroup[i] = i;
}
}
//获取当前并查集中的数据有多少个分组
public int count(){
return count;
}
//判断并查集中元素p和元素q是否在同一个分组中
public boolean connected(int p,int q){
return find(p)==find(q);
}
//元素p所在的分组的标识符
public int find(int p){
return eleAndGroup[p];
}
//把p元素所在的分组和q元素所在的分组合并
public void union(int p,int q){
//判断qp元素是否已经在同一分组中
if (connected(p,q)){
return;
}
//先找到p所在分组的标识符
int pGroup = find(p);
//找到q所在分组的标识符
int qGroup = find(q);
//遍历:通过标识符找到p元素所在组的所有元素,让这些元素的标识符变成q所在组的标识符
for (int i = 0; i < eleAndGroup.length; i++) {
if (eleAndGroup[i]== pGroup){
eleAndGroup[i] = qGroup;
}
}
//分组个数-1
this.count--;
}
}