【问题标题】:How do path compression and union by rank complement each other?路径压缩和按等级联合如何相互补充?
【发布时间】:2017-01-16 23:43:42
【问题描述】:

我一直在阅读有关联合查找问题的信息。两个主要改进是路径压缩和按等级联合。据我了解,按等级联合用于确定如何组合不相交的树。如果我们有两棵不相交的树 T1 和 T2,那么我们将具有较小等级的树的根附加到具有较高等级的树上。如果我们不使用路径压缩,那么排名只是树的深度。这是有道理的,因为我们不想增加 out tree 的深度,因为它直接影响 find 和 union。

我的问题是当我们也使用路径压缩时。我一直在读到这两种优化相辅相成,但我没有看到。由于路径压缩,排名不再是树的深度(它成为深度的上限)。假设 T1 有 2 个分支(设 T1 的 rank 为 3),T2 的深度为 2,rank 为 2。现在假设我们在下面标有“*”的 T1 的叶子上执行查找操作(带有路径压缩)。现在,如果我们联合 T1 的根和 T2 的根,那么 T2 将附加到 T1 的根(因为查找不会更新排名)。结果树的深度为 3。但如果我们将 T1 附加到 T2,我们可能会有更好的性能。

T1:   o   (Rank = 3)    T2:   o  (Rank = 2)
     / \                      |
    o   o                     o
    |                         |
    o                         o
    |   
    *   

在 T1("*") 的叶子上找到后,然后在 T1 和 T2 的根上并集,我们得到

T1:    o       (Rank = 3)      T2: o  (Rank = 2)       
     /| |\                         |
    * o o o                        o
                                   |
                                   o
Result of T1 union T2
       o
   / | | |\
  * o o o  o   Rank = 3 and Max Depth = 3
           |
           o
           |
           o

我在这里错过了什么吗?路径压缩和按等级联合如何相互补充?我知道等级只是树深度的上限,但我看不出按等级联合如何提高结构的整体性能。这比随机组合根的 union 更好吗?

提前感谢您的帮助。

【问题讨论】:

  • 您为什么说“如果我们将 T1 连接到 T2,我们可以有更好的性能”?如果联合之后是在每个节点上进行查找,那么这将导致更多的工作。
  • 我对更好性能的理解是,如果树更深,则查找和联合需要更多时间来定位其最高代表(根) - 由于路径压缩,后续查找和联合操作会更快。但这只是路径压缩的工作。我只是无法理解按等级联合是如何提高性能的,因为等级并不能准确地捕捉树的深度。我想我的问题可能会更好 - 如果我只是通过路径压缩来实现它,我会失去什么?为什么?

标签: algorithm tree disjoint-sets union-find


【解决方案1】:

按等级联合确保树的最大深度为 log N,因此它为每个操作设置了 O(log N) 的最坏情况上限。

没有任何特殊联合的路径压缩规则每个操作的摊销成本上限为 O(log N),但不限制最坏情况成本 . (甚至可能对摊销成本有更严格的限制,但 O(log N) 是我知道如何证明的)

将两者结合使用,您可以得到最坏情况下的 O(log N) 限制并且摊销界限改进为 O(?(N)),这实际上是恒定的。这样,两种优化是互补的。

您是对的,有些操作序列按等级联合并不是绝对最优的,但 保证 比没有它时得到的要好,这才是最重要的。我们通常不会花精力优化最佳案例性能。我们优化最差平均的情况。

【讨论】:

  • 哦,这很有道理。非常感谢。 :)
【解决方案2】:

如果您使用按等级/权重联合,则问题中的图 T2 无法首先形成。

自己试试 3 个节点,看看能不能画出图 T2。这是不可能的。甚至连图T1一开始都无法形成。

您可以从 N 个节点的示例开始,如果您按排名/权重从头开始进行联合,您实际上会看到它会给出一个最佳的合并结构(一些操作序列可能没有给出最好的合并,但大多数时候它给出了最好的结果)。

换句话说,按等级/权重联合有助于查找方法(该方法又使用路径压缩进行进一步优化),这使得查找操作几乎是恒定时间操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多