【问题标题】:What is the time complexity of constructing a binary search tree?构建二叉搜索树的时间复杂度是多少?
【发布时间】:2020-03-25 20:09:14
【问题描述】:

“对 n 个元素进行排序的每个基于比较的算法在最坏的情况下都必须进行 Ω(nlogn) 次比较。有了这个事实,构造一个 n 节点二叉搜索树的复杂度是多少?为什么?”

基于这个问题,我认为构造复杂度必须至少为 O(nlogn)。也就是说,我似乎无法弄清楚如何找到构造的总复杂性。

【问题讨论】:

  • 我认为这个问题更适合cstheory.stackexchange.com
  • 当然,这取决于您是否正在努力保持树的平衡(例如,AVL、RedBlack、Splay、随机二叉搜索树)。 O(n log(n)) 是 AVL 和 RedBlack 的最坏情况,随机 BST 的平均情况和 Splay 的摊销情况。如果排序是您的目标,那么堆优先于 BST,它给出 O(n log(n))。
  • @Daniele 如果树是平衡的(例如,键是按顺序插入的),那么每次插入都是 O(n),结果是 O(n^2)总计。
  • @EduardoPascualAseff 可能是 cs.stackexchange.com 而不是 cstheory.stackexchange.com。

标签: data-structures time-complexity big-o binary-search-tree complexity-theory


【解决方案1】:

问题的标题和您引用的文字提出了不同的问题。我将解释引用的内容,因为仅通过查看算法就可以找到 BST 构造的成本。

假设有可能在一秒钟内构造一个比 Ω(nlogn) 更好的 BST。使用二叉搜索树,您可以在 Θ(n) 时间内读出排序列表。这意味着我可以创建如下排序算法。

Algorithm sort(L) 
  B <- buildBST(L)
  Sorted <- inOrderTraversal(B)
  return Sorted

使用此算法,我将能够以比 Ω(nlogn) 更好的方式对列表进行排序。但正如你所说,这是不可能的,因为 Ω(nlogn) 是一个下限。因此不可能在 Ω(nlogn) 时间内创建一个二叉搜索树。

此外,由于算法退出以在 O(nlogn) 时间内创建 BST,您实际上可以说该算法在基于比较的模型下是最优的

【讨论】:

    【解决方案2】:

    BST 的构造将是O(n(log(n)))
    您将需要插入每个节点,这是一个 O(n) 操作。
    要插入 n 节点,您至少需要进行 O(log(n)) 比较。
    因此,最小值将是 O(n(log(n)))
    只有在数组已经排序的最佳情况下,时间复杂度才会是O(n)

    【讨论】:

    • 实际上,要插入每个节点,您需要最多 O(log(n)) 个比较。排序数组不会为您提供 O(n) BST 创建。仍然有很多情况需要 O(log n) 比较才能找到正确的插入点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多