我一直在研究并查集问题。两个主要的改进是路径压缩和按秩合并。据我所知,按秩合并用于确定如何组合不相交的树。如果我们有两棵不相交的树T1和T2,那么我们将较小秩的树的根节点连接到较大秩的树上。如果我们不使用路径压缩,则秩仅为树的深度。这是有道理的,因为我们不想增加树的深度,因为它直接影响查找和合并。
我的问题是当我们也使用路径压缩时。我一直在阅读两种优化互补的说法,但我没有看出来。由于路径压缩,秩不再是树的深度(它变成了深度的上界)。假设T1有2个分支(T1的秩为3),T2的深度为2,秩为2。现在假设我们对标记为“*”的T1叶子进行查找操作(使用路径压缩)。现在,如果我们联合T1和T2的根节点,则T2将附加到T1的根节点上(因为查找不会更新秩)。结果得到的树的深度为3。但是如果我们将T1连接到T2,性能会更好。
在T1的叶子节点上执行"*"操作后,对T1和T2的根节点进行合并,我们得到了以下结果:
这里有什么我不明白的吗?路径压缩和按秩合并如何互补?我知道秩只是树深度的上界,但我不明白按秩并如何提高结构的整体性能。与随机组合根节点相比,这种方式更好在哪里?
先感谢您的帮助。
我的问题是当我们也使用路径压缩时。我一直在阅读两种优化互补的说法,但我没有看出来。由于路径压缩,秩不再是树的深度(它变成了深度的上界)。假设T1有2个分支(T1的秩为3),T2的深度为2,秩为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
这里有什么我不明白的吗?路径压缩和按秩合并如何互补?我知道秩只是树深度的上界,但我不明白按秩并如何提高结构的整体性能。与随机组合根节点相比,这种方式更好在哪里?
先感谢您的帮助。