加权快速联合解释

tem*_*boy 5 algorithm quick-union

我需要帮助理解关于加权快速联合的问题给出的解释:

以下哪个id[]数组可能是对一组10项目运行加权快速联合算法的结果?检查所有适用。

回想一下,我们的加权快速联合算法使用按大小(节点数)联合(而不是按高度联合)。

不正确:9 1 7 3 4 9 6 7 8 9
解释:9-5 7-2 5-0

不正确:2 2 2 2 5 1 2 3 1 2
解释:2-9 3-7 9-3 5-4 0-2 1-8 8-4 4-9 8-6

正确:9 9 3 4 9 4 9 9 4 2
说明:id[]数组包含一个循环:2->3->4->9->2

正确:0 2 3 0 0 2 2 9 3 0
解释:以父为2 <根的树的大小是以父为根的树的大小的两倍2

正确:0 4 6 7 4 1 5 1 7 3
解释:森林高度=4 > lg N = lg(10)

  • 我应该如何知道前两个问题所示的实际联合操作?
  • 我是否必须查看每个元素才能确定是否存在循环?
  • 我怎么知道一棵树的大小?(顺便说一句,第四个问题中给出的解释对我来说没有意义)
  • 我怎么知道森林的高度?

Vin*_*arg 5

您还没有提供完整的上下文,但我将尝试根据我对加权联合的了解来回答。

我是否必须查看每个元素才能确定是否存在循环?

不。这会违背快速联合的目的。一个循环表示联合操作没有正确执行。并且任何时候都不应该有循环。

我怎么知道一棵树的大小?

最初所有树的大小为 1。在union操作中,我们对正在连接的 2 棵树的大小求和。我们通过一个数组来跟踪大小(比如SZ[])。给定树的大小在数组 ( SZ[root(i)])中的根偏移处更新。

我怎么知道森林的高度?

这也必须被跟踪。最初所有树的高度都为 1。当您加入 2 棵树时 - 比如说A & B,您将 A 的根作为新根。那么加入的树的高度将是max(A.height, B.height+1).