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*树的空间利用率更高。

相关推荐
bnmoel2 小时前
数据结构深度剖析顺序表:结构、扩容与增删查改全解析
c语言·数据结构·算法·顺序表
Liangwei Lin2 小时前
LeetCode 45. 跳跃游戏 II
数据结构·算法·leetcode
枕星而眠2 小时前
一篇吃透 C++ 核心基础:初始化、引用、指针、内联、重载、右值引用
开发语言·数据结构·c++·后端·visual studio
平行侠2 小时前
026FFT快速乘法 - 从信号处理到大数计算的革命
数据结构·算法·信号处理
C雨后彩虹2 小时前
猴子爬山问题
java·数据结构·算法·华为·面试
知识分享小能手2 小时前
R语言入门学习教程,从入门到精通,R语言数据结构(4)
数据结构·学习·r语言
米啦啦.2 小时前
B+树、、
b树·b+
无限进步_3 小时前
【C++】智能指针族谱:auto_ptr、unique_ptr、shared_ptr
java·开发语言·数据结构·c++·算法
洛水水3 小时前
B树与B+树详解
数据结构·b树