2020-08-20

B树 B+树
数据库索引技术:B树和B+树
B树=B-树?
多路平衡查找树
M阶平衡查找树
规则:m阶是指最大节点数,最大关键字数<=m-1
 节点的子节点最多是m个,关键字数最多是m-1
1.所有关键字按照递增次序,左小右大
2.非叶节点的子节点 >1且<=m,并且M>=2(空树除外)
   m阶代表一个树的节点最多有多少查找路径
3.关键字数目。枝节点(非根和叶)的关键字数目 >=  ceil(m/2)-1,ceil是去上限
4.根节点最少两个子女,或者树只有一个节点
5.所有叶子在同一层。
根节点的子节点保证两个或者根节点就是叶子节点,是因为一开始只能二分比较
查询:就是和关键字比较,直接匹配到或者查找区间往下一层结点继续查找
比如查询x
先查根节点,二分比较
每层查找,查到=x的直接返回关键字和关键字指针(关键字指向的信息)
没有匹配的,就查找x所在的范围,比如某个节点有四个关键字 a b c d 
四个关键字,共有5个区间,表示5个子节点,因为关键字有序,可以判断x所在的区间
那么x再进入那个区间的子节点下一层去查找。
如果查找不到,那么就最后下到最后一层,返回null。
插入:
首先定义为m阶。
1.节点拆分。当关键字树>m-1就要拆分这个节点,并且把中间的元素提出来到父节点
  并且这个元素原来左边右边的元素各单独为一个节点。提到父节点的则插入到相应
  位置,保持有序。如果父节点又满了,继续往上提。如果提到根节点,
  就单独成为根节点了
2.排序。满足有序
先查询,到某个叶节点,与节点的关键字比较,如果关键字数没超,就插入到相应区间,
满足有序。如果关键字数超了,就提到父节点,继续重复前面,没超就插入到相应区间,
超了继续往上提。

删除:
1.节点合并:关键树要大于等于ceil(m/2),如果小于就要合并
2.满足排序
3.关键字数小于最小值,先从子节点取,没有符合的向父节点取,取中间值往父节点放
比较麻烦:
1.如果不是叶子节点,要将非叶节点转为叶节点,找到要删除节点的后继节点,就是比它大,并且最接近的,也就是关键字右子树的最小值。将它替代删除的节点,并删除原来位置的它。
这样就转换为了叶子节点
2.考虑叶子节点处理
2.1节点key大于等于最小值ceil(m/2)-1,删除成功,结束
2.2是从兄弟借,2.3是和父亲兄弟合并
2.2节点小于最小值,且兄弟个数大于最小值,那么父亲下来一个到自己,然后兄弟上去一个。结束
2.3节点小于最小值,且兄弟key个数小于等于最小值,将父节点key下移与两个子节点合并,就是父亲key+兄弟key+自己
如果父节点下来之后,父节点的key不够了,那父节点就要继续按照上面不足的操作,从兄弟借或者和它的父亲合并

B+更充分利用节点空间,查询速度更加稳定,其速度完全接近于二分法查找。
1.B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
2.B+的数据都保存在叶子结点,所以查询次数相同
3.叶节点有序,并且串联,左边结尾保存右边开始的指针
4.非叶子节点 = 关键字数

特点

1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。

优缺点比较:
1.B+方便扫库,因为叶子节点之间有序并且顺序相连。
   B要用中序遍历才能按序扫库
2.B+支持区间查询range-query,B树不支持,这是数据库选择用B+最主要原因
  比如查5~10,B+树直接查到5,就可以按序直接到10,串起来。
  b树可能就要一个一个查。
3.B树如果是成功查询就很有利,
   不成功也稍微有利,因为B树高度总体比B+矮
   B树不一定要查到叶子节点,查到成功就会返回结束查询。
   B+每次都要找到叶子节点才行,非叶子只是索引(最大or最小关键字)
   B无论成功与否都要走一条,根到叶节点的路径。
有些基于频率的查询选用B树,比如query

B树节点大小,B树要存数据吗??还是指向数据的指针还是??怎么比较的
B+树

https://zhuanlan.zhihu.com/p/27700617

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值