不相交集合,即集合内元素无交集。在一些具体应用中,需将n个不同的元素分成一组不相交的集合。不相交集合的两个重要操作,找出给定元素所属的集合和合并两个集合。为支持不相交集合的操作,需要设计和维护数据结构来满足。导论中给出了链表和有根树两类数据结构来支持不相交集合的操作。

1、不相交集合的基本定义

不相交集合数据结构保持一组不相交的动态集合S={S1, S2,…, Sk}。每个集合通过一个代表来识别,代表即集合中的某个成员。选择代表成员视乎具体应用,如选择最小元素。

集合中的每一个元素是由一个对象表示的。设x表示一个对象,支持以下操作:

1)Make-set(x):建立一个新的集合,其唯一成员就是x。各集合是不相交的,所以x没有在其他集合中出现过;

2)Union(x,y):将包含x和y的动态集合(Sx和Sy)合并成一个新的集合(并集SxUSy),当然Sx和Sy是不相交的。

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

分析不相交集合数据结构运行时间,主要考察两个参数:

1)Make-set操作的次数n;

2)执行Make-set、Union、Find-set操作的总次数m,其中Union操作至多为n-1,因包含Make-set操作,所以m>=n。

2、不相交集合的一个应用

不相交集合数据结构的应用之一:用于确定一个无向图中连通子图的个数。算法上,首先将每个定点v置于各自的集合中,即执行Make-set操作;接着,对每一条边(u,v)进行合并,即Union操作,当然包含u和v的集合是不相交的,对每条边处理后,两个顶点在同一连通子图中的,其对应对象也在同一个集合中;最后,通过Find-set操作好处顶点是否在同一连通子图中。

3、不相交集合链表数据结构

每一个集合用一个链表表示,链表作为不相交集合的数据结构,其每一个对象都包含一个集合成员、一个指向包含下一个集合成员的对象的指针、指向代表的指针;而每个链表都包含head指针和tail指针,head指向链表的代表,tail指向链表中最后的对象。链表中对象以任何次序出现,确保第一个对象就是所在集合的代表即可。

用链表实现不相交集合数据结构,Make-set和Find-set操作都只需O(1)时间。按照上面定义的n和m参数,执行Union操作(作用于n个对象上,包含m个操作序列)的运行时间是,一个操作的平摊时间是

我对导论中的链表设计有点疑问,为什么每个对象指向代表的指针,不改为指向下一个对象的指针呢?这样在合并操作时,只要更改一个链表头尾指针,链表中每个对象不用更新。是否有其他因素考虑,比如别的操作性能更好,但暂时没理解到。

对于Union合并操作,还给出一种加权合并启发式策略,就是把较短的表拼接到较长的表。因为Union操作时,要拼接的链表,每个对象都要更新其指向代表对象的指针,这更新就和链表的长度成线性关系,所以短的链表去拼接,时间有优势。应用加权启发式策略,m个操作序列只需要O(m+nlgn)时间。

问题是:如何识别出较短长度的链表?

4、不相交集合有根树数据结构

用有根树表示集合,树中的每个结点都包含集合的一个成员,每棵树表示一个集合,群树构成森林。每棵树的根就是链表的代表,并且指向自己作为父结点。Make-set创建一个颗仅包含一个结点的树。Find-set是沿着父结点指针一直找下去,直至找到树根为止,查找路径上访问过的所有结点构成了查找路径(find path),这里不明白的是,如果有分叉,顺着父结点查找如何找到呢?Union操作使一颗树的根指向另一个树的根。

通过两种启发式策略来改进运行时间:

1)按秩合并:和链表中的加权合并思路一致,将较少结点的树的根指向包含较多结点的树的根。具有较小秩的根在Union操作中药指向具有较大秩的根。

2)路径压缩:在Find-set操作中,使查找路径上的每个结点都指向根节点。这个好理解,就是n个元素的集合,1个根,其他n-1个都是子女,互相构成兄弟,只有2层深度树。

当同时使用按秩合并和路径压缩时,最坏情况运行时间为,其中是一个增长极其缓慢的函数,在任意可想象的不相交集合数据结构应用中

对作用于n个元素上的m个不相交集合操作,联合使用按秩合并和路径压缩启发式的运行时间是界。导论中证明了是增长极其缓慢的函数。

