1. 最大高度对应 Node 数量 \(N_{h}\) 的递归公式

设有一棵 AVL tree 的高度为 \(h\), 对于该树, 构成该树的最少 node 数量为 \(N_{h}\) .

有: 最坏情况下, root 的两棵 subtree 高度为 \(h-1\) 和 \(h-2\) .

因此得到以下公式 (其中 \(h \in N^{+}\)):

\[N_{h}=
\begin{cases}
0 &h=0 \\
1 &h=1 \\
N_{h-1}+N_{h-2}+1 &h\geq2
\end{cases}
\]

2. 证明 \(N_{h}=Fibonacci_{(h+2)}-1\)

2.1. 方法 1 - 数学归纳法

已知:

\[\begin{aligned}
N_{h}&=\begin{cases}0 &h=0 \\ 1 &h=1 \\ N_{h-1}+N_{h-2}+1 &h \geq 2 \end{cases}\\
~\\
F_{h}&=F_{h-1}+F_{h-2}~~h\geq2
\end{aligned}
\]

且有:

\[N_{0}=F_{2}-1\\
N_{1}=F_{3}-1
\]

假设:

\[N_{k}=F_{k+2}-1,~N_{k+1}=F_{k+3}-1~~k \in N^{+}~且~k\geq3
\]

则:

\[\begin{aligned}
N_{k+2}&=N_{k}+N_{k+1}+1\\
&=F_{k+2}-1+F_{k+3}-1+1\\
&=F_{k+4}-1
\end{aligned}
\]

假设成立.

2.2. 方法 2 - 直接推导

当 \(h \geq 2\) 由:

\[\begin{aligned}
&N_{h} = N_{h-1}+N_{h-2}+1 \\
\Rightarrow & N_{h}+1=(N_{h-1}+1)+(N_{h-2}+1)
\end{aligned}
\]

并且当 \(h=1\) 或 \(h=2\) 时, \(N_{h}=Fibonacci_{(h+2)}-1\) 也成立.

综上:

\[N_{h}=Fibonacci_{(h+2)}-1
\]

3. \(N_{h}\) 的通项公式以及 h 的解和渐进记法

已知 Fibonacci sequence 的通项公式为:

\[F_{n}=\frac{1}{\sqrt{5}}\bigg[\bigg(\frac{1+\sqrt{5}}{2}\bigg)^n - \bigg(\frac{1-\sqrt{5}}{2}\bigg)^n\bigg]
\]

令 \(n=N_{h}\) , 根据 2.2 的证明, 得到:

\[n=\frac{1}{\sqrt{5}}\bigg[\bigg(\frac{1+\sqrt{5}}{2}\bigg)^{h+2} - \bigg(\frac{1-\sqrt{5}}{2}\bigg)^{h+2}\bigg]-1 \\~\\
\]
  • 当 \(h\) 为偶数,

    令 \(y=\big(\frac{1+\sqrt{5}}{2}\big)^{h+2}\) , 则 \(\big(\frac{1-\sqrt{5}}{2}\big)^{h+2}=y^{-1}\) , 代入上式得到:
    \[\begin{aligned}
    &y^2-\sqrt{5}(n+1)y-1=0 \\
    \Rightarrow~ &y=\frac{\sqrt{5}(n+1)+\sqrt{5(n+1)^2+4}}{2}
    \end{aligned}
    \]

    进而求出

    \[\begin{aligned}
    h&=-2+\log_{[(\sqrt{5}+1)/2]}{\frac{\sqrt{5}(n+1)+\sqrt{5(n+1)^2+4}}{2}} \\
    &=-2+\frac{\ln{\big[~\sqrt{5}(n+1)+\sqrt{5(n+1)^2+4}~\big]}-\ln{2}}{\ln{(\sqrt{5}+1)}-\ln{2}} \\
    &=O(\log{n})
    \end{aligned}
    \]
  • 当 \(h\) 为奇数,

    令 \(y=\big(\frac{1+\sqrt{5}}{2}\big)^{h+2}\) , 则 \(\big(\frac{1-\sqrt{5}}{2}\big)^{h+2}=-y^{-1}\) , 代入上式得到:
    \[y=\frac{\sqrt{5}(n+1)+\sqrt{5(n+1)^2-4}}{2}
    \]

    进而求出:

    \[ \begin{aligned}
    h&=-2+\frac{\ln{\big[~\sqrt{5}(n+1)+\sqrt{5(n+1)^2-4}~\big]}-\ln{2}}{\ln{(\sqrt{5}+1)}-\ln{2}} \\
    &=O(\log{n})
    \end{aligned}
    \]

