BST树运行时间

时间:2014-05-10 07:28:40

标签: performance algorithm binary-search-tree

我有一个伪代码:

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)。 我的错在哪里?

提前感谢...

2 个答案:

答案 0 :(得分:2)

有两种可能性:

  • 不是这样,运行时间为O(nlogn)
  • 你知道SUCCESSOR的完全实现,它具有上限的对数复杂度(如上所述,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)