B树原理及java实现

本代码为参考算法导论所写,主要记录B树数据结构的实现原理及方式。

本代码主要实现了B树的插入和删除的操作过程。详细注释了插入分裂,删除合并的逻辑规则。

本代码未讲过仔细的调试和详尽的测试,但可以作为学习和研究B树结构原理,实现方式的参考。

package tree;

/**
 * B树特征
 * 每个节点必须包含  t-1 -> 2t-1个key,t>=2。根节点可以只有1个key. t被称为最小度数
 * 每个节点需包含 t -> 2t个子节点指针。 这样保证了树至少为2叉的。
 * 每个节点的关键字以非降序排序
 * 每个叶节点具有相同的深度,所以是平衡的。树高为 h <= logt((n+1)/2), n为树的总关键字数,
 * 
 * B树操作
 * B树通过插入的分裂,删除的合并来保证树一直满足B树的特征。
 * 当插入时,由于子节已满,需要分裂成两个子节点,每个子节点含有t-1个关键字,并在父节点中插入原节点中间值
 * 在插入过程中,从根节点向下递归查找时就要确保根节点,及递归时的子节点为非满的,否则进行跟/子节点分裂。
 * 由于分裂操作,并不会影响每个节点的树高,只有在跟节点进行分裂的时候树高才加1,子节点高度依次增加,所以B树总是平衡的。
 * 
 * 在删除过程中,可以分为两种情况
 * 1. 删除的为叶子节点关键字。
 * 如果叶子节点关键字数量大于t-1,则直接删除即可。
 * 如果不足t-1则需要从父节点移动关键字下来,然后递归删除父节点关键字。
 * 
 * 2. 删除的为内部节点关键字。
 * 如果相邻两个子节点有一个具有大于t-1的关键字,则直接从该节点移动关键字上来填充即可。然后向下递归删除子节点关键字
 * 如果相邻两个子节点都只有t-1个关键字,则操作子节点进行合并。然后删除父节点关键字。如果由于删除父节点关键字导致关键字数量不足t-1,
 * 则需要继续从祖节点移动关键字下来,然后递归删除祖节点相应关键字。
 * 
 * 从删除操作看,删除操作可能在树中不断向下递归移动关键字到父节点,或者向上回溯移动关键字到子节点。但每步操作后都符合B树的特征,
 * 并在这个过程中使得相关子节点合并为2t-2个关键字的新节点。
 * 
 * 
 * B+树特征
 * B树的变种,在非叶子节点不能存储关键字的值,所有数据存储在叶子节点,因此最大化了内部节点的分支因子
 * 由于B树删除内部节点的复杂性,需要向下递归移动关键字,同时可能向上回溯进行合并
 * 所以B+树将所有关键字数据放在叶子节点能最大化删除操作的性能,直接找到某个叶子节点进行删除,然后回溯合并即可。
 * 
 * B树的用处
 * B树也是一个排序树,其较平衡二叉树有更多的分支,所以B树有更小的树高,看起来更扁平,从而减少了从根节点开始的查找次数
 * B树常用于对磁盘文件的索引。由于访问一次节点就需要进行一次磁盘I/O
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值