博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法导论——用于不相交集合的数据结构
阅读量:6455 次
发布时间:2019-06-23

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

不相交集合的操作

         一些应用涉及将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

不相交集合的链表表示

(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 }

 

个人GitHub地址: https://github.com/GrayWind33

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

你可能感兴趣的文章
[Processing]点到线段的最小距离
查看>>
考研随笔2
查看>>
ubuntu Linux 操作系统安装与配置
查看>>
操作系统os常识
查看>>
乱码的情况
查看>>
虚拟机centos 同一个tomcat、不同端口访问不同的项目
查看>>
在不花一分钱的情况下,如何验证你的创业想法是否可行?《转》
查看>>
Linux/Android 性能优化工具 perf
查看>>
GitHub使用教程、注册与安装
查看>>
论以结果为导向
查看>>
CODE[VS] 1294 全排列
查看>>
<<The C Programming Language>>讀書筆記
查看>>
如何在目录中查找具有指定字符串的文件(shell)
查看>>
DotNet(C#)自定义运行时窗体设计器 一
查看>>
JS详细入门教程(上)
查看>>
Android学习笔记21-ImageView获取网络图片
查看>>
线段树分治
查看>>
git代码冲突
查看>>
lnmp1.3 配置pathinfo---thinkphp3.2 亲测有效
查看>>
利用android studio 生成 JNI需要的动态库so文件
查看>>