【问题标题】:Time complexity of next/previous functions on a BSTBST 上下一个/上一个函数的时间复杂度
【发布时间】:2012-05-19 12:12:30
【问题描述】:

我对通过二叉搜索树前进和后退的最坏情况效率感兴趣。

不平衡树:

   5
  /
 1 
  \
   2
    \
     3
      \
       4

看起来最坏的情况是 4->5,需要 4 次操作。

平衡树:

   2
  / \
 1   4
    / \ 
   3   5

最坏的情况是 2->3,需要 2 次操作。

我是否认为任何 BST 的最坏情况是 O(height-1),平衡树为 O(log n),不平衡树为 O(n-1)?

【问题讨论】:

  • O(height-1) = O(height)...
  • @OliCharlesworth 是的,我认为 O(n-1) 没有多大意义。干杯!
  • 另外,binary-treebinary-search-tree 标签应该是同义词吗?
  • 我猜“二叉搜索树”意味着排序,而“二叉树”仅仅意味着通用树结构。

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


【解决方案1】:

我是否认为任何 BST 的最坏情况是 O(height-1),平衡树为 O(log n),不平衡树为 O(n-1)?

是的,您只需要在从 kk+1 时上下移动,而不需要同时上下移动(因为不变量是 left child < parent < right child)。

虽然 O(height-1) 可以写成 O(height)(对于 O(n) 也是如此)。

【讨论】:

  • 为什么 O(height-1) = O(height)?
  • @KarlMorrison:因为这就是大 O 符号的工作方式。这是关于参数趋向无穷大时的行为,其中所有低阶项(在本例中为 1)都可以忽略不计。
【解决方案2】:

如果您正在考虑按顺序遍历树,则复杂性在平衡方面不会改变。算法还是

 walk( Node n)
    walk( n.left )
    visit( n )
    walk( n.right )

每步 1 个操作。

当您开始应用查找、插入和删除时,余额就会发挥作用。

为了使这些操作在 O(log N ) 中进行,需要一个平衡树。

如果你试图在树定义的序列中找到下一个元素,你可能需要遍历树的整个高度,当然在平衡树中这是 O ( log N ),并且在一棵不平衡的树,这是 O(N)

【讨论】:

  • 确实,每步 1 个操作。但是nn+1之间的步数并不总是1。
  • @Oli 是的,walk(Node n) 应该对 OP 有效,平衡不会改变遍历的复杂度。我可能误解了 OP。
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2015-08-01
相关资源
最近更新 更多