【数据结构】B树

B树的定义

B树也叫B-树,是一棵多路平衡查找树。B即Balance。

下面,我们看着图,先搞清楚它的定义:

在这里插入图片描述

一个结点的最大孩子个数称为树的阶,通常用m表示。一棵m阶B树要么是空树,要么满足以下定义:

(1)一个结点的结构是:(P0,K1,P1,K2,…,Kn,Pn),其中P为指向子树的指针,K为关键字

(2)对于根结点,如果它本身不是叶子结点,至少拥有 1 个关键字,即至少拥有 2 棵子树

(3)对于除根结点之外的所有结点,至少拥有⌈m/2⌉ 棵子树,即至少拥有 ⌈m/2⌉-1 个关键字

(4)为了满足阶的定义,任何结点最多拥有 m 个子树,即最多拥有 m - 1 个关键字

(5)B树的关键字是有序的,它具有两层含义,一来指向卫星数据,二来作为索引划分区间

 
 

B树的查找

还是看图呀!以查找6为栗子:

在这里插入图片描述

B树的查找包括两个基本操作: ① 在B树中找结点 ② 在结点中找关键字。

更具体的说,根据指针拿到一个结点,是一次磁盘I/O,即第①个动作是在磁盘上进行的;根据有序关键字查找目标,是一次顺序查找或二分查找,即第②个动作是在内存中进行的。

这时,你是不是已经明白了为什么数据库要使用B树而非二叉搜索树呢?

B-Tree和BST的目的都是查找,查找算法的瓶颈是什么呢?比较的次数。但是,数据库查询的瓶颈是什么呢?磁盘I/O的次数。在内存中比较的时间,在磁盘I/O的时间面前完全可以忽略。况且,B-Tree和BST在比较次数上其实相差无几。
把B-Tree和BST摆在一起不难看出,B-Tree比BST矮胖的多。高度更小,说明磁盘I/O次数越少,自然性能越好!当数据库非常非常非常大时,B树的一个结点就是放在一个磁盘块上的,对于磁盘I/O次数的节省也会到达极致。

 
 

B树的插入

B树的插入很简单,看着下面的图很容易学会 >_<

情况一:插入后结点关键字个数仍符合B树定义(最多m-1),则直接插入。

以5阶B树为例,根据定义,一个结点最多有5个子树,4个关键字。

在这里插入图片描述

情况二:插入后结点关键字个数不符合B树定义(最多m-1),则插入后还要进行结点分裂。

结点分裂的规则是,根据最中间的关键字将结点分成两个结点,最中间的关键字上升到父结点;如果本次上升导致父结点不满足定义,则继续分裂父结点。

在这里插入图片描述

 
什么?想自己练一练?

在这里插入图片描述

结合这道练习题,再多说一点:B树的插入都是插入到叶子结点上的,但是,通过结点分裂和关键字上升,插入的值最终有可能出现在树的任何地方。

 
 

B树的删除

B树的删除要复杂一些。但是,跟着下面的图解走一遍,保证你可以学会!

还是用一个5阶的B树举栗子 >_<

删除叶子结点,且删除后仍满足B树定义:直接删除。

在这里插入图片描述


删除非叶子结点,都可转化为删除叶子结点:用下一个区间的最小值替换被删除结点。

在这里插入图片描述


删除叶子结点,且删除后不再满足B树定义,且兄弟够借:向兄弟借一个,不是直接拿过去,而是带着父结点的关键字一起旋转一下。

在这里插入图片描述


删除叶子结点,且删除后不再满足B树定义,且兄弟不够借:与兄弟合并,并且带着父结点的关键字一起合并。

在这里插入图片描述

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

☘️

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B树是一种自平衡的树数据结构,常用于数据库和文件系统中,因为它能提供高效的查找、插入和删除操作。这里我将简要介绍B树的基本概念和常见的C++实现框架,但请注意完整的代码会涉及到大量的细节和模板元编程,这里不会列出全部代码。 B树的主要特点: 1. **范围查询**: B树的每个节点可以包含多个关键字,这使得它能够处理大规模的数据集,同时保持查询效率。 2. **自平衡**: 在插入和删除时,B树会自动调整其高度以保持平衡,保证了对数时间复杂度的操作。 **B树基础**: - 每个节点最多有\( m \)个键值(\( m \)是大于1的固定整数),其中\( \lceil \frac{m}{2} \rceil \)是左子树的最大深度,\( \lfloor \frac{m}{2} \rfloor \)是右子树的最大深度。 - 根节点至少有两个键值,叶子节点没有子节点,内部节点至少有一个子节点。 - 插入和删除时,可能会导致节点分裂或合并,以保持平衡。 **C++中的B树核心结构**: ```cpp template <typename Key, typename MKey = Key, typename Value = void, int Order = 20> class BTreeNode { // 数据结构和方法... }; ``` 这里`Order`是一个可变参数,定义了每个节点的最小容量。实际的实现会包含节点的指针数组、大小信息、平衡操作的辅助函数等。 **相关问题--:** 1. B树关键字是如何组织在节点中的? 2. 描述一下B树插入和删除操作的具体步骤。 3. 如何在C++中创建一个B树的根节点?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值