数据结构之「B+树」

B+树

B+树 是 B树 的扩展,允许有效的插入,删除和搜索操作。

在 B树 中,键和记录(数据)都可以存储在内部节点和叶子节点中。 然而,在 B+树 中,记录只能存储在叶节点上,而内部节点只能存储键值。

B+树 的叶节点以单链表的形式链接在一起,解决区间查询,以使搜索查询更加高效。

B+树 用于无法存储大量的数据在主存储器中。 由于主存储器的大小总是有限的,B+树 的内部节点(访问记录的键)存储在主存储器(内存)中,而叶节点存储在辅助存储器(硬盘)中。由于内存的查询速度远大于硬盘,就可以把 键 放入内存,把 记录 放入硬盘,以达到最优方案。

B+树 的内部节点通常称为索引节点。

在 B+树 中的节点通常被表示为一组有序的元素和子指针。如果此 B+树 的阶数是m,则除了根之外的每个节点都包含最少 m/2 个元素最多 m 个元素,对于任意的结点有最多 m 个子指针。对于所有内部节点,子指针的数目总是与元素的数目相同。所有叶子都在相同的高度上,叶结点本身按关键字大小从小到大链接。

《数据结构之「B+树」》 image

B+树 的优点

可以在相同数量的磁盘访问中获取记录。
树的高度保持平衡,与 B树 相比较少。
我们可以顺序访问存储在 B+树 中的数据,也可以直接访问。
键用于索引。
更快的搜索查询,因为数据仅存储在叶节点上。

B+树 的实现

1.查找
类似于 二叉查找树。起始于根节点,自顶向下遍历树,选择其分离值在要查找值的任意一边的子指针。

2.插入
首先,查找到要插入其中的节点的位置。接着把值插入这个节点中。

如果没有节点违反 B+树 的规则(不能大于 m-1 个元素)直接成功返回。

如果某个节点有过多元素,则把它分裂为两个节点,每个都有最小数目的元素。在树上递归向上继续这个处理直到到达根节点,如果根节点被分裂,则创建一个新根节点。分裂的节点一般是这组元素的中位数。

3.删除
首先,查找到要删除的值,从叶子节点中删除键和数据。

如果没有节点违反 B+树 的规则(不能小于 m/2 个元素)直接成功返回。

如果叶节点包含少于最小数量的元素,则将节点与其兄弟节点合并,并删除它们之间的键。

如果索引节点包含少于最小数量的元素,则将节点与兄弟节点合并,并在它们之间向下移动键。

B-树 与 B+树的区别

1.搜索键无法重复存储; 可以存在冗余搜索键。
2.数据可以存储在叶节点以及内部节点中;数据只能存储在叶节点上。
3.搜索某些数据的过程较慢,因为可以在内部节点和叶节点上找到数据; 搜索速度相对较快,因为只能在叶节点上找到数据。
4.删除内部节点非常复杂且耗时;删除永远不会是一个复杂的过程,因为元素将始终从叶节点中删除。
5.叶节点不能链接在一起;叶节点链接在一起以使搜索操作更有效。

总结

B+树 把内部节点当作键来存储,存储的元素比较少,可以放入内存中,提升查询效率。叶子节点里存储里键和数据,适合放入硬盘,只需要少量的读取硬盘即可完成查询。因为内存的读取比硬盘块很多,所以效率提升很多。

由于 B+树 内部节点只有键,存储内容较少,增删查时间复杂度为 O(log n),叶子节点链接在一起,可以区间查询等,所以非常适合做数据库索引存储结构。数据库主键索引最好是自增的,以提升插入效率。

PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一起谈天说地,聊代码。

《数据结构之「B+树」》

    原文作者:清尘闲聊
    原文地址: https://www.jianshu.com/p/a8341f5d99e5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