转载 并查集的路径压缩。

本文介绍了并查集数据结构中两种不同的查找方法:一种适用于数据量较小的情况,另一种则适用于大数据量,通过路径压缩技术来提高查找效率。文中详细展示了路径压缩的递归与非递归实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


根据几天来的做题时候遇到的问题来看,并查集查找有两种一种适合数据量小的时候,但是,当数据量很大的时候将会超时。所以,还有一种查找的方式。

数据量小的时候。

int findx(int x)
{
     int r=x;
     if(arr[r]!=r)
          r=arr[r;
      return r;
}


数据量大的时候。

int findx(int x)       //查找x元素所在的集合,回溯时压缩路径
{
    if (x != arr[x])
    {
        arr[x] = findx(arrt[x]);     //回溯时的压缩路径
    }         //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
    return arr[x];
}

上面是一种递归的的方式压缩路径。但是有时候会造成栈的溢出,下面我介绍一种不是递归方式的压缩路径


 

int findx(int x)
{
    int k, j, r;
    r = x;
    while(r != arr[r])     //查找跟节点
        r = arr[r];      //找到跟节点,用r记录下
    k = x;        
    while(k != r)             //非递归路径压缩操作
    {
        j = arr[k];         //用j暂存parent[k]的父节点
        arr[k] = r;        //parent[x]指向跟节点
        k = j;                    //k移到父节点
    }
    return r;         //返回根节点的值            
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值