这本书说插入二叉搜索树的最差运行时间是n ^ 2
我真的不明白。
我的意思是如果你有1,2,3,4,5,6,7,8,9
这是最坏的情况,是不是最坏的情况下运行时间是O(n)?
(如果值< node.data,则向左移动,如果> node.data向右移动)
有人可以解释一下吗?我真的很感激!
我想我现在得到了答案!因为你需要回去查找新号码 从一开始就更大或更小。
但我现在还有另一个问题,那就是构建AVL树的最坏情况运行时间是什么?
这本书说二元搜索树的构建和排序是n(log n)
AVL树的最差深度是log n
它从未说过整个AVL树的插入时间是什么。
谁知道呢?答案 0 :(得分:3)
它不是O(n)
,因为在每次插入时,您需要遍历整个树以找到放置新节点的合适位置。
例如,首先在节点的头部放置1。然后,要放置2,您需要查看头部的1并决定将2添加到头部右侧。然后,当添加3时,你需要再次查看1,决定向右移动,然后查看2并将3放在2的右边节点上。
基本上,每个最坏情况插入都是O(k)
(其中k是树中已有的数字元素)。要构建树,您需要进行n次插入,因此整个操作需要进行1+2+3+4+5+6...+n
操作O(n^2/2)
- > O(n^2)
。
答案 1 :(得分:0)
首先,AVL树的深度:
设N(h)表示否。高度为h的AVL树中的节点数。
N(h)> = 1 + N(h-1)+ N(h-2),这来自AVL树的定义。
N(h)> = F(h)-1,其中F(h)是斐波纳契数
N(h)> = {(1 + sqrt(5)/ 2} ^ h,
因此h <= log(基数=(1 + sqrt(5))/ 2)n
所以h&lt; = c logn。基= 2;`
现在看看上面的输入我们要插入1,2,3,...,n。
现在轮换将在恒定的时间内进行
每插入两个元素后,就会发生一次旋转。所以没有旋转= n / 2
每次我们需要进行logm比较,其中logm是当前的高度
总操作= c(log 1+ log 2+ log 3+ log 4+ .... + log n-1)+ n / 2
等于c(log(n-1)!)+ n / 2
&lt; = c(nlogn)+ n / 2,这只是O(nlogn)。
PS:logn意味着2的基数。