👏作者简介:大家好,我是笙一X,java大二练习生,喜欢算法和Java相关知识。
📕正进行的系列:算法 、JUC从入门到成神、Spring、运维
功能介绍
1. 查询:查询一个元素属于哪个集合(通常表示为这个元素属于哪个代表元素所属的集合)
举例:b 属于 a 所在的元素。
2. 合并:如果有两个集合,只知道两个集合其中的一个元素,要将两个集合合并。
举例:只知道 a 和 d,将两个元素所在的集合合并。
实现原理
我们先来思考,要实现查找目的,就是要明白如何才能让一个集合拥有代表元素,还能通过其中所有元素查找到这个代表元素呢。
很明显,树状结构代表的集合能做到这一点:
观察此图,如果我们使用树状结构,它就会有一个头节点作为唯一的代表元素,并且所有节点可以通过搜索父节点查找到这个代表元素。
那知道了这一点,如何实现合并的要求呢?这就很简单了。我们直接将一个树的头节点接入另一个树的头节点底下,就能实现这一目的。
代码实现
// 集合元素为 0 ~ n-1
public static int n;
// 索引为元素,而其上的值为元素的父节点
public static int[] father = new int[n];
public static void build() {
for(int i = 0; i < n; i++) {
father[i] = i;
}
}
// 查找
// 参数:所要查找的元素
// 返回值:元素所在的集合(代表元素)
public static int find(int i) {
if(father[i] != i) {
father[i] = find(father[i]);
}
return father[i];
}
// 合并
// 参数:元素1, 元素2
public static void union(int x, int y) {
father[find(x)] = find(y);
}