不同数据结构的大O运行时间

时间:2011-08-12 13:50:27

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

我试图想出以下数据结构的Big O运行时间。 他们是正确的吗?

  • 将n个整数插入最初为空的AVL树(最佳情况) O(log n)

  • 将n个整数插入最初为空的AVL树(最坏情况) O(log n)

  • 将n个整数插入到不强制执行的初始空二进制搜索树中 结构属性(最好的情况) O(log n)

  • 将n个整数插入到不强制执行的初始空二进制搜索树中 结构属性(最坏情况) 的 O(n)的

关于他们为什么不正确的解释也会有所帮助

5 个答案:

答案 0 :(得分:3)

我在这里假设您需要插入所有元素的总时间:

(1)树的最佳情况,你永远不需要低于根,[即所有元素都等于根]所以它将是 O(n)。 [无论树的大小如何,都不需要加深一步以上]。每个元素O(1)。

(2) AVL树的最坏情况:将n个整数插入AVL树是O(nlogn)。每一步都是O(log(T)),其中T是那一刻的大小。 O(log1) + O (log2) + ... + O(logn) = O(log1 + log2 + ... + logn) = O(log(1*...*n)) = O(nlogn)。所以 O(nlogn)。每个元素O(logn)

(3) no structure enforce,best case ,仍然 O(n),(1)的原因相同。在最好的情况下,您添加的所有元素都是根,因此无论大小如何,您都不需要在树中下载。每个元素O(1)。

(4)没有结构强制执行,最坏情况:如在其他答案中所述,找到每个元素的位置是O(n),所以总的来说,你的时间复杂度最差的为O(n ^ 2)即可。每个元素O(n)。

答案 1 :(得分:2)

您的定义不正确:

  

将n个整数插入最初为空的AVL树(最佳情况)O(log n)

您无法在n次操作中访问(并复制)n个数据项,因为您应该阅读每个项目(因此,O(n)至少可以继续元件)。

所以,我的假设是你为单个元素提供了正确的O()(这有点不对,因为最好可以在特殊输入上实现;你的估计是平均情况,而不是最好的),所以,对于总描述的操作,我将每个与O(n)

相乘
  • 将n个整数插入最初为空的AVL树(最佳情况)O(n*log n)更新:这是平均值;特殊投入的最佳时间可以更短。

  • 将n个整数插入最初为空的AVL树(最坏情况)O(n*log n)

  • 将n个整数插入到最初为空的二进制搜索树中,该搜索树不强制执行结构属性(最佳情况)O(n*log n) UPDATE :这可能取决于实现和整数序列;所以最好的情况是O(n)(见评论)。

  • 将n个整数插入到最初为空的二进制搜索树中,该搜索树不强制执行结构属性(最坏情况)O(n*n)

答案 2 :(得分:1)

是的,你是正确的,如果你把所有东西都乘以n。您的运行时间是一个元素。

答案 3 :(得分:1)

如何插入n整数会导致O(logn)的大O.这没有任何意义。肯定阅读整数本身至少需要O(n)

因此,对于不平衡的BST示例,最糟糕的情况是您插入排序的数字列表,如1,2,3,4。插入1需要0次。插入2需要~1次。插入3需要~2次。等于1+2+3+...+n = O(n^2)

同样,在最佳情况下,每个后续插入都需要log(i)次。因此总运行时间为log(1)+log(2)+log(3)+...+log(n)。评估的内容并不是很明显。但是如果你知道一点微积分,你可以看到(几乎)梯形规则近似于log n从1到n的积分。这大约是nlogn - n = O(nlogn)

我相信你可以对AVL树做类似的分析。

答案 4 :(得分:1)

对不起,但他们都错了。

你使用的是单次插入的Big-Os。如果你做了n个,你必须花费那些时间n。

所以正确的数字是:

将n个整数插入:

  • AVL Tree(最坏情况): O(log(n)* n)
  • AVL Tree(最好的情况):这很难,但我想它也是 O(log(n)* n)
  • 不强制执行结构属性的二进制搜索树(最佳情况): O(n) - 1个项目的最佳案例插入时间实际上是 O(1)
  • 不强制执行结构属性的二叉查找树(最坏情况): O(n ^ 2) - 如果不强制执行结构属性,最终可能会出现完全不平衡的树,因此在最坏的情况下,n个元素的树的高度为n =>你的树将变成一个列表。