图解B树的前世今生

原文发布于: http://blog.ztgreat.cn/article/63

背景

注:本文假设读者有搜索树(排序树)的基础知识。

我们知道计算的存储系统是一个分级结构(一般来讲,存储器速度越快,价格也越高,因而也越难满足大容量的要求)

分级存储体系

首先容量和类型不同的存储器在访问速度上的差异是极其悬殊的,就以我们最常见的磁盘以及内存这两级存储为例:
就传统的旋转式磁盘而言 它的访问速度大致是毫秒量级,而典型的内存呢 大致是在纳秒量级,如果 以一秒为基准,前者是10的-3次方 而后者呢是10的-9次方因此 二者的差异大致是在10的5至6次方,即使保守的估计 也是5个数量级,也就是说 如果将内存的一次访问比作是一秒
那么响应的一次外存操作则是一天(比喻,非精确计算),可谓天上方数日,人间已千年

因此对于分级的存储系统,对于最常用的数据尽可能放在最高层,更小的存储器中,实在找不到数据,才向更低层,更大的存储器索取。

批量读取

如果我们希望从磁盘之类的外存中去读取一个字节,其时间成本与读入一千个字节几乎是一样的,典型的存储系统的确大多是采用批量式的方式来支持读或者写操作的,具体来说 无论我们是需要从内存向外存输出数据,还是需要从外存向内存读入数据,涉及的数据都是以页面为单位进行核算和组织的,这也给了应用预读功能奠定了基础(局部性原理)。

批量读取

因此在涉及频繁而大量数据访问的算法中,我们就需要充分利用这样一个特性,也就是说我们要么就一次性的读写若干个KB 要么就一个字节也不访问,才能够达到尽可能的优化,那么我们的主角B树 在其间又能起到一个什么样的作用呢?

B树介绍

B树是为了磁盘或其他直接存取的辅助存储设备而设计的一种平衡的多路搜索树。B树类型于红黑树,但是它在降低磁盘I/O操作方面要表现得更好一些。这样一种多路的搜索树,与我们此前所熟知的二路搜索树在本质上讲 其实是等价的,如果我们将多路搜索树中的每一个节点称作超级节点的话那么每一个超级节点都可以认为是由若干个二路节点经过适当的合并以后得到的,来看这样一个实例

B树介绍

如果我们忽略掉这些方框,不难看出这其实就是一棵二叉搜索树的局部,现在我们两层两层的来考察其中的这些节点,具体来说 每一个节点以及它的左和右孩子,如果我们将每一组这样的父子三个节点合并成一个超级节点也可称为内部节点),那么整棵树就可以等价的变换为这样一种形式,具体的 原先的父节点居中,原先的孩子则经过提升与之并行的列于左右,这种节点的确可以称作是超级节点,因为其中不再只含有一个关键码 而是多个。

B树介绍

就这个例子而言 每个超级节点都含有3个关键码,同时相应的也就拥有4个分支,可以看到 如此每两代两代的合并之后,每个节点都将拥有3个关键码 以及4个分支。

一般的 如果每d代都进行一次合并,那么每个超级节点都将拥有2的d次方路分支,以及相应再减少1个关键码。

注意:在上面叶节点中,我们画了指向外部的箭头,我们称这些箭头指向的是外部节点(external nodes),所谓的external nodes,就是叶节点的那些数值为空 其实并不存在的孩子,因此 在B树中 叶节点的深度统一,其实也就等效的蕴含着外部节点的深度统一,也与通常的二叉搜索树不同,B树的高度实际上是相对于外部节点而不是叶节点而言。可以这样来理解外部节点,在存储系统中,外部节点可能指向的是下一级的容量更大速度更慢的系统(或者另一个存储系统中的B树),为了简化,后面我们将不再把外部节点画出来。

既然我们已经看到 这种多路的搜索树,与我们此前的二路搜索树 并没有本质的区别,那么为什么还要引入B树呢?

B树的意义

在我们通常都是按多个层次来分级组织的存储系统中,如果使用B树可以针对我们此前所说的外部操作,大大降低IO访问的次数 从而极大的提高计算效率,那么难道我们前面学习过的的AVL树在这方面还不够么,我们不妨具体估算 考察某个由10的9次方 1G个记录的数据集,如果将它们组织为一棵AVL树 高度大致为30层,也就是说 在最坏的情况下 单次查找需要深入30层,而每一层我们都需要执行一次IO操作,那么B树又能如何呢,我们刚刚看到 B树中的超级节点同时包含多个而不是单个关键码,因此在B树中每下降一层 都可以超级节点为单位,读入一组而不是单个关键码,从而将外存批量访问的特点 转化为实在的优点。

那么这些超级节点具体的应该设计为多大呢,这取决于磁盘等外存本身所设定的数据缓冲页面的大小,通常的情况下 都是若干个KB,如果每个关键码通常取做4个字节的话,那么很自然的就应该将每个超级节点的规模设置为200至300之间。

比如若将超级节点的规模 取做256 也就是2的8次方,那么同样存放1G个记录的B树 高度不会超

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值