【问题标题】:In Big-O notation for tree structures: Why do some sources refer to O(logN) and some to O(h)?在树结构的 Big-O 表示法中:为什么有些来源引用 O(logN) 而有些引用 O(h)?
【发布时间】:2012-02-03 20:09:15
【问题描述】:

在研究任何遍历二叉搜索树的算法的复杂性时,我看到了两种不同的方式来表达同一件事:

版本#1:最坏情况下的遍历算法比较树的每个高度一次;因此复杂度为O(h)

版本#2:最坏情况下的遍历算法比较树的每个高度一次;因此复杂度为O(logN)

在我看来,同样的逻辑在起作用,但不同的作者使用logNh。有人可以向我解释为什么会这样吗?

【问题讨论】:

    标签: algorithm data-structures tree big-o binary-search-tree


    【解决方案1】:

    最坏情况下搜索时间的正确值是树 O(h),其中 h 是树的高度。如果您使用的是平衡搜索树(树的高度为 O(log n)),那么查找时间是最坏情况 O(log n)。也就是说,并非所有的树都是平衡的。例如,这是一棵高度为 n - 1 的树:

    1
     \
      2
       \
        3
         \
         ...
           \
            n
    

    这里,h = O(n),所以查找是 O(n)。说查找时间也是 O(h) 是正确的,但是在这种情况下 h ≠ O(log n) 并且声称查找时间是 O(log n) 是错误的。

    简而言之,O(h) 是正确的界限。当高度最多为 O(log n) 时,平衡搜索树中的正确边界是 O(log n),但并非所有树都有 O(log n) 的查找时间,因为它们可能不平衡。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      如果您的二叉树是平衡的,使得每个节点恰好有两个子节点,那么树中的节点数将恰好是 N = 2h - 1,所以高度是元素数量的对数(对于任何完整的 n-ary 树也是如此)。

      但是,任意的、不受约束的树可能看起来完全不同;例如,它可能在每一层只有一个节点,所以 N = h 在这种情况下。因此,高度是更通用的度量,因为它与实际比较有关,但在额外的平衡假设下,您可以将高度表示为元素数量的对数。

      【讨论】:

      • 一个重要但挑剔的点 - 并非所有平衡树的每个节点都有两个孩子,并且每个内部节点都有两个孩子并不能保证平衡。许多平衡树(AVL 树、红/黑树、AA 树、RAVL 树等)不遵守此条件,但仍有 O(log n) 查找,其中 log 不是 base-2。
      • @templatetypedef:那是因为它们不是“平衡的,所以每个节点都有两个子节点”。 AVL 树的大小是最大平衡的,不变性是没有节点的子树的高度相差超过一。对于红黑树,IIRC 的约束是没有节点的子树的高度变化超过 2 倍——它们比 AVL 树“不那么平衡”,但仍然“平衡”到足以让 h 成为 @ 987654322@。 O(log n) 中的 log 仍然可以是基数 2 或任何其他基数,因为基数的选择只会产生常数因子差异。
      • 为了简单起见,我还省略了树的最后一行当然不必是满的,你说得对,中间行也不必有确定的大小,相反,它们的元素数量应该上下限。最终重要的是h = O(log N)(并且任意数量都包含在常量中)。
      【解决方案3】:

      O(h) 表示已排序但不平衡的二叉树

      O(logn) 指的是经过排序和平衡的树

      【讨论】:

        【解决方案4】:

        这是同一件事的两种说法,因为高度为“h”的平均平衡二叉树将有大约 2^h 个节点。

        根据上下文,height 或 #nodes 可能更相关,这就是您将看到的引用。

        【讨论】:

          【解决方案5】:

          因为平衡树的 (h)8 个随着 (N) 个元素的对数而变化

          【讨论】:

          • 并非总是如此;不平衡的树可以有 h = Theta(n)。
          • 我有点假设他指的是平衡案例并且问题出现是因为他看到了同一案例的不同符号。 logN 显然是平衡的情况。无论如何,为了清楚起见进行了编辑。
          • 实际上在重新阅读问题时,都提到了“最坏情况”,但在最坏的情况下 h = N ,因此他引用的两个陈述之一可能是错误的。如果 h == N 语句导致 h == log(h) 这是不可能的
          猜你喜欢
          • 2012-08-28
          • 2012-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-21
          • 2011-10-22
          • 1970-01-01
          相关资源
          最近更新 更多