为什么加权快速联合算法会考虑树的大小而不是它们的高度?

时间:2015-06-20 18:46:46

标签: algorithm data-structures graph-algorithm union-find

我正在观看Robert Sedgewick关于快速联盟改进的视频。 (https://youtu.be/sEo6LlPxpHE?t=267

他使用树的大小而不是高度。实际上问题是找到根节点。如果高度很高,发现将很困难。所以我们应该找到一种方法来减轻身高的影响。只有我们比较高度才能达到预期的效果?将较短的树连接到较高的树而不是解决问题而是做:将具有较少节点数的树连接到具有较大节点数的树?

以下情况怎么样? enter image description here

根据视频中的逻辑:

树的大小= 4

B树的大小= 7

如果您将A连接到B.实际上我们正在使结果树更高(高度4)。但是,如果我们基于树高度完成它,我们可以通过将树B连接到A来解决它。结果树的高度为3。

我是对的吗? 如果错了我在哪里错了?

3 个答案:

答案 0 :(得分:8)

请记住,大多数不相交集林的实现都应用路径压缩优化,在每次查找期间,您都会更改链中所有节点的父指针,以便它们全部指向他们的代表。

事实证明,如果你使用路径压缩并在压缩它们之前跟踪所有节点的高度,那么按高度链接的渐近性能(通常称为 union-by-rank 其中“等级”是任何按压之前的高度),并且按重量的连接是相同的。两者都给出了逆Ackermann时间复杂度。这个结果来自this paper,这是非常技术性的,但确实证明了这两个结果。

即使你不这样做,还有另一种方法可以看出这两种方法(大致)彼此相等。请注意,如果您有一个高度为1的树,则它必须至少有两个节点。为什么?好吧,你可以制作一个高度为一的树的唯一方法是合并到高度为零的树,每个树必须至少有一个节点。使用类似的逻辑,你可以看到,如果你有一个高度为2的树,那么它必须至少有四个节点,因为要形成它,你必须将两个高度为1的树合并在一起。更一般地说,您可以显示高度为n的树必须至少包含2个 n 节点。因此,按高度合并基本上与按重量合并相同,因为树木的高度和大小之间存在紧密联系。

希望这有帮助!

答案 1 :(得分:1)

按大小或高度加权的快速联合大致相同,它们具有相同的上限,如之前@templatetypedef所述。

让我分享更多细节。

在按大小加权的策略中,让一棵树T有一个节点x,其深度(或高度)h为1。仅当{{ 1}}合并到另一棵树,其大小等于或大于T。所以,

  • 对于h = 1,树大小N = 1
  • h = 2,N> = 2
  • h = 3,N> = 4
  • h = 4,N> = 8
  • ....

换句话说,h的上限是lgN + 1(T)。

如果工会发现按身高加权怎么办?显然,当树深度为h <= (lgN + 1)时,至少需要2个节点。当h = 2时,最小节点数为4(两棵深度为2的树,两个节点的最小合并数)。情况与上面相同,

  • 对于h = 1,树的大小N = 1
  • h = 2,N> = 2
  • h = 3,N> = 4
  • h = 4,N> = 8
  • ....

对于以身高加权的工会发现,我们得出结论:h = 3。也就是说,无论按高度或大小加权,其深度都具有相同的上限。

关于您提到的令人困惑的情况,这是由于合并的随机性造成的,我们已经找到了深度的上限,可以说是h <= (lgN + 1),但是结果可能是{{1} }或5,或任何不超过4的数字,取决于合并的顺序。

在算法问题1.5.14,第237页上,又有一个词,《算法》(第4版)确实提到了按高度加权的快速结合。

答案 2 :(得分:0)

首先,正如其他人所提到的,尺寸和高度都有相似的表现。

但是,为什么我们选择尺寸超过高度? 我认为这是因为在路径压缩期间高度会发生变化,而尺寸则不会。

这是我自己的意见,因为我没有在任何地方找到它。希望这是真的。