数据结构--B树

阶为M的B树是一颗具有下列特性的树

  • 数据存储在树叶上
  • 非叶节点存储直到M-1个关键字以指示搜索的方向;关键字i代表子树i+1中的最小的关键字
  • 树的根或者是一片树叶,或者其儿子数在2和M之间
  • 除根外,所有非树叶节点的儿子数在[M/2]和M之间
  • 所有的树叶都在相同的深度上并有[L/2]和L之间个数据项



L和M的确定


假设每个关键字使用32字节,每一个分支4字节,一个区能容纳8192字节,每个数据256字节

在一棵M阶B树中,M-1个关键字,总数为32(M-1)字节,再加上M个分支。这些分支共用4M个字节。一个非叶节点总的内存需求为36M-32字节。使得不超过8192字节的M的最大值是228.因此,我们选择M=225

由于每个数据记录是256字节,因此可以把32个记录装入一个区块中。于是,我们选择L=32



插入操作


通过关键字比较,在B树种层级搜索,最终确定将要插入的数据应储存在哪一树叶上。(动画)

这里分3种情况进行讨论

  • 树叶为满时。这一种情况最简单,当搜索到的树叶节点未满时,直接插入即可。
  • 树叶已满,父节点的儿子个数未满。由于我们现在有L+1项,因此把它们非常两片树叶,这两片树叶保证都有所需要的记录的最小个数。

    对于每次分裂,大致存在L/2次非分裂的插入

  • 树叶已满,父节点的儿子个数已满。和第二种情况差不多,但是多出一步就是分裂这个父节点。当一个非叶节点分裂时,它的父节点得到了一个儿子。如果父节点的儿子个数已经达到规定的限度怎么办呢?在这种情况下,继续沿树向上分裂节点直到找到一个不需要再分裂的父节点,或者到达树根。如果分裂树根,得到的两个根作为它的两个儿子。这就是我们为什么准许树根可以最少有两个儿子的特权的原因。



删除操作


我们可以通过查找要删除的项并在找到后删除它来执行删除操作。问题在于,如果被删除元所在的树叶的数据项已经是最小值,那么删除后它的项数就低于最小值了。

我们可以通过在邻节点本身没有达到最小值时领养一个邻项来矫正这种情况。如果相邻节点已经达到最小值,那么可以与该相邻节点联合以形成一片满叶。

可是,这意味着其父节点失去一个儿子。如果失去儿子的结果又引起父节点的儿子树低于最小值,那么我们使用相同的策略继续进行。这个过程可以一直上行到根。如果这个领养过程的结果使得根只剩下一个儿子,那么删除该根并让它的这个儿子作为树的新根。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值