C++数据结构--B树,B+树,B*树

一.B树(B-树)

B树,实际上是m阶的平衡树,相较于AVL树,B树的平衡是完全平衡,要求其每一个节点的左右子树的高度差都为0,B树常用于文件索引系统的实现。

1.B树的性质

一个m阶的B树需要满足:

1.树中每个节点都最多存在m个孩子。

2除了根节点和叶子节点外,每个节点至少存在ceil(m/2)个孩子(ceil是一个取上限的函数)

3.除了根节点外,其他的所有节点的关键字个数n都必须满足:cile(m/2)-1<=n<=m-1(叶子节点也必须满足)

4.B树仍然满足左边的值小于右边的值的搜索树的性质。

2.B树的插入操作

我们以5阶B树为例:

那么根据B树的性质,我们可以知道,其除了根节点外,每个节点至少存在3个孩子,至多5个孩子,所有节点的关键字数量n,2<=n<=4。

1.如果叶子节点空间足够,那么直接插入在叶子节点中,如图,假设这里插入的节点4最大:

2.如果节点空间不足,就要进行分裂,将一半的节点分裂到左中,一半的节点分裂到右,中间的节点上移成为父节点,同时,如果节点上移导致父节点也满了,那么父节点也同样需要分裂上移,如图,假设插入的节点5的值大于1,2,3,4:

3.B树的删除操作

我们同样以5阶B树为例:

首先查找B树中要删除的元素,若元素存在,则进行删除。删除该元素后,需要判断该元素是否有左右孩子节点

1.如果有,则上移孩子节点中的相近元素(左孩子中最右边的节点或者右孩子中最左边的节点)到父节点中去,如图删除节点A。

2.如果没有,直接删除,如图删除节点4。

删除元素,然后进行元素移动之后,如果节点关键字数目不满足条件(小于ceil(m/2)-1),则需要看其相邻的兄弟节点是否丰满(关键字个数大于ceil(m/2)-1)

1.如果丰满,则向父节点借一个元素来满足,再将兄弟节点提升到父节点中,如图,删除节点15:

2.如果其相邻兄弟都刚脱贫,即借了之后其结点数目小于ceil(m/2)-1,则该结点与其相邻的某一兄弟结点和它们的父节点进行"合并"成一个结点,以此来满足条件,如图,删除节点2。

4.在数据库索引中B树的磁盘I/O优势与搜索效率

前面我们提到,B树常用于文件索引系统,那么相较于其他的树形结构,B树强在哪里,我们这里使用AVL树与B树进行比较,从B树的磁盘I/O优势与搜索效率两个方面进行分析,假设我们有10000000个数据库索引需要从磁盘中读取并进行搜索:

从磁盘I/O上看

对于AVL树,存储这些数据需要24层左右,由于AVL树的一个节点只存储一个数据,一次磁盘I/O只读取一个节点的数据,那么搜索一个数据最多需要进行进行24次磁盘I/O,然而对于一个B树来说,我们一般将其设定成300阶(保证一次磁盘I/O刚好能够读取),那么对于这些数据B树存储需要3层,那么搜索一个数据最多需要进行进行3次磁盘I/O,由此可见,B树拥有着很大的磁盘I/O优势。

从搜索效率来看

与AVL树相同,B树在每一个节点中的搜索使用的都是二分查找。

二.B+树

B树的一种变形树,m阶的B+树和m阶的B树区别:

1.所有叶子节点包含全部关键字信息,及指向含有这些关键字记录的指针,且叶子节点中关键字进行有序链接

2.非叶子结点相当于是叶子结点的索引,叶子结点相当于是存储(关键字)数据的数据层;

B+树相当于B树的优化,使得树的高度更低,相对的磁盘I/O的读取次数更低,同时B+树的空间利用率更高。

三.B*树

B*树是B+树的变体,在B+树的基础上在B+树的非根于非叶子节点添加了指向兄弟节点的指针。

B*树相当于B+树的优化:相较于B+树,B*树的空间利用率更高。

相关推荐
Darling噜啦啦4 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠5 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾5 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8215 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q5 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒5 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记5 天前
单项不带头不循环链表
数据结构·链表
小糯米6015 天前
JS 数组
数据结构·算法·排序算法
小欣加油5 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒5 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode