gpt4 book ai didi

algorithm - 为什么加权联合查找算法的操作时间复杂度为 O(lgN)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:36:33 27 4
gpt4 key购买 nike

所以无论我在哪里看到加权联合查找算法,他们都使用这种方法:

  1. 维护一个指向特定节点父节点的数组
  2. 维护一个数组,表示节点所在树的大小
  3. 对于 union (p,q) 将较小的树与较大的树合并

这里的时间复杂度是O(lgN)


现在对此的优化是将树展平,即,每当我计算特定节点的根时,将该路径中的所有节点设置为指向该根。

这个的时间复杂度是O(lg*N)


这我能理解,但我不明白的是,为什么他们不从一个数组/哈希集开始,其中节点指向根(而不是直接父节点)?这会将时间复杂度降低到 O(1)。

最佳答案

我将假设您要求的时间复杂度是检查 2 个节点是否属于同一集合的时间。

关键在于集合的连接方式,特别是您取一个集合(较小的集合)的根并让它指向另一个集合的根。让两组有pq分别作为根,和|p| will 表示集合的大小 p如果p是一个根,而通常它将是设置路径经过 p(即 1 + 所有子节点)的项目数。

我们可以不失一般性地假设 |p| <= |q| (否则我们只是交换他们的名字)。然后我们有|p u q| = |p|+|q| >= 2|p| .这向我们表明,数据结构中的每个子树最多只能是其父树的一半大,因此给定N。它最多可以有深度的项目 1+lg N = O(lg(N)) .

如果两个选择的项目距离根最远,则需要O(N)为每个集合找到根的操作,因为你只需要 O(1)在集合中向上移动一层的操作,然后是O(1)比较这些根的操作。

此成本也适用于每个联合操作本身,因为您需要确定需要合并哪两个根。我们不让所有节点都直接指向根的原因有几个方面。首先,每次执行并集时,我们都需要更改集合中的所有节点,其次,我们只有从节点指向根的边,而不是相反的方向,因此我们必须遍历所有节点才能找到这些节点我们需要改变。下一个原因是我们有很好的优化可以帮助这种步骤并且仍然有效。最后,如果你真的需要的话,你可以在最后做这样的一步,但它会花费 O(N lg(N))执行它的时间,这相当于在没有运行捷径优化的情况下单独运行整个算法所需的时间。

关于algorithm - 为什么加权联合查找算法的操作时间复杂度为 O(lgN)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56861606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com