Algorithm 路径压缩和按秩合并是如何互补的?

Algorithm 路径压缩和按秩合并是如何互补的?,algorithm,tree,disjoint-sets,union-find,Algorithm,Tree,Disjoint Sets,Union Find,我一直在读关于工会发现问题的书。两个主要的改进是路径压缩和按秩并集。据我所知,按秩并集用于确定如何组合不相交的树。如果我们有两个不相交的树T1和T2,那么我们将秩较小的树的根附加到秩较高的树上。如果我们不使用路径压缩,那么秩就是树的深度。这是有意义的,因为我们不想增加外树的深度,因为它直接影响查找和联合 我的问题是当我们也使用路径压缩时。我一直在读这两种优化是相辅相成的,但我看不到这一点。由于路径压缩,秩不再是树的深度(它成为深度的上限)。假设T1有2个分支(设T1的秩为3),T2有深度2和秩2

我一直在读关于工会发现问题的书。两个主要的改进是路径压缩和按秩并集。据我所知,按秩并集用于确定如何组合不相交的树。如果我们有两个不相交的树T1和T2,那么我们将秩较小的树的根附加到秩较高的树上。如果我们不使用路径压缩,那么秩就是树的深度。这是有意义的,因为我们不想增加外树的深度,因为它直接影响查找和联合

我的问题是当我们也使用路径压缩时。我一直在读这两种优化是相辅相成的,但我看不到这一点。由于路径压缩,秩不再是树的深度(它成为深度的上限)。假设T1有2个分支(设T1的秩为3),T2有深度2和秩2。现在假设我们对下面标有“*”的T1的叶子执行查找操作(使用路径压缩)。现在,如果我们将T1的根和T2的根联合起来,那么T2将附加到T1的根(因为find不会更新秩)。生成的树具有深度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
我是不是遗漏了什么?路径压缩和按秩合并是如何互补的?我知道排名只是树深度的上界,但我看不出按排名合并如何提高结构的整体性能。这怎么会比随机组合根的联盟更好呢


提前感谢您的帮助。

按秩联合可确保树的最大深度为logn,因此它会在每个操作上设置最坏情况的上限O(logn)

没有任何特殊并集的路径压缩在每个操作的摊余成本上规定了O(logn)的上限,但不限制最坏情况下的成本。(摊销成本可能有更严格的界限,但O(logn)是我知道如何证明的)


同时使用这两种方法,可以得到最坏情况下的O(logn)限制,摊销界限提高到O(Union by rank)可确保树的最大深度为logn,因此它在每个操作上都设置了最坏情况下的O(logn)上限

没有任何特殊并集的路径压缩规则每个操作的摊余成本的上界为O(logn),但不限制最坏情况下的成本。(摊余成本的上界可能更紧,但O(logn)是我知道如何证明的)


同时使用这两种方法,可以得到最坏情况下的O(logn)极限,摊销界限提高到O(问题中的图T2,如果使用秩/权重并集,则首先无法形成

你自己试着用3个节点,看看你是否能得到图T2。这是不可能的。甚至图T1也不能在第一时间形成

您可以从N个节点的示例开始,如果您从一开始就按秩/权重进行并集,您将实际看到它将提供最佳合并结构(某些操作序列可能不会提供最佳合并,但大多数情况下,它会提供最佳结果)


换句话说,按秩/权重的并集有助于查找方法(它反过来使用路径压缩进行进一步优化),使查找操作几乎成为常数时间操作。

如果使用按秩/权重的并集,则首先无法形成问题中的图T2

你自己试着用3个节点,看看你是否能得到图T2。这是不可能的。甚至图T1也不能在第一时间形成

您可以从N个节点的示例开始,如果您从一开始就按秩/权重进行并集,您将实际看到它将提供最佳合并结构(某些操作序列可能不会提供最佳合并,但大多数情况下,它会提供最佳结果)


换句话说,按秩/权重联合有助于查找方法(它反过来使用路径压缩进行进一步优化),使查找操作几乎成为常数时间操作。

为什么您会说“如果我们将T1连接到T2,我们本可以有更好的性能”?如果在联合之后,比如说在每个节点上查找,那么这将导致更多的工作。我对更好性能的理解是,如果树更深,则查找和联合需要更多的时间来查找其最高代表(根)-由于路径压缩,后续的查找和联合操作将更快。但这只是路径压缩的工作。我只是无法理解按秩联合如何提高性能,因为秩不能准确捕获树的深度。我想我的问题可能会更好-如果只使用路径c实现这一点,我会损失什么Compression及其原因?为什么你会说“如果我们将T1连接到T2,我们本可以获得更好的性能”?如果在联合之后,例如在每个节点上进行查找,那么这将导致更多的工作。我对更好性能的理解是,如果树越深,则查找越深,并且联合需要更多的时间来找到其最高代表(根)-由于路径压缩,后续的查找和联合操作将更快。但这只是路径压缩的工作。我只是无法理解按秩联合如何提高性能,因为秩不能准确捕获树的深度。我想我的问题可能会更好-如果只使用路径c实现这一点,我会损失什么为什么?哦,这很有道理。非常感谢。:)哦,这很有道理。非常感谢。:)