当前课程知识点:数据结构(下) > 第八章 高级搜索树(上) > (b3)B-树:查找 > 08B3-5 最大高度
以下 我们分别从最大和最小两个方面
对B树树高的变化范围做以估算和界定
首先我们再次强调
对于B树而言其高度是由外部节点的深度决定的
如果从0开始自顶而下依次编号
那么树根节点所在的就应该是第0层
其孩子节点所在的应该是第1层
再往下 第2层 依次类推
直至叶节点所属的h-1层 以及外部节点所属的第h层
我们的第一个问题是 对于固定阶次的B树
如果其中包含的关键码数也固定为N
它的最大高度 可能达到多少呢
不难理解 在阶次与关键码数固定的前提下
会使整棵树的高度更大
每个内部节点中所包含的关键码数都应该反过来尽可能的少
形象的说 每个内部节点都需要尽可能的瘦
因此其中关键码的数目都应该尽可能的取做下限
而相应的分支数应该取做m/2的上整
如此我们来考察各层的节点数
首先顶层应该始终只包括树根这一个节点
其次作为根节点的特权 它在最瘦的时候
可能只包含一个关键码 同时只相应的拥有两个分支
而以下的各层呢 每个节点分支数都至少是m/2的上整
因此以下各层所含节点的数目
应该以m/2的上整为倍数成几何级数递增
具体来说 第k层所含的节点数
自然应该就是2乘以m/2的上整的k-1次方
这个规律适用于所有各层
直至我们需要考察的外部节点所在的第h层
自然的 这层所含的节点数就是2乘以m/2上整的h-1次方
你应该还记得 我们在介绍B树实例时曾经总结的一条规律
如果一棵B树中包含的真实关键码数为N的话
那么其对应的外部节点总数应该恰好就是N+1
具体到这里 也就是N+1应该等于nh
通过数学归纳 不难证明这一性质
我们也可以对这一结论做一个简单的理解
也就是说 树中所包含的N个关键码
如果理解作对应于N种成功查找的可能
那么外部节点也各自对应于一种失败的情况
既然有N种成功的可能 自然也就有N+1种失败的可能
总而言之 我们借助算两次的技巧
分别得出了nh的一个确界和下界
现在nh的历史使命已经完成 我们可以将其忽略掉
并转而考察由它的确界和下界所构成的不等式
略加整理之后 我们即可得到这样一个不等式
在大O意义下 也就是log以m为底N的对数
如果将m视作常数 也就是logN
与BST的性能 渐近同阶
然而正如我们所设计的
B树的意义并不在于降低搜索的渐近时间复杂度
而是更加关注于常系数意义下的优化
那么关于常系数的改进 这里的阶次m又扮演了一个什么角色呢
将B树的性能与常规BBST的性能做一对比
即可得到这样一个结果
比如按照常规的设置 将阶次m取做256
即可发现B树的高度 大致是所对应BBST高度的1/7
你应该还记得我们此前关于大学4年学制与30年学制的比喻
是的 这个结果背后的原因恰恰正在于此
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试