问题描述
我们知道,AVL树通常非常接近于平衡。假设我们将一棵AVL树放入一个数组中(非常类似于堆,其中父级是索引i,左子级是2i,右子级是2i + 1),您将获得多少个空索引O的复杂性?
因此,我知道高度为h的树中的最小节点数= Fibonacci(h + 2)-1。因此,空索引的数量= 2 ^ h-1-(Fibonacci(h + 2)-1) = 2 ^ h-斐波那契(h + 2)。但是我不知道下一步该怎么证明它的复杂性。我认为它是O(log(n)),但我不确定。
解决方法
如果h
是基于0的(按照通常的惯例),则高度为h
的AVL树中的最小节点数为F(h+3) - 1
。
让n = F(h+3) - 1
并尝试解决h
来找到具有n
个节点的AVL树的最大高度。
F(x)的闭合形式由Binet的公式给出(有关详细信息,请参见here)
F(x) = (phi^n - psi^n)/sqrt(5)
因此
n = (phi^(h+3) - psi^(h+3))/sqrt(5) - 1
>= (phi^(h+3) - 1)/sqrt(5) - 1 since |psi| < 1
求h
收益
h <= log_phi(sqrt(5)(n + 1) + 1) - 3
<= 1.4405 log2(n)
高度为h
的完整树具有2^(h+1) - 1
个节点。或就n
而言:
2^(h+1) - 1
<= 2^(1.4405 log2(n) + 1) - 1
= 2 * (2^log(n))^1.4405 - 1
= 2n^1.4405 - 1
因此,空节点的数量由
限定2n^1.4405 - 1 - n = O(n^1.4405)