一、介绍磁盘
B树其中一个应用就是在磁盘的存储结构中,先说一下磁盘的读写原理和效率。
磁盘上数据必须用一个三维地址唯一标示:柱面号、盘面号、块号(磁道上的盘块)。
读/写磁盘上某一指定数据需要下面3个步骤:
(1) 首先移动臂根据柱面号使磁头移动到所需要的柱面上,这一过程被称为定位或查找 。
(2) 根据盘面号来确定指定盘面上的磁道。
(3) 盘面确定以后,盘片开始旋转,将指定块号的磁道段移动至磁头下。
经过上面三个步骤,指定数据的存储位置就被找到。这时就可以开始读/写操作了。
访问某一具体信息,由3部分时间组成:
查找时间(seek time) Ts: 完成上述步骤(1)所需要的时间。这部分时间代价最高,最大可达到0.1s左右。
等待时间(latency time) Tl: 完成上述步骤(3)所需要的时间。由于盘片绕主轴旋转速度很快,一般为7200转/分(电脑硬盘的性能指标之一, 家用的普通硬盘的转速一般有5400rpm(笔记本)、7200rpm几种)。因此一般旋转一圈大约0.0083s。
传输时间(transmission time) Tt: 数据通过系统总线传送到内存的时间,一般传输一个字节(byte)大概0.02us=2*10^(-8)s
磁盘读取数据是以盘块(block)为基本单位的。位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/写信息时尽量减少磁头来回移动的次数,避免过多的查找时间Ts。
所以,在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入块(block)中某数据时,首先需要定位到磁盘中的某块,如何有效地查找磁盘中的数据,需要一种合理高效的外存数据结构,这种结构就是B树。
B树是为磁盘或其他直接存取辅助存储设备而设计的一种平衡多路查找树。许多数据库系统采用B树或B树的变形来存储信息。
二、B树定义。(左子树小于根节点小于右子树。)
一个m阶的B树(m叉树)具有如下性质:
内节点含有关键字树为n[x],则其含有的子女数为n[x]+1,。
1,
树中每个结点含有n个孩子,即n满足:
ceil(m
/2)
<=
n
<=m。关键字数界限则为:
ceil(m/2)-1到m-1个
。算法导论中下界称为最小度数t(t>=2)。即关键字数范围t-1到2t-1个。若含有2t-1个节点,则称为这个节点是满的。
(
其中ceil(x)是一个取上限的函数
)
2,
若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);
3,
所有叶子结点都出现在同一层,,每个叶子节点具有相同的深度。叶子节点不包含任何关键字信息。
4,
每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
a)Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。
b)Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。
c)除根结点之外的结点的关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1(
叶子结点也必须满足此条关于关键字数的性质,根结点除外
)。
5,B树的高度:h>=logt((n+1)/2)
三、B树的搜索,插入,删除。
1,搜索:和搜索二叉查找树相似。
根据节点的子女数做分支界定。判断要查找的值与当前值的大小,小则在左子树,大则在右子树,递归查找,直到找到相等的节点为止,并肩该节点和该值的下标返回。如果找到叶子节点依然没找到则返回null。
2,插入:原则是要满足B树的性质,所以插入的时候要注意关键字的个数在ceil(m/2)-1到m-1个之间。
如果插入的节点关键字树<m-1说明还没有满,则直接插入。如果插入的关键字数=m-1则说明满了,要进行分裂。取节点中关键字的中间值,以中间值为界一分为二,产生两个新的节点,将中间值作为关键字插入到父节点中(h-1层),由于插入到父节点时可能父节点也是满的,所以要重复上述操作直至根节点,建立一个新的根节点,整个B树增加一层。分裂是B树长高的唯一途径!
3,删除:删除操作也要注意满足B树的性质。关键字的个数在ceil(m/2)-1到m-1个之间。
先查找到要删除的值,看该值所在的节点是不是叶子节点,如果不是则有孩子节点,需要上移其孩子节点或者合并孩纸节点,再看情况;如果没有孩子节点则要看情况。
叶子节点删除后,如果该节点关键字数<ceil(m/2)-1则看兄弟节点中关键字数是否满足>ceil(m/2)-1,若是则借一个兄弟节点:先从父节点移除一个节点下来,再从兄弟节点移除一个节点给父节点,这样就满足了;如果兄弟节点不满足>ceil(m/2)-1,则合并:从父节点下移除一个节点,并与下相邻兄弟节点合并。
被删除的节点如果有孩子节点,看其中孩子节点的关键字树是否都是t-1个关键字,如果是,则将其下移和两个孩纸节点合并,并将其删除;如果不是,则将至少含有t个关键字的孩子节点移除一个元素到该内节点中。
四、补充B树变体结构B+树和B*树的介绍。
B+树与m阶B树的区别:
1,有n子树节点就有n个关键字
2,叶子节点包含了全部关键字信息,及只想这些记录的指针。
3,非终结点可堪称是索引部分。节点中仅仅只含有子树根节点中的最大或者最小关键字。
B+树相比较而言,读写磁盘代价更低,查询效率稳定。(由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。)
B*树与B+树类似,在B+树中的非根和非叶子节点增加指向其兄弟节点的指针,块的最低使用率为2/3满,即节点的最小读数为2/3*m满。
在网上发现了不错的学习资料,分享给大家:http://blog.csdn.net/v_JULY_v/article/details/6530142#comments