4. C++求解

4.1. 直接公式法

在 3 中, 我们得出了以下公式 ( \(\pm\) 的确定取决于 \(h\) 的奇偶):

\[h=-2+\frac{\ln{\big[~\sqrt{5}(n+1)+\sqrt{5(n+1)^2 \pm 4}~\big]}-\ln{2}}{\ln{(\sqrt{5}+1)}-\ln{2}}
\]

为了简便运算, 我们可以将上式改为:

\[\begin{aligned}
h&=-2+\frac{\ln{\big[~\sqrt{5}(n+1)+\sqrt{5(n+1)^2 \pm 4}~\big]}}{\ln{(\sqrt{5}+1)}-\ln{2}}-\frac{\ln{2}}{\ln{(\sqrt{5}+1)}-\ln{2}} \\
&<-3.44042+\frac{\ln{\big[~\sqrt{5}(n+1)+\sqrt{5(n+1)^2 \pm 4}~\big]}}{0.48121}
\end{aligned}
\]

将上式写为程序, 函数名为 heightOfAVL_formula , 参数 numOfNode 传入 node 数量, 返回能够构成的 AVL tree 的最大高度:

#include <cmath>

constexpr double sqrt5 = 2.23606797749979;
constexpr double down512 = 0.4812118250596034;
constexpr double left2L2 = -3.440420090412556; inline size_t heightOfAVL_formula(size_t numOfNode)
{
numOfNode++;
size_t h = left2L2 + log(sqrt5 * (numOfNode + 1) + sqrt(5 * numOfNode * numOfNode - 4.0)) / down512;
if (h & 1) {
return h;
} else {
return left2L2 + log(sqrt5 * numOfNode + sqrt(5 * numOfNode * numOfNode + 4.0)) / down512;
}
}

理论上说, 当 node 数量极大, 公式法能够提供良好的性能.

尽管当 \(h\) 为偶数, 需要多进行一次计算,

但是对于任意 node 数量, 只需平均计算 1.5 次.

然而计算本身的效率较低, 同时运算中浮点数产生的误差可能难以估计 (事实上对 47000 个 node 已经给出了错误解).

4.2. 利用 Fibonacci sequence 间接求解

根据 2 中证明的 \(N_{h}=Fibonacci_{(h+2)}-1\) ,

函数 heightOfAVL_iteration 利用迭代更优雅地求解了 AVL tree 的高度.

inline size_t heightOfAVL_iteration(size_t numOfNode)
{
if (numOfNode == 0) return 0;
size_t arr[2] = { 2,3 };
size_t height = 4;
while (true) {
if (arr[0] - 1 <= numOfNode && arr[1] - 1 > numOfNode) { return height - 3; }
arr[0] = arr[1] + arr[0];
std::swap(arr[0], arr[1]);
height++;
}
}

上述方法效率更高, 而且无需担心运算中的精度损失.

5. 鸣谢

lrf8182


Reference | Data Structures, Algoritms, and Applications in C++, Sartaj Sahni

