算法导论—B树

来源:互联网 发布:教育平台软件开发 编辑:程序博客网 时间:2024/06/07 23:14

华电北风吹
天津大学认知计算与应用重点实验室
最后修改日期:2015/11/2

B树是二叉搜索树的扩展。B树主要是用于操作存储在磁盘或其他直接存取的辅助存储设备上的大量数据。当数据太多的时候,内存不足以支持全部的数据,因此需要分批将磁盘中的数据载入内存。由于对磁盘的读写操作相比于内存来说要慢几个数量级,所以在对磁盘数据进行读写的时候要尽量减少磁盘的读写次数。B树类似于红黑树,但在降低磁盘I/O操作方面表现要更好一点,因此许多数据库系统使用B树或者B树的变种来存储信息。

一、B树的定义
一颗B树T是具有以下性质的有根树(根为T.root)
1、每个节点x有下面属性:
a. x.n,当前存储在节点x中的关键字的个数。
b. x.n 个关键字本身x.key1,x.key2,...,x.keyx.n
2、每个内部节点x包含x.n+1个指向其孩子的指针x.c1,x.c2,...,x.cx.n+1 。叶节点没有孩子,所以他们的ci 属性没有意义。
3、关键字x.keyi对存储在各子树中的关键字范围加以分割:如果ki 为任意一个存储在x.ci 为根的子树中的关键字,那么k1<=x.key1<=k2<=x.key2<=...<=x.keyx.n<=kx.n+1
4、每个叶节点具有相同的深度,即树的高度h
5、每个节点所包含的关键字个数有上界和下界。用一个被称为B树的最小度数的固定整数t>=2来表示这些界。
a. 除了根节点以外的其他每个节点必须至少有t1 个关键字。因此除了根节点外每个内部节点至少有t个孩子。如果树非空,根节点至少有一个关键字。
b. 每个结点至多包含2t-1个关键字。因此一个内部节点至多可有2t个孩子。当一个节点恰好有2t-1个关键字时,称该节点是满的。
当t=2时的B树是最简单的。每个内部节点包含2,3,4个孩子,即一颗2-3-4树。

二、B树的搜索
知道B树的结构以后,就很容易想通怎么查找元素了。

三、B树的插入
B树在插入的时候需要考虑怎么保持B树的所有性质,其中主要需要考虑的是每个节点关键字数目不会超过2t-1。因此每次插入的时候只插入叶子节点,如果叶子节点达到2t-1个关键字,就对叶子节点进行一次分裂。分别将当前叶子节点的前t-1和后t-1个关键字分裂为他们父节点的两个子节点,中间的第t个关键字提升到父节点相应位置。其他的内部节点同理。这样当分裂到根节点的时候B树的高度就加1了,这也是B树能够长高的唯一途径了。同时为了保证提升后避免对父节点判断,所以在由根向叶子节点向下寻找的过程中,遇到某个子节点是关键字个数是2t-1的时候就需要分裂(根节点也要此过程,同时树高增加1)。

四、B树的删除
B树删除的时候,为了保证删除的顺利,在由树根寻找删除关键字的过程中,保证此路每一个节点的关键字个数是t(区别于B树要求的t-1)。如果某个节点关键字个数是t-1,需要执行向兄弟节点借关键字的方法,如果兄弟节点关键字个数都是t-1,不可借的时候,需要找一个兄弟节点合并。

满足,这一路径上所有节点的关键字个数都大于等于t的时候,删除就变得特别容易了。如果要删除的关键字在内部节点,就看它的前驱节点或者后继节点可以借一个节点顶替吗,若可以,就相当于等价删除顶替节点,然后递归即可。若前驱后继都不可借,则合并前驱节点后继节点,当前删除节点下移合并后的节点,然后在递归从新执行删除操作。
若需要删除的节点是叶子节点,由于关键字个数大于等于t,可以直接删除即可。

1 0
原创粉丝点击