寻找具有逆ackermann复杂度的合适的Union DST

时间:2015-04-12 02:13:32

标签: algorithm kruskals-algorithm union-find disjoint-union

我在谈论union-find-disjoint data structure。互联网上有很多关于如何实现这一点的资源。到目前为止,我已经了解了两种工会优化技术。第一个是通过变量Rank“平衡”树,它表示最深节点的深度,因此是find()的上限。第二个优化是:将对象的父对象设置为头节点,同时调用find()(该设置还包括对象的父对象,因此它成为一系列优化)。

然而,当实现同时使用它们中的两个时,它们通常在没有太多考虑的情况下将两者合并在一起。具体来说,GeeksforGeeks(仅作为一个例子,没有个人)这样做。这不会导致排名“损坏”和O(log n)复杂性吗?

例如,如果我有一长串节点(5到4到3到2到1到0,这是头部)而我将find()调用为2,则等级保持为5,即使它应该是3。

2 个答案:

答案 0 :(得分:2)

在这种实施方式中,等级仍然是树高的上限。 他们的确可能成为不精确的上限。

log* proof似乎并不依赖于上限的准确性。

Tarjan在1975年的文章"良好但非线性集合联盟算法的效率"链接在上面的页面底部,他似乎使用union-by-size而不是union-by-rank。 与精确等级不同,大小(顶点数)很容易在每个联合的O(1)运算中保持。

答案 1 :(得分:0)

Rank不是严格的深度测量。来自维基百科:

  

使用术语等级而不是深度,因为如果也使用路径压缩(...),它将停止等于深度

另请注意,您提供的示例不会发生。当按队列使用union时,没有联合的顺序会导致一串单个节点。事实上,具有等级r的树将具有至少2个 r 节点(容易通过归纳证明)。我也不清楚你是如何得出这样一个等级过高的结论"会导致对数的复杂性。