AVL tree 高度上下界推导
1. 最大高度对应 Node 数量 \(N_{h}\) 的递归公式
设有一棵 AVL tree 的高度为 \(h\), 对于该树, 构成该树的最少 node 数量为 \(N_{h}\) .
有: 最坏情况下, root 的两棵 subtree 高度为 \(h-1\) 和 \(h-2\) .
因此得到以下公式 (其中 \(h \in N^{+}\)):
\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 - 数学归纳法
已知:
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_{1}=F_{3}-1
\]
假设:
\]
则:
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\) 由:
&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\) 也成立.
综上:
\]
3. \(N_{h}\) 的通项公式以及 h 的解和渐进记法
已知 Fibonacci sequence 的通项公式为:
\]
令 \(n=N_{h}\) , 根据 2.2 的证明, 得到:
\]
- 当 \(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{(\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 高度上下界推导的更多相关文章
- AVL树 高度平衡的二叉查找树
1.What is AVL tree? AVL tree 是一种特殊的二叉查找树,,首先我们要在树中引入平衡因子balance,表示结点右子树的高度减去左子树的高度差(右-左),对于一棵AVL树要么它 ...
- 树的平衡 AVL Tree
本篇随笔主要从以下三个方面介绍树的平衡: 1):BST不平衡问题 2):BST 旋转 3):AVL Tree 一:BST不平衡问题的解析 之前有提过普通BST的一些一些缺点,例如BST的高度是介于lg ...
- 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 ...
- 平衡二叉树(AVL Tree)
在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简明易懂的介绍下二叉树的相关概念,然后着重讲下什么事平衡二叉树. (由于作图的时候忽略了箭头的问题,正常的树一般没有箭头,虽然不影响描述的过 ...
- 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 ...
- PAT-1066(Root of AVL Tree)Java语言实现
Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...
- 转载:平衡二叉树(AVL Tree)
平衡二叉树(AVL Tree) 转载至:https://www.cnblogs.com/jielongAI/p/9565776.html 在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简 ...
- AVL Tree (1) - Definition, find and Rotation
1. 定义 (15-1) [AVL tree]: 一棵空二叉树是 AVL tree; 若 T 是一棵非空二叉树, 则 T 满足以下两个条件时, T 是一棵 AVL tree: T_LeftSubtre ...
- HDU 4940 Destroy Transportation system(无源汇有上下界最大流)
看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...
随机推荐
- 从svn下载项目后出现 Error:java: Compilation failed: internaljava compiler error 解决办法
原因:出现这个问题的话,主要是因为导入的项目JDK版本与自己的不匹配. 解决方法如下: 最后,酱紫
- CMU15445 (Fall 2019) 之 Project#3 - Query Execution 详解
前言 经过前面两个实验的铺垫,终于到了给数据库系统添加执行查询计划功能的时候了.给定一条 SQL 语句,我们可以将其中的操作符组织为一棵树,树中的每一个父节点都能从子节点获取 tuple 并处理成操作 ...
- .net webapi 实现 接口版本控制并打通swagger支持
我们在开发 webapi 项目时如果遇到 api 接口需要同时支持多个版本的时候,比如接口修改了入参之后但是又希望支持老版本的前端(这里的前端可能是网页,可能是app,小程序 等等)进行调用,这种情况 ...
- day06 Java_数组_方法_参数
精华笔记: 数组: 复制: System.arraycopy(a,1,b,0,4); int[ ] b = Arrays.copyOf(a,6); 排序: Arrays.sort(arr); //升序 ...
- Scala 练习题 学生分数案例
一.相关信息题目:1.统计班级人数2.统计学生的总分3.统计总分年级排名前十学生各科的分数4.统计总分大于年级平均分的学生5.统计每科都及格的学生6.统计偏科最严重的前100名学生数据样例(部分数据) ...
- SpringBoot集成文件 - 集成POI之Excel导入导出
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...
- 【ASP.NET Core】选项模式的相关接口
在 .NET 中,配置与选项模式其实有联系的(这些功能现在不仅限于 ASP.NET Core,而是作为平台扩展来提供,在其他.NET 项目中都能用).配置一般从多个来源(上一篇水文中的例子,记得否?) ...
- C#异步延迟Task.Delay
一. 1.Task.Delay实质是创建一个任务,再任务中开启一个定时间,然后延时指定的时间2.Task.Delay不和await一起使用情况,当代码遇到Task.Delay一句时,创建了了一个新的任 ...
- 基于gitlab 15.1 pages 搭建内部博客一定行版本
背景 基于 gitlab 15.1版 pages 搭建内部博客,参考官方文档,遇到一个又一个坑.之前看到别人吐槽说 gitlab 官方文档很差,我算是理解了.下面一个个说. 开始 按照官方文档的说法, ...
- 2022-7-16 第五组 pan小堂 基础语法
思维导图 一维数组 数组是存储多个变量(元素)的东西(容器) 这多个变量的数据类型要一致 数组既可以存储基本数据类型,也可以存储引用数据类型. 1.数组定义的格式: 格式1:数据类型[] 数组名; 格 ...