我试图想出以下数据结构的Big O运行时间。 他们是正确的吗?
将n个整数插入最初为空的AVL树(最佳情况) O(log n)
将n个整数插入最初为空的AVL树(最坏情况) O(log n)
将n个整数插入到不强制执行的初始空二进制搜索树中 结构属性(最好的情况) O(log n)
将n个整数插入到不强制执行的初始空二进制搜索树中 结构属性(最坏情况) 的 O(n)的
关于他们为什么不正确的解释也会有所帮助
答案 0 :(得分:3)
我在这里假设您需要插入所有元素的总时间:
(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个整数插入: