【原理思路】B-树原理

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值