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