说一下 b树

博客

B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。

(1)、每个节点存储多个元素
(2)、摒弃二叉树结构,采用多叉树

B树 (多路平衡二叉树)

  1. 所有节点中 孩子节点数 最大值 称为B树
  2. 一颗m阶B树,或为满足如下特性的m叉树
  3. 关键字就是一个节点中的多个关键字,子树是关键字左右分叉
  4. 非叶子的结构
1) 树中每个节点至多有m颗子树,(即至多含有m-1个关键字)
2) 若根节点不是终端节点,则至少有两颗子树
3) 除根节点外的所有非叶节点至少有[m/2]颗子树,(即[m/2]-1个关键字) 取上界
4) 非叶节点的结构
	P0 K1 P1 K2 P2 ... Kn Pn
	ki(i=1,2,...,n) 为结点的关键字, K1 < K2 < ... < Kn
	Pi(i=1,2,...,n) 为子树根结点的指针,Pi-1所指子树的关键字均小于Ki
									 Pi所指子树的关键字均大于Ki
  1. 所有的叶节点都出现在同一层次上,并不带任何信息

1)在B树中找节点 磁盘

2)在结点中找关键字 内存

插入

​ 1) 定位

​ 查找插入该关键字的位置,即最底层中的某个非叶子结点(规定一定是插入在最底层的某个非叶子结内)

​ 2) 插入

​ 若插入后,不破坏m阶B树的定义,即插入后的结点关键字个数

​ 在属于区间[[m/2] - 1,m - 1],则直接插入

​ 若插入后,关键字数量大于m-1,则对插入后的结点进行分裂操纵;

分裂

​ 插入后的结点中间位置([m / 2]) 关键字并入父结点中,中间结点在左侧结点留在原先的结点中,右侧结点放入新的结点中,若并入父结点后,父结点关键字数量超出范围,继续向上分裂,直到符合要求为止

删除 (终端节点)

1)直接删除

​ 若被删除关键字所在结点关键字个数 > [m/2] - 1个,表明删除后仍满足B树定义,直接删除

2)兄弟够借

​ 若被删除关键字所在关键字总数 = [m / 2] - 1 ,且 与此 结点临近的兄弟节点的关键字个数 >= [m / 2],则需要从兄弟节点借一个关键字,此过程需要调整该结点、双亲结点,和兄弟结点的关键字

3)兄弟不够借

​ 若被删除关键字所在结点关键字总数 = [m/2]-1,且与此结点邻近的兄弟结点的关键字个数 = [m/2]-1,则删除关键字,并与一个不够借的兄弟节点和双亲结点中两兄弟子树中间 的关键字合并。合并后若双亲结点因减少一个结点导致不符合定义,则继续执行2、3步骤

删除 (非终端节点)

1)若小于k的子树中关键字子树 > [m/2] - 1,则找出k的前驱值k’,并用k’来取代k,在递归地删除k’即可

2)若大于k的子树中关键字个数 > [m / 2] - 1,则找出k的后继值k’,并用k‘来取代k,再递归地删除k’即可。

3)若前后两子树关键字个数均为 [m / 2] - 1,则直接两个字结点合并,然后删除k即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值