【问题标题】:Is building a BST with N given elements is O(n lg n)?用 N 个给定元素构建 BST 是 O(n lg n) 吗?
【发布时间】:2017-01-07 10:38:21
【问题描述】:

用给定的任意 N 个元素构建二叉搜索树的最坏情况时间复杂度是多少?

我认为 N 个给定元素一个接一个出现的元素之间存在差异,从而产生总共 N 个元素的 BST

在前一种情况下,它是 O(n log n) ,在第二种情况下是 O(n^2) 。我说的对吗?

【问题讨论】:

  • 一个一个地取元素,然后一次性处理整个事情有什么不同?
  • 我认为,后一种情况可以构建一个 Skewed BST ,从而具有 O(n^2)
  • 一个接一个地接受数字在时间上是 O(n),在空间上是 O(n)。您现在可以对它们进行排序,并在 O(n*log n) 中构建一棵完美的树。如果您必须随时构建树(即输入没有额外的 O(n) 空间可用),那么在 O(n^2) 最坏的情况下,您最终可能会得到一个不平衡的树。
  • 是的,这对我来说更清楚。一切都与空间有关。如果我没有空间容纳整数,那么它会产生倾斜,否则,我可以将它们全部收集并存储以排序并获得平衡树,对吗?
  • 完全正确。

标签: algorithm binary-search-tree


【解决方案1】:

如果Binary Search Tree (BST) 不是完美平衡的,那么最坏情况的时间复杂度是O(n^2)。通常,BST 是通过重复插入构建的,因此最坏的情况是O(n^2)。但是如果可以对输入进行排序(在O(nlogn)中),则可以在O(n)中构建,导致整体复杂度为O(nlogn)

如果BST是self-balancing,那么即使我们重复插入,最坏情况的时间复杂度也是O(nlog n)

【讨论】:

  • (实际上,完美平衡(叶子的深度最多相差一个)不是先决条件。任何 深度限制是函数限制运行时间的因素之一。)
  • 如果您在构建树时重新平衡树(并且某些方法(例如 treaps)不需要节点中的额外数据),那么您可以在 O(n log n) 中一次构建一个节点时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多