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

不相交集合的操作

一些应用涉及将n个不同元素分成一组不相交的集合,常进行两种操作:寻找包含制定元素的唯一集合以及合并两个集合。操作进行以下定于:

MAKE-SET(x)建立一个新的集合,仅含有x

UNION(x,y)将包含x和y的两个集合合并成一个新的集合,删除原本的集合

FIND-SET(x)返回一个指向包含唯一x的集合的指针

无向图的连通分量就是一个例子。

对于如图所示的4个连通分量,先对每一个单独的点建立一个单独的集合,然后依次根据每条边合并对应的集合,最后形成4个不相交的集合

1 CONNECTED-COMPONENTS(E,V){//有E[n]个顶点V[m]条边
2     for(i=0;i<n;i++)
3         MAKE-SET(V[i]);
4     for(i=0;i<m;i++){
5         if(FIND-SET(V[i].u != FIND-SET(V[i].v))
6             UNION(V[i].u,V[i].v);
7     }
8 }

不相交集合的链表表示

(a)所示的结构通过不相交集合各自形成一个链表,索引头部包含链表的头部和尾部,链表各个结点包含指向索引头部和下个结点两个指针。对于这种结构,MAKE-SET(x)和FIND-SET(x)都可以在O(1)的时间完成。

(b)展示了UNION(x,y)的操作,需要将另一个链表连接到一个链表的末尾,然后修改索引结点的尾部,同时被合并的链表每个结点指向的索引头部都要修改,所以该操作至少要花费O(Y)的时间

为了减少合并的时间,可以在头部额外存储每个链表的大小,这样可以将小的集合合并到大的集合中去。

不相交集合森林

使用有根树来表示集合,书中每个节点包含一个成员,一棵树代表一个集合,每个成员都指向他的父结点,根结点的父结点指向自己。

(b)是合并操作,将c的父亲改为f即可。这种不相交集合森林的结构MAKE-SET和UNION的效率很高,但FIND-SET收到树高度的影响,效率较低。因此,有两种改进的启发式算法。

第一种是按秩合并,对于每个结点记录他的高度,将秩较小的结点的父亲改为大的那个。若两边相等,则任选一个作为父亲,根结点的秩加一。

第二种是路径压缩,每次调用FIND-SET的时候,将查找路径上的结点的父亲直接改为根结点。

 1 MAKE-SET(x){
 2     x.p = x;
 3     x.rank = 0;
 4 }
 5
 6 UNION(x,y){
 7     if(x.rank > y.rank)
 8         y.p = x;
 9     else{
10         x.p = y;
11         if(x.rank == y.rank)
12             y.rank++;
13     }
14 }
15
16 FIND-SET(x){
17     if(x != x.p)
18         x.p = FIND-SET(x,p);
19     return x.p;
20 }

原文地址:https://www.cnblogs.com/graywind/p/9419586.html

时间: 2024-11-08 22:53:23

算法导论——用于不相交集合的数据结构的相关文章

算法导论 第二十一章:不相交集合的数据结构

不相交集合(Disjoint-set )数据结构保持一组不相交的动态集合S={S(1),S(2),...,S(k)}.每个集合通过一个代表(representative)来识别,即集合中的某个成员.设x表示一个对象,不相交集合支持操作: MAKE-SET(x):建立一个新的结合,其唯一成员(也即代表)就是x.因为各集合是不相交的,故要求x没有在其他集合中出现过. UNION(x,y):将包含x和y的动态集合合并成一个新的集合(即这两个集合的并集).假定在这个操作之前两个集合是不相交的,操作之后,

计算机算法学习(1) - 不相交集合数据结构

不相交集合 故名思意就是一种含有多个不相交集合的数据结构.典型的应用是确定无向图中连通子图的个数.其基本操作包括: Make-Set(x):建立一个新的集合,集合的成员是x: Union(x,y): 将包含x和y的集合合并为一个集合: Find-Set(x): 返回指向包含x的集合的指针: 下面是一个例子,(a)是一个无向图,(b)是使用不相交集合来找连通子图的个数.做法是初始为各个顶点为一个集合,然后遍历各个边,把边的端点的集合进行合并,当处理完所有的边,能连通的顶点就在一个集合里了,这样就生

不相交集合的数据结构

不相交集合的数据结构 本来想着来实现基于贪婪思想的Kruskal算法-–最小生成树的算法之一. 却发现当我们合并集合时里面还涉及到一个判断"环"的问题,继而有了本篇博文:不相交集合的数据结构. 关于不相交集合的数据结构,这里作一个简单的介绍,更多的可看这里 第一:我们假设我们有n个不相交的集合{Si},i=1~n:其中每个集合中都有一个"代表元素"(这个"代表元素"你可以理解为我们班级中的"班长",对外"班长&quo

算法导论 第四部分——基本数据结构——第15章:动态规划

前言:动态规划的概念 动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分为一些独立的子问题,递归的求解各个问题,然后合并子问题的解而得到原问题的解.例如归并排序,快速排序都是采用分治算法思想.本书在第二章介绍归并排序时,详细介绍了分治算法的操作步骤,详细的内容请参考:http://www.cnblogs.com/Anker/archive/2013/01/22/2871042.html.而动态规划与此不同,适用于子问题不是独立的情况,也

算法导论学习(三)——数据结构

数据结构中字典(dictionary)的概念:支持在一个集合中插入和删除元素以及测试元素是否属于集合的操作的动态集合被称为字典. 动态集合假定对象中的一个属性被标识为关键字(key),对象可能包含卫星数据,它们与其他对象属性一起移动. 一.基本数据结构 1 栈和队列 栈(stack):后进先出(LIFO) 队列(queue):先进先出(FIFO) 栈顶指向最近被推入栈的元素的位置. 栈判空(时间复杂度O(1)): STACK-EMPTY(S) if S.top==0 return TRUE el

算法导论 第三部分——基本数据结构——红黑树

红黑树 红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK.通过对任何一条从根到叶子的路径上各个着色方式的限制, 红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的.当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能 不比用链表好.红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn). 1.红黑树的性质 #define RED 0

算法导论 第三部分——基本数据结构——二叉搜索树

一.什么是二叉搜索树 二叉查找树是按照二叉树结构来组织的,因此可以用二叉链表结构表示.二叉查找树中的关键字的存储方式满足的特征是:设x为二叉查找树中的一个结点.如果y是x的左子树中的一个结点,则key[y]≤key[x].如果y是x的右子树中的一个结点,则key[x]≤key[y].根据二叉查找树的特征可知,采用中根遍历一棵二叉查找树,可以得到树中关键字有小到大的序列. 二叉树的查找.最大/小.前驱和后继的伪代码: 复杂度都是 h //search 递归版 TREE_SEARCH(x,k) if

算法导论 学习资源

学习的过程会遇到些问题,发现了一些比较好的资源,每章都会看下别人写的总结,自己太懒了,先记录下别人写的吧,呵呵. 1  Tanky Woo的,每次差不多都看他的 <算法导论>学习总结 - 1.前言 <算法导论>学习总结 - 2.第一章 && 第二章 && 第三章 <算法导论>学习总结 - 3.第四章 && 第五章 <算法导论>学习总结 - 4.第六章(1) 堆排序 <算法导论>学习总结 - 5.第六

算法导论.pdf

下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受.全书各章自成体系,可以作为独立的学习单元:算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂:说明和解释力求浅显易懂,不失深度和数学严谨性. 全书选材经典.内容丰富.结构合理.逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教