数据结构 Chapter 8 - The disjoint set ADT
等效关系
本章首先介绍了此章数据结构的数学模型:等效关系和具备该关系元素的集合。
等效关系分为三条属性:
- 自身性:对集合中的所有元素,都与与其自身等效
- 对称性:如果a与b等效,则b与a等效
- 传递性:如果a等效于b,b等效于,则a等效于c
等效关系包括如:电子连接性、城市被道路连接等。
等效问题数据结构
要解决等效问题的数据结构模拟,可以用数组(array)树来进行模拟集合。首先各个元素各处于各自的单独集合中,此时各元素互不等效。由于在等效问题中,我们只需要判断两个元素是否在一个集合中,而不需要其具体在集合中的位置信息,所以我们可以用数组的index来表示元素,用相应index的数组中的所存数值来表示其parent。如果某元素已经是根了,则其相应数组中的数值应为0(假设在0位置的数组中不存元素)。
该数据结构应至少存在两个operation,一个为Find(),用于找出给定元素所在的集合,一个为Union,将两个集合进行合并。
Find()的实现方式为给定一个元素,用其根表示其所在的集合,若两个元素的根相同,则二者等效。Union()的实现方式为,将两者的其中一个变为另一个的parent即可。
相应地,有一定的优化选择来提高运行速度。
对Find的优化为path compression。由于集合的平均高度越小,Find的运行时间越短O(H),故在每次运行find时,将路径上的所有元素都变为根的child,称为path compression,可以对整个集合树进行优化。
对Union的优化为对Union中的元素进行额外信息标注。每个集合应该记录下其总元素数或者其最大高度,此值可以记录在根元素里,原来的0变为总元素数或者最大高度的负数即可。在实际中,使用最大高度更为常见,之后在union中我们选择将高度小的集合作为高度大的集合的子树来合并即可。注意如果进行path compression,最大高度可能会变化,此时的最大高度将不再成为最大高度,而是称为rank,永远小于等于最大高度。分析发现,以rank代替最大高度来进行合并并不影响优化的结果。
对于一个Union的M次Find/Union操作,其时间为O(MlogN). (logN 基本小于等于4,为1到4之间的整数) 运行时间基本约等于线性增加。
浙公网安备 33010602011771号