【问题标题】:union by size vs union by rank in disjoint-set algorithm不相交集算法中按大小联合与按等级联合
【发布时间】:2020-11-25 17:24:50
【问题描述】:

简而言之:按等级联合是否仅在某些情况下有效?

例如,输入是: (1, 2), (3,4), (3,5),在我们对它们运行不相交集算法之后:

其中一个正确的输出应该是(1,2), (3,4,5)。而根(2组的代表)分别是24。森林应该是这样的:

2                 4
 \               / \
  1             3   5

问题来了,如果我需要按输出的大小按降序对输出进行排序(所以首先是更大的大小):

如果我使用 union by size(只是它的后代数量,包括节点本身),size(2) == 2size(4) == 3,那么正确的集合应该放在第一位。一切都好;

如果我使用 按等级联合(其高度的上限),rank(2) == 1rank(4) == 1,左右集是相等的,这不是我想要的。所以union by rank在这种情况下失败了,NO good

这是为什么呢?这是否意味着按等级联合有其局限性?如果是这样,在什么情况下我们可以使用union by rankunion by size 是否更通用?

【问题讨论】:

  • 我不清楚你在问什么。您是否尝试按大小升序输出不相交的集合? “按等级联合”在什么意义上不起作用?您是说对于某些根 A 和 B,您可以有 rank(A) size(B)?
  • @PaulHankin 嗯,很抱歉造成混乱。我打算按大小降序输出不相交的集合;如果我使用 union by rank,则 2 个集合的等级均为 1,这不是正确的输出。因此,在这种情况下,按等级联合 不起作用。我想知道这是 union by rank 的限制还是我执行错了?

标签: algorithm graph disjoint-sets union-find


【解决方案1】:

union-by-rank 启发式和 union-by-size 启发式的要点是最小化 Merge 操作的预期运行时间。它们不用于任何其他目的。

您的用例显然涉及按大小对集合进行排序,这是一种不寻常但并非闻所未闻的事情。如果您使用 union-by-size 启发式,则无需额外工作即可完成此操作。 (这并不会影响渐近复杂性,因为即使在按等级进行联合时,每个集合的大小也可以轻松维护。)因此,对于这个用例来说,按大小联合听起来对您来说更方便。但它们都工作在它们设计的上下文中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2014-03-10
    • 2023-02-24
    相关资源
    最近更新 更多