union-find结构是一种数据结构
支持以下操作:
●find(x),返回代表
节点x和
●union(x,y),它合并包含x的集合
和y成一套。
Find(x)的时间复杂度为 O(n),因此为了改善这一点,我们建议使用 Ranks
的概念即。
较大的连接组件会占用较小的连接组件
这会将时间复杂度提高到 O(logn)
我无法理解我们如何提高时间复杂度通过将树木合并到Rank(Depth)的基础知识,以及如何实现O(logn)时间复杂度。
请帮助我理解我根据他们的排名合并树木的概念。
答案 0 :(得分:4)
关键是要了解表示集合大小为log(n) + 1
的树的最大高度,因此,从任何给定节点到其根节点的后续节点都是通过O(log(n))
步骤完成的。
我们现在必须证明声称不相交集森林中的每棵树最多都是高度log(n) + 1
- 其中n
是此树中的节点数。我们将通过归纳证明它,并表明在每个union(x,y)
之后 - 此属性保持不变。
基础:当我们开始时,我们有n
个不同的树,大小为1 log(1) + 1 = 1
- 因此每棵树确实具有最大高度log(n) + 1
联盟(x,y):我们统一了两个大小为x
的{{1}}和大小为n1
的y。不失一般性,请n2
。
从归纳假设来看,代表n1<=n2
的树的高度h1最多为x
因此,通过将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为基础。