查并集

The White Belt

Good developers who are familiar with the entire stack know how to make life easier for those around them.

用于不相交集合的数据结构——查并集

不相交集合数据结构的概念和操作:

    不相交集合数据结构(disjoing-set data structure)保持一组不相交的动态集合S={S1,S2,S3,……Sk}。每个集合通过一个代表来识别,代表即集合中的某个成员。

不相交集合数据结构支持如下操作:

1 . MAKE_SET(x): 建立一个新的集合,其唯一成员就是x,所以其代表也就是自己。因为各集合是不相交的,故要求x没有在其他集合中出现过。

2 . UNION(x,y): 将包含x和y的动态集合(比如说Sx和Sy)合并为一个新的集合(即这两个集合的并集)。假定这个操作之前是不相交的。在经过此操作后,所得集合的代表可以是Sx U Sy中的任何一个成员,但在UNION的很多实现细节中,都选择Sx或Sy的代表作为新的代表。由于要求各集合是不相交的,故我们“消除”集合Sx和Sy,把它们从S中删去。

3 . FIND_SET(x):返回一个指针,指向包含x的(唯一)集合的代表。

不相交数据集合一般用链表或森林(有根树,如下图)来实现,有根树的速度更快。用有根树来表示集合,树中的每个节点都包含集合的一个成员,每棵树都表示一个集合。从下图中可知,不相交森林中,每个成员仅指向其父节点。每个树的根包含了代表,并且是它自己的父节点。尽管采用了这种表示的直观算法并不比采用链表表示的直观算法并不比采用链表表示的算法更快,但是,通过引入两种启发式策略(“按秩合并”和“路径压缩”),就可以获得目前已知的,渐进意义上最快的不相交集合的数据结构。

改进运行时间的启发式策略:

1.按秩合并,其思想是是用包含较少节点的树的根指向包含较多节点的树的根。我们并不显式地记录以每个节点为根的子树大小,而是采用了一种能够简化分析的方法。对每个节点,用秩表示节点高度的一个上界。在按秩合并中具有较小秩的根在UNION操作中要指向具有较大秩的根。

2.路径压缩,它非常简单而有效。如下图所示,在FIND_SET操作中,利用这种启发式策略,来使查找路径上的每个节点都直接指向根节点。路径压缩并不改变节点的秩。


不相交集合森林的伪代码:


带路径压缩的FIND_SET过程也是相当简单的:


过程FIND_SET是一种两趟方法,也就是说它干了两件事:

1.沿着路径上升,找到代表。

2.修改路径上的元素的p域,使其指向代表。

代码示例:

  1. public void make_set(int x) {/* 创建一个单元集 */  
  2.         pa[x] = x;  
  3.         rank[x] = 0;  
  4.     }  
  5.   
  6. public int find_set(int x) {/*带路径压缩的查找 */  
  7.         /* 保存待查找的数 */  
  8.         if(x != pa[x])   
  9.             pa[x] = find_set(pa[x]);  
  10.         return pa[x];  
  11.     }  
  12.   
  13.     /* 按秩合并x,y所在的集合 */  
  14.     public void union_set(int x, int y) {  
  15.         x = find_set(x);  
  16.         y = find_set(y);  
  17.         if (x == y)  
  18.             return;  
  19.         if (rank[x] > rank[y])/* 让rank比较高的作为父结点 */  
  20.         {  
  21.             pa[y] = x;  
  22.               
  23.         } else {  
  24.             pa[x] = y;  
  25.             if (rank[x] == rank[y])  
  26.                 rank[y]++;  
  27.               
  28.         }  
  29.     }  

不相交集合数据结构的一个应用:

    不相交集合数据结构有多种应用,其中之一是用于确定一个无向图中连通子图的个数。在下面给出的过程CONNECTED_COMPONENTS中,利用了不相交集合操作来计算一个图的连通子图。一旦CONNECTED_COMPONENTS作为预处理步骤执行后,过程SAME_COMPONENT回答两个顶点是否在同一连通子图的查询。


参考:http://blog.csdn.net/lalor/article/details/7388524、《算法导论》


版权声明:本文为博主原创文章,未经博主允许不得转载。

好文要顶 关注我 收藏该文
StackMer
关注 - 3
粉丝 - 0
+加关注
0
0
«上一篇:一维和二维子数组之和最大值
»下一篇:Java中读取输入方式的性能比较
posted @ 2014-01-21 21:18 StackMer 阅读(32) 评论(0)编辑 收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给程序员的10条建议

1. 想清楚,再动手写代码 刚入行的新手,为了展示自己的能力,拿到需求迫不及待地就开始上手写代码,大忌! 2. 不交流,就会头破血流 不爱说话和沟通,需求都理解错误了,最后做出来才发现…

传说中的800句记7000词

登录 | 注册 ZHB_McCoy的专栏 目录视图摘要视图订阅 一键管理你的代码 攒课--我的学习我做主 【hot】直播技术精选 id"cpro_u2392861_iframe" src"http://pos.baidu.com/sczm?sz300x250&rdid2392861&dc2&diu2392861&dri0&dis0&…

