B树
1 定义
B树是一种平衡的多路查找树,其每一个非根节点都有多个元素和孩子,且所有叶子结点都在同一层次上。这种类型的树在文件系统中很有用。节点的最大孩子数目称为B树的阶,例如一个3阶的B树(也称2-3树)如图1:
一棵m阶的B树,或为空树,或为满足下列特性的m叉树:
- 树中每个节点至多有m棵子树
- 若根结点不是叶子节点,那么至少有两棵子树
- 除根之外的所有非终端节点至少有【m/2】(不小于m/2的最小整数)棵子树
- 所有叶子节点都在同一层次上
- 所有非终端节点中包含下列信息数据
2 查找、插入和删除过程
查找
B树的查找过程与二叉排序树类似,是一个顺时针查找节点和在节点的关键字中进行查找交叉进行的过程。如图1的3阶B树,要查找关键字9,首先和根结点8做比较,结果9>8,则继续与右孩子节点比较,结果9<12,则继续跟随左指针寻找,最终找到关键字9.
插入
B树的插入稍微比较复杂,由于B树节点中的关键字个数必须大于【m/2】-1,因此每次插入关键字是在最底层的节点中添加一个关键字,若该关键字个数不超过m-1,则插入完成,否则要产生节点的分裂
例如在图1中插入关键字3,则无须分裂,直接插入即可:
但如果在图1中插入关键字5,原本关键字5应该插入到6的左边,但节点数已达到最大数,无法直接插入,则需要将节点分裂:
如果要插入关键字16,同样需要分裂节点,且此时由于父节点节点数已达到最大,因此分裂过程向上传递至根结点:
当根结点的节点数也达到最大值时,分裂过程无法向上传递,此时将会使对应节点都产生分裂,并促使B树高度增加。
删除
B树节点的删除操作首先需要找到要删除关键字所在的节点,若删除关键字后,该节点关键字数目小于【m/2】-1,则需要合并节点
例如在图1中,可以直接删除关键字6:
若删除关键字1,则需要以父节点进行左旋:
在上述的基础上,再删除关键字4,此时不能直接左旋。需要将比7稍大的元素8下来,使其变为3节点形式,再用比9较大元素填补8的位置,进行左旋。而原本9的位置也需要一次左旋,从而寻找稍大于13的关键字,以此类推依次填补
如果当前树是一棵满树,则删除任何一个叶子节点,都会使树不满足定义时,就必须减少树的层数。
3 应用
如果内存和外存交换数据频繁,就会造成时间效率的瓶颈,在一个典型的B树中,如果数据量很大,无法一次性存入内存,则可以对B树的阶数进行调整,使其与硬盘存储的页面大小相匹配,高度为h,让B树的根节点持久地保留在内存中,那么在这棵树上寻找一个关键字至多需要读取磁盘h次。
B+树
1 定义
B+树是应文件系统所需而出的一种B树的变型树。一棵m阶的B+树与m阶的B树的差异在于:
- 有n棵子树的节点含有n个关键字
- 所有的叶子节点包含全部关键字的信息,及指向含这些关键字记录的指针,叶子节点本身依关键字的大小自小而大顺序链接
- 所有分支节点可以看成为索引,节点中仅含有其子树中的最大(最小)关键字
2 查找、插入和删除过程
在B+树上进行随机查找、插入和删除的过程基本上与B树类似。只是在查找时,若非终端结点的关键字等于给定值(仅提供索引,不能提供对实际记录的访问),并不终止,而是继续向下直到叶子节点。B+树的插入仅在叶子节点上进行,当节点中的关键字个数大于m时要分裂成两个节点,它们所含关键字的个数分别为【(m+1)/2】和【(m+1)/2】,并且它们的双亲节点应同时包含这两个节点的最大关键字。B+树的删除也仅在叶子节点进行,当叶子节点的最大关键字被删除时,其在非终端结点中的值可以作为一个“分界关键字”存在。若因删除使节点个数少于【m/2】时,其和兄弟节点的合并过程和B树类似。
3 应用
B+树特别适合带有范围的查找,其可以从根结点出发找到第一个符合范围的关键字,然后再在叶子节点中按顺序找到符合范围的所有记录