AVL tree 高度上下界推导的更多相关文章

  1. AVL树 高度平衡的二叉查找树

    1.What is AVL tree? AVL tree 是一种特殊的二叉查找树,,首先我们要在树中引入平衡因子balance,表示结点右子树的高度减去左子树的高度差(右-左),对于一棵AVL树要么它 ...

  2. 树的平衡 AVL Tree

    本篇随笔主要从以下三个方面介绍树的平衡: 1):BST不平衡问题 2):BST 旋转 3):AVL Tree 一:BST不平衡问题的解析 之前有提过普通BST的一些一些缺点,例如BST的高度是介于lg ...

  3. 04-树4. Root of AVL Tree (25)

    04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  4. 平衡二叉树(AVL Tree)

    在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简明易懂的介绍下二叉树的相关概念,然后着重讲下什么事平衡二叉树. (由于作图的时候忽略了箭头的问题,正常的树一般没有箭头,虽然不影响描述的过 ...

  5. PTA 04-树5 Root of AVL Tree (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/668 5-6 Root of AVL Tree   (25分) An AVL tree ...

  6. PAT-1066(Root of AVL Tree)Java语言实现

    Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...

  7. 转载:平衡二叉树(AVL Tree)

    平衡二叉树(AVL Tree) 转载至:https://www.cnblogs.com/jielongAI/p/9565776.html 在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简 ...

  8. AVL Tree (1) - Definition, find and Rotation

    1. 定义 (15-1) [AVL tree]: 一棵空二叉树是 AVL tree; 若 T 是一棵非空二叉树, 则 T 满足以下两个条件时, T 是一棵 AVL tree: T_LeftSubtre ...

  9. HDU 4940 Destroy Transportation system(无源汇有上下界最大流)

    看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...

随机推荐

  1. CF487E Tourists 题解

    题目链接 思路分析 看到这道题首先想到的此题的树上版本.(不就是树链剖分的板子题么?) 但是此题是图上的两点间的走法,自然要想到是圆方树. 我们先无脑构建出圆方树. 我们先猜测:设后加入的节点权值为 ...

  2. day10 Map_查找与遍历

    Map 查找表 Map体现的结构是一个多行两列的表格,其中左列称为key,右列称为value. Map总是成对保存数据,并且总是根据key获取对应的value.因此我们可以将查询的条件作为key查询对 ...

  3. 02 MySQL_数据库相关的SQL

    数据库相关的SQL 1. 查看所有数据库 show databases; 2. 创建数据库 格式:create database 数据库名称: 示例: create database db1; 3. ...

  4. day02 Java_变量

    参考: 变量的练习: 声明一个变量,一次声明多个变量. 声明变量直接初始化,先声明变量,而后再给变量初始化. 声明整型变量g,声明另一个整型变量h并赋值为h+10,输出变量h的值. 声明整型变量i,在 ...

  5. 啥也不是 -「OI 易犯错误整理」

    原帖出自 Nefelibata,不过他不想维护,所以就交给 STrAduts 了 awa.因为一些不可抗力,帖主转移至 XSC062.申请置顶! 前言 Nefelibata:因为笔者弱到无法形容,因此 ...

  6. jdbc 06: 实现登陆页面

    jdbc连接mysql,实现简单的登陆验证 package com.examples.jdbc.o6_实现登录界面; import java.sql.*; import java.util.HashM ...

  7. CF605A Sorting Railway Cars 题解

    To CF 这道题依题意可得最终答案为序列长度-最长子序列长度. 数据范围至 \(100000\) 用 \(O(n^2)\) 的复杂度肯定会炸. 用 \(O(nlogn)\) 的复杂度却在第 \(21 ...

  8. ZJOI2016 小星星 题解

    我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...

  9. SAM复杂度证明

    关于$SAM$的复杂度证明(大部分是对博客的我自己的理解和看法) 这部分是我的回忆,可省略 先回忆一下$SAM$ 我所理解的$SAM$,首先扒一张图 初始串$aabbabd$ 首先发现,下图里的$S- ...

  10. Kafka部署安装

    一.环境准备 1.jdk 8+ 2.zookeeper 3.kafka 说明:在kafka较新版本中已经集成了zookeeper,所以不用单独安装zookeeper,只需要在kafka文件目录中启动z ...