当前课程知识点:数据结构(下) > 第七章 二叉搜索树 > (c)平衡与等价 > 07C-2 平均高度
以下我们就从两种最常见的统计口径出发
针对BST的平均高度 分别给出估算的结果
首先是所谓的随机生成统计口径
也就是说 对于任何一组关键码词条
我们考察它所有可能的排列
对于其中的任何一个排列
我们都假设按照这样的排列次序
将关键码依次插入一棵初始为空的树
比如当关键码总数为3时
依次插入1 2 3 将会得到这样一棵BST
相应地 如果插入的次序是3 2 1
那么得到的将是这样一棵树
接下来 对于其它的排列
比如说1 3 2 将得到这样一棵BST
以及其它的排列都会各自得到一棵BST
这样一种创建BST的方式称作随机生成
不难发现 当关键码总数为n时
可能的生成序列
也就是这n个关键码的全排列
总共有n!种
那么可以证明 如此所得到的
n!棵BST平均高度为logn
我们考察的第二种统计口径
是所谓的随机组成
也就是说 我们将所有的n个关键码
视作n个互异的积木
然后在符合BST顺序性要求的前提下
考察它们总共能够拼接出
多少棵拓扑结构互异的BST
可以证明 如此所得BST的总数
恰好为我们已经熟知的卡特兰数
而按照这一统计口径
所有BST的平均高度值为根号n
是的 你没有听错和看错 的确是根号n
你现在可能会置疑
按照我们刚才所说的随机生成的统计口径
累计生成的BST应该是n的阶乘种
而且对应估算出的平均树高应该是logn
那么根据这两种统计口径
各自所得到的结论哪一个更为可信呢?
我们说后者更为可信
其原因在于前者实际上是有所重复的
这种重复性就体现在
不同的关键码序列
有可能会生成同一棵BST
比如对于n为3的情况而言
这样两个输入序列所生成的
都是这样同一棵BST
也就是说 只要第一个插入的是居中的2
那么分列于它左右的1和3
究竟是按什么次序输入是没有关系的
实际上 不难理解
这个结论可以进一步地推广
也就是说中位数
或者接近于中位数的关键码
越是被更早地插入
整体而言 这棵BST的高度
也相应地会更低
这就意味着在前一种统计口径中
这类高度更低的BST
将会被以更高的重复度参与统计
以及最终的平均估算
这也是为什么按照前一统计口径
所得到的估算值会相对更小
从这一观点来看
前一统计口径可以说是过于乐观了
而后一统计口径所得到的结论将更为可信
但对于在此非常在意树高的我们来说
这并不是一个好消息
这意味着在天然的随机意义下
这样一个高度是不能够令我们满意的
为了进一步地降低和控制这个高度值
我们应该做点什么
而且我们很快就会看到
为此我们将不得不发现
并且利用一系列的技巧
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试