【发布时间】: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