[英]Disjoint Set and Union Data Structure
联合查找结构是一种支持以下操作的数据结构:
● find(x),返回节点x的代表,以及
● union(x, y),将包含x 和y 的集合合并为一个集合。
Find(x) 的时间复杂度为O(n) ,因此为了改进这一点,我们建议使用Ranks 的概念
即较大的连接组件吃掉较小的组件
这将时间复杂度提高到O(logn)
我无法理解我们如何通过合并树的 Rank(Depth) 基础来提高时间复杂度,以及如何实现 O(logn) 时间复杂度。
请帮助我理解我根据等级合并树的概念。
关键是要理解表示集合的树的最大高度是log(n) + 1
的大小,因此,从任何给定节点到其根节点的后续节点是通过O(log(n))
步骤完成的。
我们现在必须证明不相交集森林中每棵树的高度最多为log(n) + 1
- 其中n
是这棵树中的节点数。 我们将通过归纳证明它并表明在每个union(x,y)
- 这个属性保持不变。
基数:当我们开始时,我们有n
不同的树,所有的大小都是 1。 log(1) + 1 = 1
- 所以每棵树确实是最大高度log(n) + 1
Union(x,y) :我们合并两个集合,大小为n1
x
和大小为n2
y。 不失一般性,令n1<=n2
。
根据归纳假设,表示x
的树的高度 h1 至多为log(n2)+1
因此,联合运算是通过将x
的根更改为指向y
的根来完成的。 这意味着x
中任何节点的最大高度现在最多为
h1+1 = log(n1)+1 + 1 = log(n1) + log(2) + 1 = log(2*n1) + 1 = log(n1 + n1) + 1 <= log(n1 + n2) + 1
所以,我们刚刚发现,对于正式在x
每个节点,到根的最大距离是log(n1+n2) + 1
,并且新树的大小( x
和y
合并)现在是n1+n2
,所以我们证明了对于任何形式上在x
节点,所需的属性仍然存在。
对于y
- 到根的距离保持不变,而树的大小不会缩小 - 因此该属性在那里也有效。
总之 - 对于所有在x
或y
节点,根据需要,新根的最大深度现在是log(n1+n2)+1
。
QED
备注 - 此答案中的所有log
均以 2 为基数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.