并查集之 Find函数

发现自己写了两道题都把Find函数写得一塌糊涂。。。一题是没有路径压缩过不了,一题是因为前面写错过弄混了,不三不四的。。。总结很重要啊!!

路径压缩:递归写法:

int Find (int x)

  if(Father[x] != x) 

   {

    Father[x] = Find(Father[x]);//原来写成Father[x] = Father[Father[x]]了。。 //不断地找到其根节点并更改其值

    } 

   return Father[x];

}

非递归写法:

int Find(int x)

{

    if(Father[x] != x) 

      {

      Father[x] = Father[Father[x]];// 将p节点的父节点设置为它的爷爷节点 ,而自己设置为它的父节点 x = Father[x];

       } 

     return x;

}

一般写法:

非递归递归:

int Find (int x)

{

   // 寻找p节点所在组的根节点,根节点具有性质Father[root] = root 

      if(Father[x] != x) 

       { 

          x = Father[x] ;//把它的父节点的值找到赋给它,直到Father[root] = root

       } 

     return x;//

}

递归写法:

int Find(int x)

{

     if(a[x]!= x)//符合Father[x] = x的,x就是根节点,不是的就找到根节点返回。 

    {

       return Find(a[x]);

      }

        return x;

}

总结:所谓的路径压缩,就是把根节点下面的所有子孙直接与根节点相连,这样搜索时搜索深度为1,而一般的写法只是把当前结点与它的父节点直接相连,那么搜索深度就>1了,时间就长了。要知道是不是路径压缩(有时我会弄混),只要看是不是把它的父节点设置为它的爷爷结点就行了。只针对个人总结。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值