并查集学习

  早上早早起来看Kruscal的MST算法,原来要用到不相交集合来实现。拿起《算法导论》看完不相交集合这章,顿然茅塞顿开,终于完成并查集的基础知识的学习。《算法导论》真是牛××

  不相交集合有两种不同的实现,链表表示和带路径压缩的按秩合并策略。看到大家都比较喜欢用带路径压缩的按秩合并策略,那么我只认真研究了一下带路径压缩的按秩合并策略,暂时不对链表表示作讨论。

  顾名思义,并查集的作用不就的“并”和“查”嘛。并查集的功能描述为:合并两个集合;将一元素并入另一集体;判断两个元素是否属于同一个集合。

  通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构。 

 

1、make_set(x) 把每一个元素初始化为一个集合

建立一个新的集合,其中集合只有唯一的一个元素x

 

2、union_set(x, y) 按秩合并x,y所在的集合

  

3、find_set(x)返回x所在的集合的代表 

 

   

   在执行查找操作时,要沿着父节点指针一直找下去,直到找到树根为止。大家要注意途中的箭头。 

4、实现并查集的标准代码: 

//   在执行查找操作时,要沿着父节点指针一直找下去,直到找到树根为止。大家要注意途中的箭头。
// 实现并查集的标准代码:
 #include <stdio.h>

 const int MAXN = 100; /*结点数目上线*/
 int pa[MAXN];    /*p[x]表示x的父节点*/
 int rank[MAXN];    /*rank[x]是x的高度的一个上界*/

 void make_set(int x)
 {/*创建一个单元集*/
     pa[x] = x;
     rank[x] = 0;
 }

 int find_set(int x)
 {/*带路径压缩的查找*/
     if(x != pa[x])
         pa[x] = find_set(pa[x]);
     return pa[x];
 }

 /*按秩合并x,y所在的集合*/
 void union_set(int x, int y)
 {
     x = find_set(x);
     y = find_set(y);
     if(rank[x] > rank[y])/*让rank比较高的作为父结点*/
         pa[y] = x;
     else
     {
         pa[x] = y;
         if(rank[x] == rank[y])
             rank[y]++;
     }
 }
 
  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码随想录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值