B+树:
B+ 树是一种树数据结构,是一个n叉排序树,每个节点通常有多个孩子,
B+ 树通常用于数据库和操作系统的文件系统中。
B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。
B+树是对B树的一种变形树,它与B树的差异在于:
- 有k个子结点的结点必然有k个关键码;
- 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
- 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录
B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,因此在内存页中能够存放更多的key,叶子节点上的数据就有更好的缓存命中率。
所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。
如下图的例子:
m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个子树),阶数m同时限制了叶子结点最多存储m-1个记录。
B+树的插入:
1:若为空,创建一个叶子节点,然后其叶节点就是根节点
2:针对叶子类型结点:根据key值找到叶子结点,向这个叶子结点插入记录。插入后,若当前结点key的个数小于等于m-1,则插入结束。否则将这个叶子结点分裂成左右两个叶子结点,左叶子结点包含前m/2个记录,右结点包含剩下的记录,将第m/2+1个记录的key进位到父结点中(父结点一定是索引类型结点),进位到父结点的key左孩子指针向左结点,右孩子指针向右结点。将当前结点的指针指向父结点,然后执行第3步。
3:针对索引类型结点:若当前结点key的个数小于等于m-1,则插入结束。否则,将这个索引类型结点分裂成两个索引结点,左索引结点包含前(m-1)/2个key,右结点包含m-(m-1)/2个key,将第m/2个key进位到父结点中,进位到父结点的key左孩子指向左结点, 进位到父结点的key右孩子指向右结点。将当前结点的指针指向父结点,然后重复第3步。
例:下面是一颗5阶B树的插入过程,5阶B数的结点最少2个key,最多4个key。
第一步: 插入5
5 |
|
|
|
第二步: 插入8,10,15
5 | 8 | 10 | 15 |
第三步: 插入16(超过4了,就开始加一层,左边最少2个)
第四步: 插入17,18((17/18都大于16,所以就会)当插入18时会超过4,所以又分出一个)