证明的界是用平摊分析中的势方法,证明是增长极快函数的逆函数。有趣的是这个增长尽快的函数。计算机算法基础,之所以离不开数学,就在于任何算法的合理性(时间界运行性能)都需要数学的证明,当然设计算法(或说是模型)也需要数学基础,否则就是无根之萍。

每种算法,每种数据结构,都尤其特定应用场合,所以在实际应用中,改良甚至创新都是必要的,但都要基于扎实的数学理论基础。一种算法、一种数据结构,可以说是一种模型,是一种在应用中归纳升华出来的一种理论,可以应用于同类场合。当然关乎到数学基本问题,比如集合论对计算机理论的支持。

算法导论之用于不相交集合的数据结构相关推荐

  1. 算法导论-用于不相交集合的数据结构

    21.2-4 对于图21-3中操作序列的运行时间,给出其紧确的渐近界.假定采用的是链表表示和加权合并启发式策略. 解:make-set,O(n):加权合并启发,每次将较短链表链接到较长链表,即每次将长 ...

  2. 数据结构与算法——并查集(不相交集合)

    文章目录 认识并查集 并查集解析 基本思想 如何查看a,b是否在一个集合? a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上? 其他路径压缩? 代码实现 结语 认识并查集 对于并查集 ...

  3. vb6实现union数据结构_数据结构与算法——并查集(不相交集合)

    首发公众号:bigsai 认识并查集 对于并查集(不相交集合),很多人会感到很陌生,没听过或者不是特别了解.实际上并查集是一种挺高效的数据结构.实现简单,只是所有元素统一遵从一个规律所以让办事情的效率 ...

  4. 算法导论中英文版下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 算法导论 ...

  5. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

  6. 《算法导论(原书第3版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为一体,深入讨论各类算法,并着力 ...

  7. Facebook工程师告诉你,如何正确的阅读《算法导论》(CLRS)?

    第一章 挺有趣的,不过你可以跳过. 第二章 2.1 插入排序--老实说,你应该知道所有主要的排序算法,而不仅仅是插入排序.这只是基本的知识,你永远不知道什么时候有用. 2.2 算法分析--你可以跳过简 ...

  8. Python数据结构与算法(1.1)——数据结构与算法导论

    Python数据结构与算法(1.1)--数据结构与算法导论 0. 学习目标 1. 数据结构概述 1.1 什么是数据结构 1.2 逻辑结构和物理结构 1.3 抽象数据类型 1.4 数据结构学习的必要性 ...

  9. 算法导论 pdf_学习数据结构和算法最好的书是什么?

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

最新文章

  1. 基于OpenCV的实时停车地点查找
  2. 最终篇:简洁易懂,初学者挑战学习Python编程30天 (五)
  3. 我是如何面试别人List相关知识的
  4. 2022届互联网秋招备战
  5. Win7系统电脑修改不了文件属性怎么办
  6. Page_PreInit在网页传值的应用
  7. java 心跳程序_Java实现心跳机制的方法
  8. 表单内如何直接贴图而不用上传图片_重磅更新|偷偷告诉你,表单大师官网改版啦啦啦啦...
  9. SAP License:SAP 清帐函数示例
  10. hdu 1316 斐波那契数
  11. 使用xftp工具修改文件权限
  12. C++--第1课 - C到C++的升级
  13. netty权威指南(第二版)对应的源码
  14. php cms下载地址,让PHPCMS下载内容页显示链接真实地址
  15. TOLUA的文件结构
  16. 【互联网大厂机试真题 - 华为】九宫格
  17. 部编版是什么版本_人教版是部编还是统编
  18. python拟合二次函数_Python 最小二乘法 拟合 二次曲线
  19. PHP实现斐波纳契数列
  20. 大型Solidworks装配设计与仿真工作站配置方案

热门文章

  1. python异常包_python异常处理与导入模块与导入包
  2. Ubuntu下安装和配置Apache2方法简介
  3. CList 点击表头排序 (1)SortItems函数
  4. DropDownList联动
  5. Elasticsearch5.X IN Windows 10 系列文章(1)
  6. android学习笔记34——ClipDrawable资源
  7. malloc动态分配多维数组
  8. 【Android-功能】Android应用增量更新
  9. SQL2008错误:当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关)。...
  10. LoadRunner 11.0 - 安装破解(个人试用成功)