联合/查找算法没有联合排序为不相交的森林数据结构

时间:2010-02-24 02:53:25

标签: algorithm data-structures time-complexity disjoint-sets amortized-analysis

以下是wikipedia上不相交集合林的联合/查找算法的细分:

  • Barebone脱节森林......(O(n)
    • ...按等级联盟......(现改进为O(log(n)
      • ...使用路径压缩(现已改进为O(a(n)),有效O(1)

按等级实现联合需要每个节点保留rank字段以进行比较。我的问题是,是否值得这个额外的空间?如果我按级别跳过联合而只是做路径压缩会发生什么?它够好吗?现在摊还的复杂性是什么?


发表评论意味着没有路径压缩的等级联合(摊销O(log(n)复杂度)足以满足大多数实际应用。这是对的。我要问的是另一种方式:如果你按级别跳过联合而只做路径压缩怎么办?

从某种意义上说,路径压缩是通过排名改进联合的额外步骤,这就是为什么可以省略额外步骤而没有灾难性后果的原因。但是联盟是否是路径压缩的必要中间步骤?我可以跳过它直接进行路径压缩,还是会发生灾难性的?


还有人指出,如果不按等级联合,重复的工会可以创建一个类似链表的结构。这意味着在最坏的情况下,单路径压缩操作可能需要O(n)。这当然会影响未来的运营,因此,当我对许多运营进行摊销时,这是如何实现的,这是我更感兴趣的。

2 个答案:

答案 0 :(得分:7)

我用Google搜索“没有按级别联盟”,第二个链接是this one

  

...我们关闭此部分   用路径分析union-find   压缩,但没有联合   秩...

     

union-find数据结构与路径   压缩但没有按等级联合   进程找到和n-1链接   时间上的操作O((m + n)log n)

答案 1 :(得分:1)

路径压缩会使树结构变平。按等级联盟有助于合并。假设你跳过后者。所以现在,你有一个没有等级信息的森林来选择如何合并。潜在地,您现在冒着将具有较大深度的树合并到具有较小深度的树的风险 - 导致不平衡的树结构。在最坏的情况下,您最终可能会得到一个链表。您的联盟的摊销时间复杂度会增加,即使对于Find仍然相同。

IMO,最好跳过路径压缩而不是排名。