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

相关推荐
星马梦缘4 小时前
aaaaa
数据结构·c++·算法
OpenApi.cc5 小时前
神经网络结构驱动+数据结构分析
数据结构·人工智能·神经网络
星恒随风6 小时前
C语言数据结构排序算法详解(下):冒泡排序、快速排序、归并排序和计数排序
c语言·数据结构·笔记·学习·排序算法
初夏睡觉7 小时前
数据结构学习之~二叉堆 (P3378 【模版】堆)
数据结构·c++·学习
云泽8088 小时前
笔试算法 - 链表篇(一):移除、反转、合并、回文判断全解析
数据结构·c++·算法·链表
也曾看到过繁星8 小时前
数据结构-复杂度
数据结构
菜菜的顾清寒8 小时前
HOT力扣100(43)二叉树-翻转二叉树
数据结构·算法·leetcode
Jasmine_llq9 小时前
《B3939 [GESP样题 四级] 绝对素数》
数据结构·算法·素数判断算法·数字拆分与反转算法·区间遍历枚举·双条件判断逻辑
郝学胜-神的一滴10 小时前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
未若君雅裁11 小时前
算法复杂度与数据结构:Java 集合篇的第一块基石
java·数据结构·算法