B树、B+树、B*树

B树

B树是一种平衡多路查找树,满足下列性质:

(1)每个结点的关键字降序排列;

(2)第i个孩子的所有关键字<= 父结点中第i个关键字<=第i+1个孩子的所有关键字;

(3)所有的叶子结点都在同一层;

(4)含有p个关键字的结点有p+1个孩子结点;

(5)最小度用t(>=2)来表示,最小度即关键字最少的内结点的孩子数目。根结点的关键字个数为[1,2t-1],非根结点的关键字个数为[t-1, 2t-1]。

B树的高度:设总共有n个关键字,最小度为t,深度为0时,结点数为1,深度为1时,结点数为2,深度为2时,结点数为2t,...深度为h时,结点数为2*t的h-1次方。所以我们有n >= 1+(t-1)(2+2t+...+2t h-1(t的h-1次方)) = 2t h - 1(t的h次方),h <= log以t为底,(n+1)/2的对数。

树的高度低了,I/O次数就会减少,所以在文件索引时会用到B树,以减少磁盘的访问次数。

B树的操作:(1)B树的查找,根据B树的性质2:第i个孩子的所有关键字<=父结点中第i个关键字<=第i+1个孩子的所有关键字。进行查找。

(2)B树的插入,根据结点关键字的限制条件,在插入关键字的过程中会遇到分裂结点,将待插入结点分裂为各含有t-1个关键字的结点,中间关键字提升到父亲结点中。自上而下进行搜索,分裂搜索过程中遇到的每个满结点。

自上而下,避免回溯。

(3)B树的删除,根据性质4含有p个关键字的结点有p+1个孩子结点,如果没有超出范围,直接在结点中删除关键字即可,如果违反性质,就自上而下进行搜索,将搜索到的每个关键字个数为t-1的结点变为至少t个关键字,自上而下,避免回溯。

B+树

一颗m(m是所有结点中的最大孩子数)阶的B+树满足:

(1)结点关键字个数为[m/2, m],根结点至少有两个关键字;

(2)结点的关键字个数与子树个数相同且非降序排序;

(3)叶结点在同一层并包含所有关键字且顺序链接;

(4)所有的非叶子结点可看成索引部分,结点中仅含有其子树中的最大关键字。

B+树操作:(1)B+树查找,从最底层最小关键字顺序查找,从根结点开始索引查找,要查到叶子结点。

(2)B+树插入,插入关键字只在叶子结点进行,未超出范围,直接插入,超出范围分裂,类似B树。

(3)B+树删除,删除关键字只在叶结点上进行,如果未破坏B+树性质,直接删除,修改父结点的值;如果破坏性质,兄弟可借,从兄弟结点借调,修改其父亲结点的关键字,如果兄弟不够借,与其兄弟合并,并调整键值。

B+树应用:

(1)B+树多应用于数据库中,由于B+树的遍历只需要将叶结点顺序遍历,而B树却需要中序遍历,显然,B+树更适合扫库。

(2)B+树中还有一个范围查询,比如查3~7之间的数据,B+树只需标记3和7的位置,顺序查一遍就可以,而B树就麻烦的多。

B*树

在B+树内部结点再增加指向兄弟结点的指针,B*树定义了结点关键字个数为[2m/3, m],空间利用率更高。

(1)B+树插入,只在叶结点上进行,超出范围,则看左右兄弟是否满了,未满,则将部分数据移动到兄弟结点中,修改父结点的值;兄弟满了,则各复制1/3关键字到新结点中,修改父结点的值。

总结

B树,叶子结点链接,推广到B+树,B+树兄弟结点链接,推广到B*树。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值