B+树

91 阅读5分钟

进入B+树

        前面的B树可以像二叉搜索树一样快速的查找到一个元素,这个查找过程就叫做随机查找,但当要按照顺序去遍历所有元素时,就需要采用中序遍历的方式

image.png

可以看到,需要在节点间来回移动,效率较低


由B树变形来的B+树解决了这个问题

image.png

和B树结构很像,为了能够更好的理解B+树的结构,先暂时忽略掉所有非叶节点,B+树的叶节点层包含了所有元素,同时这些元素是从小到大排列的,节点之间用指针连接成一个链表的结构,这样的话就可以很轻松的通过第一个节点前的头指针(3前),来快速的对所有元素进行顺序遍历。遍历链表肯定方便


B+树通常被用做数据库中的索引结构,每个元素都包含指向对应记录存储地址的指针,例如查找到23时可以通过可以通过他的指针索引到他对应的记录

题外话,可以给同一个数据表,构建多个不同关键字的索引

对B+树的操作

性质

  • m个分支的节点有m个元素
  • 每个元素对应子节点最大值

遍历

        因为叶节点包含了所有的关键字,如果要顺序查找所有关键字的记录,那就像遍历链表一样非常方便

        有人可能有疑问,如果要随机查找某一个关键字,那不也要挨个遍历去找吗,那么B+树的非叶节点就是解决这个问题的,可以帮助我们快速的定位到叶节点上的某一个关键字,相当于给叶子节点层建立了索引,为的就是实现以log级别的复杂度去查找叶节点上的某一个关键字记录

这里和B树最大的不同是B+树的元素个数和分支数是相同的,一个元素对应一个子树。

非叶节点上的每个元素都是他子节点的最大值,这样非叶节点的部分就可以看作是对索引的索引。

理解

image.png

首先叶节点层是对记录的索引,中间的这一层非叶节点是对叶节点层关键字的索引,最上面是对下一层这些索引项的索引,所以整个B+树其实是一套多级索引结构,目的就是为了加速查询的速度

只需要通过指向根节点的指针root,就可以以log级别的复杂度,查找到指定关键字对应的记录

与B树的对比

因为B+树是对B树的一种改进,所以只需要知道B+树相对于B树来说不同点在哪,其他的都是继承了B树的特性

image.png

不同一:

B树要每个元素都作为关键字,都包含一个指向记录的指针

可以直观的看到B+树的叶子节点包含所有的关键字和对应记录的指针,非叶节点只是用来索引到下一级,不包含指向记录的指针没办法获得到相应的记录

不同二:

B+树中m个分支有m个关键字,B树中关键字个数等于分支数减一

不同三:

B+树有两个头指针(兼顾顺序查找和随机查找):head和root,使得他可以很方便的进行顺序查找和随机查找(先通过root指针定位到根节点,然后逐层向下查找),同时B+树还可以结合顺序和随机查找,很方便的进行范围查找

B树支持随机查找,但要想顺序遍历查找和范围查找只能中序遍历,效率很低


其他特性都是一样的:所有叶节点都在同一层;m阶B+树最多有m个分支,对于非根节点最少要有一半个分支,根节点最少要有两个分支,这个都是和B树一样的

查找

可以直接在叶子节点层进行顺序查找,也可以像类似B树一样进行随机查找,也可以结合两者,查找某个范围内的关键字

  • 顺序查找:只需要从head头指针所指的第一个节点开始顺序访问
  • 随机查找:和B树很像但又有点不同

image.png

此时找到了18,但此时遇到的18只是用来做索引的,本身并没有指向记录的指针,所以不能通过他来获得记录,还要继续走18的子树,也就是走到叶节点层

image.png

通过18这个关键字索引,所以B+树的查找一定落在叶子节点层,遇到非叶节点也要继续向下查找

  • 范围查找:结合前面两个来查找某个范围的关键字记录

比如找10到50的关键字记录,可以先找到范围起点的位置(也就是10)

image.png

比3大比14小,同时落在叶子节点层,意味着10不存在,但没关系,意味着14就是范围的第一个关键字,接下来从14开始,就只需要按照顺序遍历即可

查找

未更新

删除

未学习