B树和B+树
Posted 神级游走
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B树和B+树相关的知识,希望对你有一定的参考价值。
B树
B树是多路平衡查找树。每个节点存放的键值对,即索引和数据。m阶B树的定义:
每个节点最多有m个子节点,最多有m-1个关键字,最少有m/2个关键字。(根节点最少可以只有一个元素)
每个节点中的关键字从小到大排序,每个关键字的左子树中所有关键字都小于它,右子树中所有关键字都大于它。
所有叶子节点位于同一层。
B树插入:
当关键字插入某一个节点后,如果节点中关键字个数小于等于m-1,插入完成,否则将节点中间的关键字放入到父节点,剩下左右两部分分裂为父节点的左子树和右子树。
例子:在5阶B树中,节点最多有4个关键字,最少有两个关键字:
插入23,25,39:
此时左子树的关键字已经大于4个了,需要进行分裂:
B树删除:
首先查找B树中需删除的元素,如果该元素在B树中存在,则将该元素在其结点中进行删除;删除该元素后,首先判断该元素是否有左右孩子结点,如果有,则上移孩子结点中的某相近元素(“左孩子最右边的节点”或“右孩子最左边的节点”)到父节点中,然后是移动之后的情况;如果没有,直接删除。
删除叶子节点中的元素:
- 删除后结点中元素数目小于m/2,则需要看其某相邻兄弟结点是否丰满;
- 如果丰满,则向父节点借一个元素,然后相邻节点的第一个或最后一个元素上移到父节点;
- 如果其相邻兄弟都不丰满,即其结点数目等于m/2,则该结点与其相邻的某一兄弟结点进行“合并”成一个结点;
B+树
m阶B+树:
每个节点最多有m个子节点,每个子树对应一个关键字,最多有m个关键字,最少有m/2个关键字。
与B树的不同点:
1.B+树的数据都存储在叶子节点,内部节点不存储数据,只存储索引。所以B+树的查询时间复杂度固定为logn,而B树的查询时间复杂度不固定,与key在树中的位置有关,最好为O(1)。B+树由于内部节点只存储索引,所以每个节点能索引的范围更大,B+树更适合外部存储。
2.每个叶子节点都有相邻叶子结点的指针,所有叶子节点按关键字大小自小而大链接。非常适用于范围查询。
3.父节点中有每一个子节点的第一个关键字。
B+树插入:
当节点元素数量大于m-1时,按中间元素分裂成左右两部分,中间元素分裂到父节点当作索引存储,但是本身中间元素还是在分裂右边部分。
例子:5阶B+树种,节点最少2个元素,最多4个元素。插入5,10,15,20:
插入25,此时元素数量大于4个了,分裂:
接着插入26,30,继续分裂:
参考:
https://segmentfault.com/a/1190000020416577
https://blog.csdn.net/weixin_43156699/article/details/117216784
https://blog.csdn.net/qq_34515959/article/details/109155630
https://blog.csdn.net/a519640026/article/details/106940115
以上是关于B树和B+树的主要内容,如果未能解决你的问题,请参考以下文章