【问题标题】:path compression is enough for disjoint-set forests , why do we need union by rank路径压缩对于不相交的森林就足够了,为什么我们需要按等级联合
【发布时间】:2018-09-09 11:52:35
【问题描述】:
MAKE-SET(x)
    x.p = x
    x.rank = 0

UNION(x, y)
     LINK(FIND-SET(x),FIND-SET(y))

LINK(x, y)
    if x.rank > y.rank
        y.p = x
    else 
        x.p = y
        if x.rand == y.rank
            y.rank = y.rank +1

The FIND-SET procedure with path compression is quite simple:
FIND-SET(x)
    if x != x.p
        x.p = FIND-SET(x.p)
    return x.p

您可以在第 21 章的算法简介第 3 章中找到伪代码。

这是具有秩和路径压缩的不相交集森林的伪代码。 从伪代码中可以看出,每次联合操作之前,都会先求出每个节点的集合数。在带有路径压缩的 FIND-SET 操作中,x 和 y 的高度总是只有 2。因为在 FIND-SET 之后 x.p 和 y.p 都会指向集合的根。为什么还需要按等级联合?


Shihab Shahriar 解决了我的问题,他的回答令人印象深刻!

【问题讨论】:

  • 请不要在本站发布文字图片。
  • 致 Josh Lee:对不起,我已将图片替换为文字

标签: algorithm minimum-spanning-tree kruskals-algorithm disjoint-sets


【解决方案1】:

注意,我们只在执行find-set操作时应用path compression,而当我们执行两组union时不能应用路径压缩。

在按等级联合时,我们会注意使具有较低等级(或较低深度/高度)的树的根指向具有较高等级(或更多深度/高度)的树的根)。这样可以确保代表集合的树永远不会倾斜。

按等级联合的例子:

depth=1,n=2 depth=0,n=1 depth=1,n=3 O U O = O / / \ O O O

如果我们不按等级执行联合,那么树可能会变成这样:

depth=1,n=2 depth=0,n=1 depth=2,n=3 O U O = O / / O O / O 即它的高度增加了。

您可以进行摊销分析并计算find-set 的时间复杂度,当应用按等级联合时,您会发现时间永远不会超过O(log2(n))

因此,如果您不按等级执行联合,那么 find-set 操作将花费 O(d) 时间(d 表示树的深度),在最坏的情况下 d 可以变成 n(集合中的元素数)。因此对于find-set 操作,时间复杂度将首次变为O(n)。然而,对于下一个后续的find-set 操作,时间可能会减少,但关键是我们不希望任何find-set 操作的O(n) 时间。因此,对于有多个联合操作且最后有一个find-set 操作的情况,如果不使用union by rank,则会消耗O(n) 时间。

我们同时使用 union by rank 和 path 压缩,因为我们想要降低树的高度并使其小于 log2(n)(n 是不相交集中元素的数量),最终目标就是让树的高度接近一。

【讨论】:

  • > path compression can't be applied when we perform the union of two sets. 为什么在链接两个集合之前不搜索两个集合的根调用find?当我们搜索这两个集合的根时,我们可以应用路径压缩。我很难理解为什么在联合操作中应用路径压缩解决树高增长的问题时需要按等级联合。
【解决方案2】:

是的,xy 的深度将为 2,但这并不意味着根的高度发生了变化。

请注意,我们实际上从未降低任何根的等级。假设秩为 4 的根有 10 个叶子节点,即 10 个节点在这个特定集合中相距 3 条边。现在通过路径压缩,您可能已经将这 10 个中的一个提升为深度 2,例如此处的 xy。但是还剩下 9 个,根的等级仍然是 4。现在,如果我们要将这个集合与另一个等级 1 的集合联系起来,我们当然不希望我们当前的根是那个新集合的孩子,因为它会将其他 9 个节点的深度变为 5。这就是为什么除了路径压缩之外我们还需要排名。

现在,如果以某种方式将所有这 10 个叶节点提升到深度 2,我们应该减少根的等级以反映它的适当高度,但是这样做增加的复杂性似乎不值得麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多