【数据结构】(六)不相交集类

这篇博客介绍了等价关系的概念及其在数据结构中的应用,特别是不相交集类。文章详细阐述了基本的不相交集类实现,包括使用森林表示子集,并通过find和union操作进行操作。接着讨论了union操作的两种改进策略:按大小求并和按高度求并,以及find操作的路径压缩改进,以提高效率。

等价关系

在离散数学(Discrete Mathematics)中提到过等价关系(equivalence relation),等价关系是对于任意一对元素 (a,b),存在一个关系R满足以下三个属性:

  • 自反性:对于所有的元素a,a R a
  • 对称性:a R b == b R a
  • 传递性:若 a R b 且 b R c 则 a R c

比如空间中的相互平行的线就满足等价关系,线与自身平行、两条平行线相互平行,如果a平行于b,b平行于c,a也就平行于c,所以平行关系是等价关系。

一个集合S上的元素之间存在的等价关系是对集合S的一个划分,相互等价的元素可以划分到一个子集中,而没有等价关系的两个元素肯定不会被分到同一个子集中,所以按照等价关系划分可以将S划分为多个子集,每个子集中的元素都相互等价,这些子集是不相交的,而且他们的并正好是集合S。具有这种特性的集合可以视为一个不相交集类(The Disjoint Sets Class)

不相交集类的适合用于查找,有两个重要的操作:findunion

  • find:查找操作,find(x)是返回x所在的子集的名字
  • union:合并操作,如果我们发现两个元素a和b相互等价,但是他们没有在同一个子集中,那么很显然,a所在的子集和b所在的子集中的所有元素都相互等价,我们可以将其合并成一个新的子集

基本实现

如果不要求find操作返回任意特定的名字,而是要求当且仅当两个元素属于相同的子集时,则作用在这两个元素上的find操作能返回相同的明自。那么我就需要对集合S进行划分,并且每一个子集都有唯一的名字。

一种简单的实现方式时是哟个森林,森林中的树就是一个子集,节点就是元素,同一棵树上的所有节点就都属于这个子集,显然可以将

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值