【问题标题】:Is the run time complexity still O(n) when building a BST? [duplicate]构建 BST 时运行时间复杂度是否仍为 O(n)? [复制]
【发布时间】:2021-10-14 04:22:22
【问题描述】:

构建由 ???? 组成的二叉搜索树 (BST) 所需的总时间的大 O(最坏情况)复杂度是多少?节点?

嗨,我知道最坏情况下的运行时间复杂度是 O(n),用于向树中添加单个节点。我想知道构建 BST 时运行时间复杂度是否仍然是 O(n)。

【问题讨论】:

  • the run time complexity for worst case is O(n) 请非常明确:什么运行时间复杂度,究竟是什么?
  • 二叉树的最坏情况总是 O(n),因为我们知道并非每个 bst 搜索树都是平衡的。
  • (请注意,Muhteva 明确说明了所声称的渐近运行时间限制应适用于的操作。您的问题中没有,above comment 中没有。

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


【解决方案1】:

可以证明,无论使用何种算法,BST 都不能在线性时间内构建。至少,该证明适用于通过比较对值进行排序的情况,并且排除了诸如“首先使用计数排序对数据进行排序”之类的技巧。我认为这比从“你必须调用insert n 次”的角度来争论更有用,这只是构造 BST 的一种方式,并没有说明假设的替代算法。

将“您必须调用insert n 次”-参数应用于不同的情况将表明,例如,二叉堆不能在线性时间内构建,并且后缀树不能在线性时间内构建。但是它们都可以在线性时间内构建,使用与“调用insert n 次”不同的算法。所以一般来说这是一个错误的论点,我们也不应该在这里使用它。

如果 BST 可以在线性时间内构建,那么排序也可以在线性时间内进行:

  1. 在线性时间内构建 BST,
  2. 然后也在线性时间内进行按顺序遍历,从而按排序顺序生成元素。

这一定是错误的,因为众所周知基于比较的排序具有需要至少 Ω(n log n) 比较的下限。做中序遍历是可能的,所以一定是这个算法的另一半是不可能的。因此,不可能在线性时间内构建 BST(至少,只要构建基于比较,就不可能)。

【讨论】:

  • It can be proven that a BST cannot be built in linear time regardless of the algorithm used 请不要指定输入是否已经订购。
  • @greybeard 不错的尝试,但我们都知道当输入被预先排序时这是可能的。
猜你喜欢
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多