怎样才算得上合格的程序员

转自:http://blog.csdn.net/B9Q8e64lO6mm/article/details/78829370 最近同一部门另一个项目组的一位程序员被“主动离职”了,虽然我未曾与这个程序员共事过,但是听过一两次他的内部分享,感觉技术还是挺厉害的。后来与一个消息灵通…

c# MEF框架(一 MEF简介及简单的Demo)

转自:http://www.cnblogs.com/yunfeifei/p/3922668.html 在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架)。单从名字我们不难发现:MEF是专门致力于解决…

c# MEF框架(二 MEF的导出(Export)和导入(Import))

转自:http://www.cnblogs.com/yunfeifei/p/3922891.html 上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yun…

c# MEF框架(三 导出类的方法和属性)

转自:http://www.cnblogs.com/yunfeifei/p/3927663.html 前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来…

c# MEF框架(四 见证奇迹的时刻之实战应用)

转自 http://www.cnblogs.com/yunfeifei/p/3940075.html 前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻。如果没有看过前面的文章,请到我的博客首页查看。 前面我们都是在一个项目中写了一个类来测试的,但实…

c# MEF框架(四 MEF高级进阶)

转自:http://www.cnblogs.com/yunfeifei/p/3991330.html 好久没有写博客了,今天抽空继续写MEF系列的文章。有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后。 前面四篇讲了MEF的…

Unity3D求向量间的夹角

如下图 Vector3 srcPos new Vector3(0,0,0);Vector3 tarPos new Vector3(0,0,-1);Vector3 srcRot new Vector3(0,90,0);Quaternion srcQua Quaternion.Euler(srcRot);Vector3 direction tarPos - srcPos;Vector3 r Quaternion.Inverse(srcQua) * direction;Debug.Log(r);…

面向切面编程--AOP

转自:https://www.cnblogs.com/qicosmos/archive/2013/04/07/3003480.html (原创) C 轻量级AOP框架 c11 boost技术交流群:296561497,欢迎大家来交流技术。 c中开源的AOP框架AspectC需要单独编译才能将切面的代码织入到核心逻辑代码…

面向切面编程--AOP(二)

转自:http://www.cnblogs.com/qicosmos/p/3154174.html (原创)c11改进我们的模式之改进代理模式,实现通用的AOP框架 c11 boost技术交流群:296561497,欢迎大家来交流技术。 本次要讲的时候如何改进代理模式,具体来说是动…

VS2013+VSVIM

上世纪90年代后期出现了一股.com热潮,相信大家对其都有美好的回忆,那时使用CGI和Perl创建“动态的”网站,通过使用在Unix上的vi编辑器快速打字和格式化,这也包括后来使用的vi的复制版本vim。我可能是怀旧的,但我想念将…

一个程序员的日常书单

本想谈谈读书这个话题,想来想起觉得无从下手,就此作罢.毕业这几年,一直不敢放松,在现代这个互联网时代更加认同萧抡谓的”一日不读书,胸臆无佳想;一月不读书,耳目失清爽”.如果非要给自己找个读书的理由的话,这句诗就是最好的理由:”胸藏文墨虚若骨,腹有诗书气自华”. 与书结缘…

Amr and Pins

Description Amr loves Geometry. One day he came up with a very interesting problem. Amr has a circle of radius r and center in point (x, y). He wants the circle center to be in new position (x, y). In one step Amr can put a pin to the border of the circl…

分布式系统的工程化开发方法

转自:http://blog.csdn.net/solstice/article/details/5950190 以下是我在珠三角技术沙龙 2010Q4 上的演讲投影片。 演讲视频: http://www.youku.com/playlist_show/id_5238686.html ---------- ---------- ------

程序员的知识广度

转自:http://blog.csdn.net/EGEFCXzo3Ha1x4/article/details/79070190 “知识变现”的口号一喊 确实让很多人都摩拳擦掌蓄势待发 那么作为程序员的mu们 不管是思维逻辑,还是知识广度 是不是都迫不及待了 今天,我们也来测试下 【单选题】 1 …

多线程---条件变量

互斥器和条件变量的区别:互斥器具有加锁原语,用来进行排他性的访问共享数据,而条件变量具有等待原语,用于等待某个事件的发生。 等待条件变量的正确姿势: void wait() {mutex.lock()while (wait_flag false) {conditi…

ARP-地址解析协议(在实践中深入理解ARP协议)

在同一个网络(无特别说明,均指以太网络)中进行通信的主机,必须要拥有目标主机的MAC地址才能够正确地将数据发送给目标主机,那么如何知道目标主机的MAC地址呢?可以通过ARP协议。ARP协议就是用来获取目标IP地…

Maven私服

1 Maven私服简介 Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 1.1 下载构件顺序 建立私服后,当局域网内的用户需要某个构件时&a…

Unity3d--跨平台(一)

转自:https://www.cnblogs.com/murongxiaopifu/p/4211964.html前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇。到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在。所以&#xff0…