一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
前言:B+树和B树是一种改进的树,我们需要先了解一下什么叫B树,而B树的另一种名字叫平衡多路二叉树
什么是B树?
其与平衡二叉树主要有以下几点区别:
- **子数节点数不同:**平衡二叉树每个节点最多有两个节点,而M阶B树代表每个节点最多可以有M个子树
- 每个节点包含的数据量不同:平衡二叉树每个节点最多包含一个关键字(当前节点)代表的值和两个孩子(左右)指针。而对于B树(M阶),一个节点可以最多拥有M-1个关键字,M个链表指针。对于B树的每个中间节点有
k-1个关键字(数字数据)和k个子数(k介于阶数M和M/2之间,M/2向上取整)。 - 叶子节点的分布不同: B树的所有叶子节点都在同一层,并且叶子节点只有关键字,指向孩子的指针都为null。
B树成立的条件:
B树作为多路平衡查找树,它的每一个节点最多可以包括M个子节点,M 称为 B 树的阶。每个磁盘块中包括了关键字 和子节点的指针。如果一个磁盘块中包括了x个关键字,那么指针数就是x+1。对于一个100阶的B树来说,如果有3层的话最多可以存储约100万的索引数据。对于大量的索引数据来说,采用 B 树的结构是非常适合的,因为树的高度要远小于二叉树的高度。
什么是B+树?
- 有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
- 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
- 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
- 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。
说了这么和索引有什么关系?
如果我们真的就一点一点的去看这个解释,那是需要多聪明的脑子,和多强的抽象能力啊,接下来步入正题,
第一步:
我们先简单的定义一个表
先不用在意他的数据类型,当他存入的时候格式就会变成如下
0 表示普通记录、 2 表示最小记录、 3 表示最大记录、 1目录项 暂时还没用过,我们慢慢的就会提到这些表示的是什么意思
我们这一页存的数据是有限的,所以,当我们存储空间不足时,我们把它放到一个新的页中,但是有一个问题就是我们的页如果有频繁的插入,那么那样将会是混乱的,所以,我们需要新建一个目录项,将我们的页串起来,新建一种代表页的的表
我们就会出现新的目录页,之后我们就可以继续套娃不断地向上
但是有一点我们需要注意的就是,我们寻找B+树的过程是从下向上的,但是,在真正指定索引的时候,我们的根节点一下就会确认,顺序是相反的。