Algorithm 路径压缩和按秩合并是如何互补的?
我一直在读关于工会发现问题的书。两个主要的改进是路径压缩和按秩并集。据我所知,按秩并集用于确定如何组合不相交的树。如果我们有两个不相交的树T1和T2,那么我们将秩较小的树的根附加到秩较高的树上。如果我们不使用路径压缩,那么秩就是树的深度。这是有意义的,因为我们不想增加外树的深度,因为它直接影响查找和联合 我的问题是当我们也使用路径压缩时。我一直在读这两种优化是相辅相成的,但我看不到这一点。由于路径压缩,秩不再是树的深度(它成为深度的上限)。假设T1有2个分支(设T1的秩为3),T2有深度2和秩2。现在假设我们对下面标有“*”的T1的叶子执行查找操作(使用路径压缩)。现在,如果我们将T1的根和T2的根联合起来,那么T2将附加到T1的根(因为find不会更新秩)。生成的树具有深度3。但是如果我们把T1和T2连接起来,我们本可以有更好的性能Algorithm 路径压缩和按秩合并是如何互补的?,algorithm,tree,disjoint-sets,union-find,Algorithm,Tree,Disjoint Sets,Union Find,我一直在读关于工会发现问题的书。两个主要的改进是路径压缩和按秩并集。据我所知,按秩并集用于确定如何组合不相交的树。如果我们有两个不相交的树T1和T2,那么我们将秩较小的树的根附加到秩较高的树上。如果我们不使用路径压缩,那么秩就是树的深度。这是有意义的,因为我们不想增加外树的深度,因为它直接影响查找和联合 我的问题是当我们也使用路径压缩时。我一直在读这两种优化是相辅相成的,但我看不到这一点。由于路径压缩,秩不再是树的深度(它成为深度的上限)。假设T1有2个分支(设T1的秩为3),T2有深度2和秩2
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实现这一点,我会损失什么为什么?哦,这很有道理。非常感谢。:)哦,这很有道理。非常感谢。:)