当前课程知识点:数据结构(下) > 第七章 二叉搜索树 > (d1)AVL树:重平衡 > 07D1-3 适度平衡
可以证明AVL树
的确是适度平衡的
也就是说 一棵规模为n的AVL树
其高度在渐近意义下
是不超过logn的
实际上 为了证明规模固定的AVL树
其高度不会超过某个上限
我们可以等价地证明
在高度固定的情况下
一棵AVL树的节点
也不至于太少
具体来说
我们可以证明这样一个事实
对于高度固定为h的AVL树
其中所包含的点数
至少是与h呈fibonacci数关系
为此我们需要借助递推式
具体来说
我们可以证明这样一个递推式
也就是说
如果我们将高度为h的AVL树的
规模下限定义为S(h)的话
那么S(h)与S(h-1)
以及S(h-2)之间
满足这么样一个叠加的关系
为此我们来考察那棵高度为h
同时规模达到最小的AVL树
既然它的规模要达到最少
所以它的左子树和右子树的规模
也应该尽可能少
那么在AVL树的定义下
可变化的余地充其量不过
其中一棵子树
比另一棵子树高一层
不失一般性
假设左子树比右子树高出一层
因为它的高度为h-1
所以它的规模下限自然也就是S(h-1)
同理 作为高度为h-2的右子树
它的规模下限自然也就是S(h-2)
当然 还不要忘了这里的树根节点
这也就是为什么
我们还要再附加上一个单位1
这个递推式是我们所有分析的核心
而以下只不过是一些
简单的数学技巧而已
为此 我们不妨对它做一个等价变换
也就是在左右各加一个1
那么左侧这块添加了一个1
右侧这块也添加了一个1
以及此前原本已有的一个1
接下来 如果我们将S(h)+1
定义为一个新的函数T(h)
就会发现这个递推式的右侧
会变成T(h-1) 再加上T(h-2)
这种形式是fibonacci数
所特有的递推形式
所以我们可以断定
它应该是等于
fibonacci的某一项
那么具体的是从 h
前后位移多少项呢?
我们只需考察对应的边界情况即可
首先考察规模为1
高度为0的AVL树
此时的T(h)应该等于1加1 也就是2
我们知道这是fibonacci数的第三项
再来考察高度为1的AVL树
其规模最小也不至低于2
也就是左子树为一个节点
右子树为空的一棵AVL树
此时的T(h)应该等于2+1 也就是3
我们知道这是fibonacci数的第四项
由此可见 这里的T(h)
只不过是fibonacci数
向前位移了三位
我们知道fibonacci数
大致是呈Φ的指数形式增长
由此我们也得到了n
关于高度h的一个下界
因此反过来等价地 n的对数
也就构成了h的一个上界
而这一点正是BBST
所谓适度平衡的要求
这就意味着我们的AVL树
的确是适度平衡的
好了
至此我们也就完成了第一项使命
也就是给出AVL意义下的
适度平衡标准
那么接下来
在我们着手完成第二项使命
也就是给出具体的重平衡算法之前
也许我们应该首先
以C++语言的形式
明确给出AVL树各种操作接口的规范
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试