B+树

http://data.biancheng.net/view/61.html

https://blog.csdn.net/qq_26222859/article/details/80631121

B+树:   数据结构

B-书的每个节点关键字个数n的取值范围是[m/2]上-1<=n<=m-1,而B+树中的每个节点关键字个数n的取值范围为【m/2]上整<=n<=m

B+树:所有的叶子节点中包含了全部的关键字信息,以及指向这些关键字记录的指针,且叶子结点本身的关键字自小而大顺序连接。

所有的非终端节点(非叶子节点)可以看成是索引部分,节点中只含有其子树中的最大或最小关键字。

 

(二)操作:查找、插入和删除

(1)B+树的查找

在B+书中有两种查找:(1)单个元素的查找(从根节点到叶子节点的一条查找路径)二分查找

                                     (2)范围查找(可以通过链表头指针进行顺序查找)

 

(2)B+树的插入

在B+书中插入关键字

1、插入的操作全部都在叶子节点进行,且不能破坏关键字从小到大的顺序。

2、由于B+树中各节点存储的关键字个数有明确范围,插入时如果超过节点个数范围,要进行节点的分裂。

    若被插入关键字所在的节点,其含有的关键字个数小于阶数m,则直接插入。

若被插入关键字所在的节点关键字数目等于阶数m,则需要将节点分裂为两个节点,一个节点【m/2]下整,另一个节点包含【m/2]上取整,同时将新产生节点的最大或最小值放到双亲节点中去。如果双亲节点超过阶数,进一步分裂双亲节点。

特殊的,如果插入的节点是最大值,则要更改双亲结点的索引值,然后再进行分裂操作。

 

B+树中的根节点含有全部节点的最大节点。

 

(3)B+树的删除

     找到存储该关键字的节点,由于该节点所含有关键字的个数大于【m/2】上取整,删除不会破坏B+树结构,可以直接删除。

删除最大或者最小的元素,则需要更改双亲节点到根节点的所有节点的索引值。

当删除元素时,导致该节点关键字个数小于【m/2]上取整,若其兄弟节点中好有多余的节点,则可以从兄弟节点借关键字完成删除。需要更改最大值然后更改双亲结点。

如果兄弟节点没有多余关键字,则需要和兄弟节点进行合并。

当进行合并时,可能会破坏双亲节节点的结构,需要对双亲节点进行处理。

叶子节点合并后可能双亲结点的节点数小于【m/2]上取整,同样的也需要向兄弟节点借或则合并。

总结:B+树的删除

(1)删除给关键字,如果不破坏B+树本身的性质,直接完成操作。

(2)如果删除操作导致该节点最大或最小值改变,则应相应改变父节点中的索引值。

(3)删除关键字后,如果导致其节点中关键字而个数不足,有两种方式:(1)向兄弟节点去借,(2)同兄弟节点合并。  注意:两种方式都需要更改父节点中的索引值。

 

(二)B+树和B-树的区别

一个m阶的B树具有如下几个特征:

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划

 

一个m阶的B+树具有如下几个特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

 

B+树相比于B-树的优点:

(1)IO次数少

(2)查询性能稳定

(3)范围查询简便。

 

(三)B+树的实现

 https://blog.csdn.net/u013341703/article/details/56305936

https://blog.csdn.net/xiaohusaier/article/details/77101640

 

posted @ 2020-10-07 17:39  goldstine  阅读(167)  评论(0)    收藏  举报