B-tree

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

        

最终结果:

         

不对的地方还望大神指教。这个不是一次就能弄懂的,多看几次就会懂的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值