【算法】b树的实现(1)

【前言】

这个内容是重点,因为它涉及到数据库的存储方式,查找效率等。

先埋坑,到时候有时间再填上去。

从B树、B+树、B*树谈到R 树

还有一篇文章,里面详细讲述了删除节点的几种情况:

B树的删除操作


【勘误】我推荐的第二篇文章针对需要合并操作的操作是错误
的,原因是作者没有考虑到当父节点不够数(譬如:5阶数,关键字最少2个),当关键字数量为2时候,下拨一个数参与子节点之间的合并会破坏父节点的性质,所以,当出现合并操作时候,必须回溯父节点进行检查,假如不符合性质,那么必须递归合并。最坏的情况是一直到根节点都是不符合性质的,调整过后树的高度减1。



【补充】大家假如看过我写的红黑树的代码或者研读过我推荐的两篇文章,想必对红黑树的删除操作有所认识。b树的删除也类似,真正删除的关键字必然是叶子层的关键字,其余关键字我们可以通过调换来调整性质,一直到叶子层,假如有合并出现的话,记住需要回溯检查调整父节点的性质。

假如各位对b树的信息不是很清楚的话,可以以上文章,只要用心去看一定能够明白的。

下面我个人谈一谈感想什么的,顺便放出一个展示b树的程序出来。

1、b树的阶m(最多包含的子树数量),必须大于或等于2,最小为 [ceil(m / 2)]

2、每个节点关键点最多为m-1,最少为 [ceil(m / 2)]-1

3、各种操作介绍:

A、搜索:从根节点开始遍历,假如该节点包含关键字,返回真,否则,通过比较关键字与搜索关键字的大小决定下一步需要遍历的节点或叶,假如到叶还是没有发现,那么返回假。

B、插入关键字:先搜索关键字,假如包含该关键字,则取消操作;否则,找到适合的叶子节点进行插入操作,假如插入关键字后该节点的关键字数量等于或大于m,那么就进行分裂,回溯,上一个父节点等,有点复杂,下面会单独用例子讲解。

C、删除关键字:先搜索到关键字,确定所在节点,接着–这个需要待续,因为用肉眼删除节点保持性质容易,但是用计算机来编写程序难,,总之,删除后必须保持树的形状,可以合并,也可以借用节点。后续看看是否有需要实现删除操作。

经过反反复复调试,尤其是对b树插入的各种情况的调整,核心算法终于得出正确答案了,现在先截图说明演示软件,然后下一篇将贴出算法的核心实现。

【默认情形】

这里设定5阶子树。

【插入关键字9】

《【算法】b树的实现(1)》

【插入关键字12】

《【算法】b树的实现(1)》

【插入关键字17】

《【算法】b树的实现(1)》

【插入关键字19】

《【算法】b树的实现(1)》

【插入关键字21】

《【算法】b树的实现(1)》

【插入关键字10】

《【算法】b树的实现(1)》

【插入关键字20】

《【算法】b树的实现(1)》

【插入关键字24】

《【算法】b树的实现(1)》

【插入关键字25】

《【算法】b树的实现(1)》

【插入关键字23】

《【算法】b树的实现(1)》

【删除关键字21】

《【算法】b树的实现(1)》

【删除关键字24】

《【算法】b树的实现(1)》

【删除关键字17】

《【算法】b树的实现(1)》

【删除关键字10】

《【算法】b树的实现(1)》

【删除关键字105】

《【算法】b树的实现(1)》

【删除关键字19】

《【算法】b树的实现(1)》

下面是这个试验软件的一个界面,里面可以自定义阶,也可以插入关键字,用了jgraphx开源库,看起来还ok。

软件下载地址:

下载b树演示工具(完善版)

    原文作者:B树
    原文地址: https://blog.csdn.net/cdnight/article/details/9904765
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