B-tree
B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引,综合效率较高。
B-tree形成过程
M(Max.Degree):每个节点最大保存的个数为M-1,这个m值最小是三,最大()
例子:M=4;节点保存个数为M-1=3
图一
其实你可以把这个m=4看成是一个条件,如果等于四,那么就把这个节点做为根节点,然后在下面分成两个或者多个子节点,如下
图二
因为M=4,再在图一中添加数据,图一数据的个数等于4,那么就会变成图二。
图一变图二的规则:1:首先给0001,0002,0003,0004排序
2:M/2的值等于2,根节点从左数第二个就是0002(除不尽没关系)
3:(M-1)/2的值=1,这就定义了子节点的最小存储个数为1,。0001成了左子节点,0003、0004就成为右子节点
图二从上往下看就是根节点的左节点就会小于根节点,右节点就会大于根节点(这个是tree的特性)
在把图二做个升级,把图二的右子节点添加一条数据0005,是怎么加的呢?
它会先和0002比较,大于0002,然后和右节点作比较,把数据放进去,如下图
图三
如果在往右子节点加一条数据0006会变成什么呢?(自己先想一下再往下看)
其实他会重复图一变图二的规则,0003、0004、0005、0006先做一个排序然后M/2的值放在根节点上,0003就会变成一个左子节点,0004变成根节点,0005、0006变成右子节点,如下图
图四
如果根节点的数据个数等于4会发生什么呢?
其实和图一转变为图二一样,转换后的图五
图五
没有改变之前是这样的图形 图六
图六
图六最右边的子节点增加0008,那么就会往根节点添加一条数据0006,此时根节点存储的数据就是0001、0002、0004、0006,那么就会被算法改变为图七的样子
图七
这就是B-tree形成的过程。不知道你们能不能看得懂,看之前最好先看一下二叉树的知识,这样会跟好理解。
B-tree删除过程
从两个角度讲
相对于根节点来说,遵循一个规则就是,每个节点的个数都必须等于或者大于(M-1)/2的值,所有的删除逻辑都是围绕这个规则展开的,例子
1:删除根节点:M=6;那么下面所有节点都必须等于2或者大于2
删除0002,首先它会把左节点内的最大值0003赋值到0004这个根节点上,然后查看左边节点的个数是否等于或者大于2,如果小于一那么就用右边节点内的最小值0005赋值到根节点0004上面,把0003重新赋值到以前节点上。如果等于或者大于2的话就直接把0003赋值到根节点上就可以了,不做其他操作。
最终效果图:
如果删除0003会变成什么样呢?
2:删除子节点:M=6;那么下面所有节点都必须等于2或者大于2
删除0001以后,首先判断这个这个节点数据个数,如果数据个数等于或者大于2,不做其他改动直接删除就可以了。如果小于2,就会把右节点的最小数据0005赋值到根节点上,根节点0003赋值到左节点上(如下图),让左节点个数等于或者大于2
最终结果:
不对的地方还望大神指教。这个不是一次就能弄懂的,多看几次就会懂的,