以下是wikipedia上不相交集合林的联合/查找算法的细分:
O(n)
)
O(log(n)
)
O(a(n))
,有效O(1)
)按等级实现联合需要每个节点保留rank
字段以进行比较。我的问题是,是否值得这个额外的空间?如果我按级别跳过联合而只是做路径压缩会发生什么?它够好吗?现在摊还的复杂性是什么?
发表评论意味着没有路径压缩的等级联合(摊销O(log(n)
复杂度)足以满足大多数实际应用。这是对的。我要问的是另一种方式:如果你按级别跳过联合而只做路径压缩怎么办?
从某种意义上说,路径压缩是通过排名改进联合的额外步骤,这就是为什么可以省略额外步骤而没有灾难性后果的原因。但是联盟是否是路径压缩的必要中间步骤?我可以跳过它直接进行路径压缩,还是会发生灾难性的?
还有人指出,如果不按等级联合,重复的工会可以创建一个类似链表的结构。这意味着在最坏的情况下,单路径压缩操作可能需要O(n)
。这当然会影响未来的运营,因此,当我对许多运营进行摊销时,这是如何实现的,这是我更感兴趣的。
答案 0 :(得分:7)
我用Google搜索“没有按级别联盟”,第二个链接是this one:
...我们关闭此部分 用路径分析union-find 压缩,但没有联合 秩...
union-find数据结构与路径 压缩但没有按等级联合 进程找到和n-1链接 时间上的操作O((m + n)log n)
答案 1 :(得分:1)
路径压缩会使树结构变平。按等级联盟有助于合并。假设你跳过后者。所以现在,你有一个没有等级信息的森林来选择如何合并。潜在地,您现在冒着将具有较大深度的树合并到具有较小深度的树的风险 - 导致不平衡的树结构。在最坏的情况下,您最终可能会得到一个链表。您的联盟的摊销时间复杂度会增加,即使对于Find仍然相同。
IMO,最好跳过路径压缩而不是排名。