并查集(union find)

并查集是一种树型的数据结构,用于处理一些不相交集合(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、路径压缩)

  1. 根节点Size大小优化
  2. 降低根节点高度Rank优化
  3. 减少树的层数路径压缩

四、完整代码示例

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值