并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。
- 查找(Find):查询两个元素是否在同一个集合中;
- 合并(Union):把两个不相交的集合合并为一个集合;
其本质是通过一个一维数组来维护一个森林,开始时森林中的每一个节点都是孤立的,各自形成一个树。之后,进行若干次的合并操作,每次合并将两个树合并为一个更大的树。
一、Parent数组维护
并查集内部维护了一个parent数组,其大小为图的节点数量,parent[p] 的值为节点p的父节点。如果一个节点没有父节点,则规定 parent[p] = p 。

二、并查集相关操作
查找(find)
作用:找出给定节点所在树的根节点。
实现方法:按照parent数组向上寻找,直到parent[p] = p 为止。
private int find(int p){
if(p < 0 || p >= parent.length)
throw new IllegalArgumentException("p is out of bound.");
// 不断去查询自己的父亲节点, 直到到达根节点
// 根节点的特点: parent[p] == p
while(p != parent[p])
p = parent[p];
return p;
}
合并(union)
作用:将给定的两个节点所在的树进行合并,如果给定的两个节点已在同一个树中,则不进行任何操作。
实现方法:先通过find找到两个节点对应的根节点,然后让其中一个根节点成为另一个根节点的子节点即可。
public void unionElements(int p, int q){
int pRoot = find(p);
int qRoot = find(q);
if( pRoot == qRoot )
return;
parent[pRoot] = qRoot;
}
连通性(connect)
如果这两个节点的根节点相同,则他们相连。
public boolean isConnected( int p , int q ){
return find(p) == find(q);
}
三、优化(Rank、路径压缩)
四、完整代码示例
https://github.com/perkinls/java-summary/
五、参考链接
- https://blog.csdn.net/weixin_51379191/article/details/117262725
- https://blog.csdn.net/weixin_38279101/article/details/112546053
关注公众号 ,专注于java大数据领域离线、实时技术干货定期分享!如有问题随时沟通交流! www.lllpan.top

343

被折叠的 条评论
为什么被折叠?



