我有一个伪代码:
function func(BST t):
x = MIN(t)
for i=1..n do:
print x.key
x = SUCCESSOR(x)
现在,我需要证明它的运行时间是THETA(n)。 但是,我知道SUCCESSOR的运行时间是O(logn),因此运行时间是O(nlogn)。 我的错在哪里?
提前感谢...
答案 0 :(得分:2)
有两种可能性:
O(nlogn)
O(logn)
),但你可以推断,当它一个接一个地执行时它实际上退化了到theta(1)
。事实上,BST中SUCCESSOR的良好实施应该具有theta(1)
的复杂度,因为在整个func
执行期间,每个节点最多会被访问 答案 1 :(得分:0)
这取决于对BST的实施,但如果您的BST拥有“父”节点,并且正在使用它来查找后继者,则需要遍历每个边缘最多两次 - 一旦你“向下”,第一次进入节点,一次进入“向上”,然后从它返回。
由于树有n-1
个边缘,因此您可以读取 2*(n-1)
个数字边缘,这是 O(n)
。
请注意,SUCCESSOR()
函数的最坏情况确实是O(logn)
,但如果按照我描述的方式实现,则平均情况为O(1)
。