等价关系
在离散数学(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)
不相交集类的适合用于查找,有两个重要的操作:find和union:
find:查找操作,find(x)是返回x所在的子集的名字union:合并操作,如果我们发现两个元素a和b相互等价,但是他们没有在同一个子集中,那么很显然,a所在的子集和b所在的子集中的所有元素都相互等价,我们可以将其合并成一个新的子集
基本实现
如果不要求find操作返回任意特定的名字,而是要求当且仅当两个元素属于相同的子集时,则作用在这两个元素上的find操作能返回相同的明自。那么我就需要对集合S进行划分,并且每一个子集都有唯一的名字。
一种简单的实现方式时是哟个森林,森林中的树就是一个子集,节点就是元素,同一棵树上的所有节点就都属于这个子集,显然可以将

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

被折叠的 条评论
为什么被折叠?



