这是一个关于维基百科上不相交集合森林的并查集算法的分解:
一个评论认为,在没有路径压缩的情况下,使用按秩合并(平摊
在某种程度上,路径压缩是改进按秩合并的额外步骤,这就是为什么可以省略该额外步骤而不会产生灾难性后果的原因。但是,按秩合并是否是路径压缩必要的中间步骤?我能跳过它直接进行路径压缩吗,或者那会是灾难性的?
- 裸奔的不相交集合森林...(
O(n)
)- ... 使用按秩合并...(现在改进到
O(log(n))
)- ...使用路径压缩(现在改进到
O(a(n))
,实际上是O(1)
)
- ...使用路径压缩(现在改进到
- ... 使用按秩合并...(现在改进到
实现按秩合并需要每个节点保持一个rank
字段进行比较。我的问题是,按秩合并是否值得这额外的空间?如果我跳过按秩合并,只做路径压缩,会发生什么?现在的平摊复杂度是多少?
一个评论认为,在没有路径压缩的情况下,使用按秩合并(平摊
O(log(n)
复杂度)对于大多数实际应用来说已经足够了。这是正确的。我要问的是反过来:如果您跳过按秩合并,只做路径压缩怎么样?在某种程度上,路径压缩是改进按秩合并的额外步骤,这就是为什么可以省略该额外步骤而不会产生灾难性后果的原因。但是,按秩合并是否是路径压缩必要的中间步骤?我能跳过它直接进行路径压缩吗,或者那会是灾难性的?
还指出,如果没有按秩合并,重复的合并可能会创建类似于链接列表的结构。这意味着单个路径压缩操作在最坏情况下可能需要 O(n)
的时间。当摊销在许多操作中时,这将影响未来的操作,因此我更感兴趣的是它如何发挥作用。
O(n)
时间,由于该操作会压缩该路径,因此不会重复发生相同的最坏情况时间 - 至少不会在同一路径或其任何部分上。因此,最坏情况下重复操作的分析可能与最坏情况下单个操作不同,我猜? - rwong