树木中的大O(h)与大O(logn)

时间:2012-09-04 06:47:50

标签: algorithm data-structures time-complexity

我对树木作业中的时间复杂有疑问。
据说(数据结构,Horowitz等人)在BST中插入,删除,搜索,查找mins-maxs,后继和前任节点的时间复杂度为O(h),而AVL的时间复杂度为{{1} }}。 我不太明白区别是什么。考虑到O(logn),为什么我们会说h=[logn]+1和其他地方O(h)

2 个答案:

答案 0 :(得分:10)

h是树的高度。它总是Omega(logn) [不是渐近地小于logn]。它可以非常接近完整树中的logn(然后你真的得到h=logn+1,但是在一个腐烂到一个链的树中(每个节点只有一个子),它是O(n)

对于平衡树,h=O(logn)(事实上它是Theta(logn)),因此对这些树的任何O(h)算法实际上都是O(logn)

自我平衡搜索树(和AVL就是其中之一)的想法是防止树衰变到链(或靠近它的某个地方)的情况,其(平衡树)特征确保我们{{ 1}}身高。

修改
要理解这个问题,最好考虑接下来的两棵树(原谅我是一个可怕的ascii艺术家):

O(logn)

两者都是有效的二进制搜索树,并且在搜索元素(例如 tree 1 tree 2 7 / 6 / 5 4 / / \ 4 2 6 / / \ / \ 3 1 3 5 7 / 2 / 1 )时都将是1。但在第一个中,O(h)实际上是O(h),而在第二个中O(n)

答案 1 :(得分:2)

O(h)表示复杂性线性依赖于树高。如果树是平衡的,则渐近变为O(logn)(n - 元素数)。但并非所有树木都是如此。想象一下非常不平衡的二叉树,其中每个节点只剩下子节点,这个树变得类似于列表,并且该树中的元素数量等于树的高度。所描述操作的复杂性将为O(n)而不是O(logn)