B-树,又称B树,是为磁盘以及数据库的数据组织而设计的一种平衡查找树;
B-树定义:
每一个结点含有如下内容或满足的规则:
(1)指针域:存放指向数据的指针,也可以与关键字存放在一起;
(2)key_number:当前存储在结点x中的关键字数;
(3)key[key_number]:key中存放key_number个关键字,键值非降序排列;
(4)is_leaf:如果当前节点是叶子结点,则is_leaf为true,否则为false,是个内结点;
(5)p[key_number+1]:每一个内结点含有key_number+1个指针,若为叶结点,无该域;
(6)每一个结点都具有相同的深度;
(7)定义最小度数为t,则每一个非根结点中至少含有t-1个关键字,即至少含有t个指针子女;至多含有2t-1个关键字,即至多含有2t个指针子女;
注1,t=2时,即每一个结点含有2个,3个,4个子女,即我们常说的2-3-4树;
注2,B树的高度范围证明,设总共有n个关键字,每一个结点至少含有t-1个关键字,那么,
nodes = 1+(t-1)(2+2t+2t^2+.......+2t^h)=2t^h-1;n>=nodes
得到h<=logt((n+1)/2);
B-树查找关键字:
(1)B-树的查找k是个递归的过程,首先查找当前节点x的关键字数组,直到k<=key[]的下标,若找不到则将i置为key_number+1,否则是i,看是否已经是找的值就返回,否则进行下一个递归查找;
(2)时间复杂度为O(tlogt(n)),空间复杂度为O(1);
B-树插入关键字:
(1)原则:当我们向下寻找某关键字插入的位置时,每次遇到一个满结点,我们就将其分裂,这种可单独写一个满节点分裂函数,将该层的关键字个数分为t-1和t-1两个部分,上层的关键字数会加1;因此分裂是树高增大的唯一途径;
(2)根据上述原则,我们向下寻找某关键字插入的位置的,我们都不会遇到满结点的情况,因此,关键字我们可以找到最底层叶子结点,直接插入,叶子结点为满时,先分裂;
(3)时间复杂度为O(tlogt(n)),空间复杂度为O(1);
B-树删除关键字:
(1)原则:所有删除原则都要基于或保证,我们遇到的结点的关键字数至少等于最小度数t;
(2)情况一:如果删除的关键字在 一个叶结点中,且关键字个数大于t-1,从x中直接删除即可;
(3)情况二(a):如果删除的关键字在 一个内结点x中,前于关键字k的y包含至少个t个关健字,则替换k为y的最后一个关健字k2,递归删除关健字k2;
(4)情况二(b):如果删除的关键字在 一个内结点x中,后于关键字k的z包含至少个t个关健字,则替换k为y的最前一个关健字k2,递归删除关健字k2;
(5)情况二(c):如果删除的关键字在 一个内结点x中,前于和后于关键字k的y,z都只有t-1个关健字,则结点y和结点z合并到结点y,并且删除结点z和关健字k;
(6)情况三(a):如果查找删除的关键字过程中,我们遇到一个内结点x只有t-1个关健字,那么我们要使它的关键字数至少等于最小度数t;内结点x相邻的左兄弟或右兄弟都只有t-1个关健字,这与该兄弟和父节点找一个关健字(父节点的关键字数减1但是仍满足B-树的条件)合并成一个新的结点;然后继续递归的删除关键字k;
(7)情况三(7):如果查找删除的关键字过程中,我们遇到一个内结点x只有t-1个关健字,内结点x相邻的左兄弟或右兄弟都至少有t个关健字,因此父节点可借走,x可向父结点借走;然后继续递归的删除关键字k;
(8)时间复杂度为O(tlogt(n)),空间复杂度为O(1);
B-树更新关键字:
(1)原则:先删除关键字,再更新关键字(2)时间复杂度为O(tlogt(n)),空间复杂度为O(1);