【问题标题】:Time complexity, binary (search) tree时间复杂度,二叉(搜索)树
【发布时间】:2012-10-23 23:40:39
【问题描述】:

假设我有一个完整的二叉树直到一定深度d。遍历(预遍历)这棵树的时间复杂度是多少。

我很困惑,因为我知道树中的节点数量是 2^d,所以时间复杂度是 BigO(2^d) ?因为这棵树呈指数增长。

但是,根据互联网研究,每个人都说遍历是 BigO(n) 其中 n 是元素的数量(在这种情况下是 2^d),而不是 BigO(2^d),我错过了什么?

谢谢

【问题讨论】:

  • n = 2^d。这里没有问题。
  • 如果 n = 2^d,那么我可以说 BigO(n) 或 BigO(2^d)。如果 n 是 2^d?
  • 习惯上用n。问题大小以 n 表示,复杂性也是如此。

标签: performance time-complexity asymptotic-complexity


【解决方案1】:

n 定义为节点数。

2^d 只是该深度的每个可能节点都已满时的节点数

即。

     o
   /   \
  o     o
 / \   
o   o

2^d 为 8 时只有 5 个节点

一个完整的二叉树除了最后一行之外的所有节点都被填充,并且所有节点都填充到左侧。你可以在维基百科上找到定义

http://en.wikipedia.org/wiki/Binary_tree#Types_of_binary_trees

【讨论】:

  • 我的问题是,如果它是一棵完整的树,即完全满
  • 这是正确的,但如果最后一行已满,则节点数为 2^d - 1。值得注意的是,由于 2^(d-1)
【解决方案2】:

即使您可以将时间复杂度表示为 O(2^d),这也没什么用,因为您无法将其与任何其他集合的时间复杂度进行比较。

另一方面,将时间复杂度表示为 O(n) 非常有用。它可以准确地告诉您当您增加项目数量时集合如何反应,而无需确切知道集合是如何实现的,并且您可以将其与其他集合的时间复杂度进行比较。

【讨论】:

  • 所以你的意思是,实际上我选择哪一个并不重要。但 bigO(n) 更直观。
  • 不太明白为什么 O(2^d) 是除非,这是因为界限太高了吗?
  • @dgamma3:这没什么用,因为您必须知道树是如何实现的,否则它不会告诉您当您向其中添加更多项目时集合的反应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多