博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集
阅读量:6138 次
发布时间:2019-06-21

本文共 1141 字,大约阅读时间需要 3 分钟。

并查集(不相交集合)  文章作者:ktyanny 文章来源:ktyanny   早上早早起来看Kruscal的MST算法,原来要用到不相交集合来实现。拿起《算法导论》看完不相交集合这章,顿然茅塞顿开,终于完成并查集的基础知识的学习。《算法导论》真是牛××  不相交集合有两种不同的实现,链表表示和带路径压缩的按秩合并策略。看到大家都比较喜欢用带路径压缩的按秩合并策略,那么我只认真研究了一下带路径压缩的按秩合并策略,暂时不对链表表示作讨论。  顾名思义,并查集的作用不就的“并”和“查”嘛。并查集的功能描述为:合并两个集合;将一元素并入另一集体;判断两个元素是否属于同一个集合。  通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构。  1、make_set(x) 把每一个元素初始化为一个集合建立一个新的集合,其中集合只有唯一的一个元素x 2、union_set(x, y) 按秩合并x,y所在的集合  3、find_set(x)返回x所在的集合的代表        在执行查找操作时,要沿着父节点指针一直找下去,直到找到树根为止。大家要注意途中的箭头。 4、实现并查集的标准代码:  1 #include 
2 3 const int MAXN = 100; /*结点数目上线*/ 4 int pa[MAXN]; /*p[x]表示x的父节点*/ 5 int rank[MAXN]; /*rank[x]是x的高度的一个上界*/ 6 7 void make_set(int x) 8 {
/*创建一个单元集*/ 9 pa[x] = x;10 rank[x] = 0;11 }12 13 int find_set(int x)14 {
/*带路径压缩的查找*/15 if(x != pa[x])16 pa[x] = find_set(p[x]);17 return pa[x];18 }19 20 /*按秩合并x,y所在的集合*/21 void union_set(int x, int y)22 {23 x = find_set(x);24 y = find_set(y);25 if(rank[x] > rank[y])/*让rank比较高的作为父结点*/26 pa[y] = x;27 else 28 {29 pa[x] = y;30 if(rank[x] == rank[y])31 rank[y]++;32 }33 }

 

转载地址:http://rskya.baihongyu.com/

你可能感兴趣的文章
vsftpd 相关总结
查看>>
bash complete -C command
查看>>
解决zabbix 3.0中1151端口不能运行问题
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
dubbo
查看>>
【Git入门之四】操作项目
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
高利率时代的结局,任重道远,前途叵测
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
luov之SMTP报错详解
查看>>
软件概要设计做什么,怎么做
查看>>
dwr
查看>>
java的特殊符号
查看>>
word2010中去掉红色波浪线的方法
查看>>
fabric上下文管理器(context mangers)
查看>>
JQuery-EasyUI Datagrid数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)
查看>>