并查集是一种树形的数据结构,用于处理不交集的合并(union)及查询(find)问题。并查集可用于查询网络中两个节点的状态, 这里的网络是一个抽象的概念, 不仅仅指互联网中的网络, 也可以是人际关系的网络、交通网络等。
并查集的重要思想在于,用集合中的一个元素代表集合。我曾看过一个有趣的比喻,把集合比喻成帮派,而代表元素则是帮主。接下来我们利用这个比喻,看看并查集是如何运作的。
首先每个人都各自为阵:
然后根据情况对其中的集合进行合并:也就是指向一个集合的代表。
上面步骤就是并查集的合并操作,另外一个比较重要的操作就是查询操作,判断两个元素是否是同一个集合。
package disjointset;
import java.util.Arrays;
/**
* JavaTest
*
* @author : xgj
* @description : 并查集简单实现
* @date : 2020-08-05 20:43
**/
public class DisjointSet {
/**
* 底层数组
*/
private int[] parent;
/**
*并查集的元素个数
*/
private int size;
/**
*功能描述 : 初始化,元素指向-1
*
* @author xgj
* @date 2020/8/5
*/
public DisjointSet(int size) {
//初始化个数
this.size = size;
//初始化数组,每个并查集都指向自己
parent = new int[size];
Arrays.fill(parent,-1);
}
/**
*功能描述 : 找到父节点
*
* @author xgj
* @date 2020/8/5
*/
private int find(int element) {
if(element > size || element < 0){
System.out.println("范围错误");
}
if(parent[element] == -1) {
return element;
}
return find(parent[element]);
}
/**
*功能描述 : 查询是否属于一组
*
* @author xgj
* @date 2020/8/5
* @param element1
* @param element2
* @return boolean
*/
public boolean isConnected(int element1 ,int element2){
int parent1 = find(element1);
int parent2 = find(element2);
return parent1 == parent2;
}
/**
*功能描述 : 合并两个元素所在集合
*
* @author xgj
* @date 2020/8/5
* @param element1
* @param element2
* @return boolean
*/
public boolean unionElements(int element1,int element2){
int parent1 = find(element1);
int parent2 = find(element2);
if(parent1 == parent2) {
return false;
}
parent[parent1] = parent2;
return true;
}
/**
*功能描述 : 输出并查集
*
* @author xgj
* @date 2020/8/5
* @param
* @return void
*/
public void printArr(){
System.out.println(Arrays.toString(parent));
}
}
原文:https://www.cnblogs.com/jiezao/p/13445823.html