【问题标题】:Why is the time complexity of performing n union find (union by size) operations O(n log n)?为什么执行 n 个联合查找(按大小联合)操作的时间复杂度为 O(n log n)?
【发布时间】:2018-11-05 06:00:13
【问题描述】:

在基于树的联合查找操作实现中,每个元素都存储在一个节点中,该节点包含一个指向集合名称的指针。集合指针指向 v 的节点 v 也是集合名称。每个集合都是一棵树,以具有自引用集合指针的节点为根。

要执行联合,我们只需让一棵树的根指向另一棵树的根。为了执行查找,我们从起始节点开始跟踪集合名称指针,直到到达集合名称指针指向自身的节点。

In Union by size -> 当执行并集时,我们生成更小的树的根 指向较大的根。这意味着 O(n log n) 时间 执行 n 个联合查找操作。每次我们跟随一个指针,我们都会去到一个大小最多是前一个子树两倍的子树。因此,对于任何查找,我们将遵循最多 O(log n) 个指针。

我不明白每个联合操作如何,查找操作总是 O(log n)。有人可以解释一下最坏情况的复杂性是如何计算的吗?

【问题讨论】:

    标签: algorithm time-complexity graph-theory graph-algorithm union-find


    【解决方案1】:

    我们暂时假设,每棵高度为 h 的树至少包含 2^h 个节点。如果你加入两棵这样的树会发生什么?

    如果它们的大小不同,则组合树的高度与较高的树的高度相同,因此新树仍有超过 2^h 个节点(高度相同但节点更多)。

    现在,如果它们的高度相同,则生成的树将其高度增加一,并且将包含至少 2^h + 2^h = 2^(h+1) 个节点。所以条件仍然成立。

    最基本的树(1个节点,高度0)也满足条件。因此,所有可以通过将两棵树连接在一起来构建的树也都实现了它。

    现在高度只是查找过程中要遵循的最大步数。如果一棵树有 n 个节点且高度为 h (n >= 2^h),这将立即给出 log2(n) >= h >= 步数。

    【讨论】:

      【解决方案2】:

      我们需要证明树的最大高度是 log(N) 其中 N 是 UF (1) 中的项目数

      在基本情况下,所有树的高度都是 0。(1) 当然满意

      现在假设所有的树都满足 (1) 我们需要证明用 i, j (i (2) 的新树:

      因为加入 2 棵树的过程获取较小树的根节点并将其附加到较大树的根节点,所以新树的高度将是:

      max(log(j), 1 + log(i)) = max(log(j), log(2i)) <= log(i + j) => (2) proved
      
      • log(j): 新树的高度仍然是大树的高度
      • 1 + log(i):当两棵树的高度相同时

      详情见下图:

      参考:书Algorithms

      【讨论】:

        【解决方案3】:

        您可以进行复杂度O(n lg* n)的n个联合查找(按等级或大小联合)操作,其中lg* n 是使用path compression optimizationinverse Ackermann function

        注意 O(n lg* n) 优于 O(n log n)

        在问题Why is the Ackermann function related to the amortized complexity of union-find algorithm used for disjoint sets? 中,您可以找到有关此关系的详细信息。

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 2022-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-19
          • 2021-11-11
          • 2015-06-12
          相关资源
          最近更新 更多