带压缩 Union Find 指令序列算法的思索

招RD和QA 2015-02-28 03:48:50
Aho书的Union Find 指令序列的问题,书中给了2个数据结构,第1个,Find是O(1)时间,但是Union需要小集合中的元素改名,所以需要O(nlgn)的时间,第2个数据结构是树,让小集合指向大集合,Union是O(1),但是Find需要O(nlgn)的时间,
再之后,又提出了一种新的带压缩的Find,这种方法的Union提出了rank的概念,让rank低树指向rank高的树,并最终证明是接近线性水平,证明中利用了一个rank的性质,是秩为r的节点数最多为n/2^r。

之后,我想,从理论上来,不管是rank低的集合指向rank高的集合,还是rank高的集合指向rank低的集合,Union操作都是O(1),而如果是后者,即是把rank高的指向rank低的话,会破坏哪些性质呢,从而导致这个证明不能成立?想了半天,没有答案,似乎只要带压缩的Find,就和Union操作中集合顺序没有关系,总能得出O(n)条指令近似线性复杂度的结论。

...全文
291 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
招RD和QA 2015-03-06
晕了,发现上面的有点问题。虽然秩为 r 的结点最多为 n/r,但每个组的结点最多也就是 n,不可能是 nlnF(g)。糊涂了。 因此以某个组 g 来看,其开销为 n * [ F(g) - F(g-1) - 1 ],全部累加有: n * [ F(1) - F(0) - 1] + n * [F(2) - F(1) - 1] + ... + n * [F(g-1) - F(g-2) - 1 ] + n * [F(g) - F(g-1) - 1] = n * [ F(g) - F(0) - g ] = n * [ F(G(n)) - 1 - G(n) ] = n ( n -G(n) - 1 ) 是O(n^2)级别。
  • 打赏
  • 举报
回复
招RD和QA 2015-02-28
哈哈,仔细想了想,有点结果。 如果按顺序(不管是树节点数目,还是树高)Union,那么有性质秩为 r 的结点数最多为 n/2^r,但是如果以任意顺序 Union,该性质则不成立,秩为 r 的结点数最多为 n/r, 先前那个线性复杂度的证明,书上的方法是平摊分析并利用了Ackerman函数(定义为F(i) = 2^F(i-1))的逆函数(假设定义为G),将 O(n) 条Union,Find指令的开销分成三类,根费用,组费用和路径费用。根费用,组费用的计算结果没有变化,而路径费用的计算会产生不同。 按顺序Union时,每个组 g 的节点最多为n/F(g)(书上有推导),有开销 n/F(g) * [ F(g)-(F(g-1) - 1) ] < n/F(g) * F(g) = n,总共G(n)组,所以开销为nG(n), 而不按序Union时,每个组的节点最多为sum(n/r) ( r = F(g-1)+1, F(g) ) < nsum(1/r) (r = 1, F(g) ) 近似为 nlnF(g), 有开销 nlnF(g) * F(g) = nF(g)lnF(g), 再考虑到G(n)个组,这个开销就很大了。但应该不是对数性质的。
  • 打赏
  • 举报
回复
招RD和QA 2015-02-28
,好快。 即使不路径压缩,只要比较树的节点数、或者树的rank,让小的指向大的。就可以得到nlgn的复杂度, 我的问题是带路径压缩,树的union以任意顺序(不比较节点数,也不比较树高)的话,也是nlgn嘛?怎么证明的?
  • 打赏
  • 举报
回复
FancyMouse 2015-02-28
只有路径压缩是n*log(n),路径压缩+rank才能做到n*alpha(n)
  • 打赏
  • 举报
回复
相关推荐
发帖
数据结构与算法
加入

3.2w+

社区成员

数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
申请成为版主
帖子事件
创建了帖子
2015-02-28 03:48
社区公告
暂无公告