B-树的应用以及添加和删除操作

简介: B-树的应用以及添加和删除操作

B-树

B-树的应用

B-树适用于磁盘存储应用中。

因为磁盘操作相较于CPU读取操作比较费时,而B-树相较于二叉树来说,有更少的查找次数,效率更高。

用一个例子说明:

假如有1024个数据,用二叉树来存储的话,会有10层的树的高度。检索数据时从根节点到叶子节点是需要经过多次的数据比对操作。而在磁盘操作中每次对比后找下一个节点就是磁盘寻址。如果层比较高的话,就会寻找很多次。相对来说B-树的寻址次数会少很多。(因为一个节点包含了多个key值,总的来说会减少了树的高度)。

B-树的特点

一颗M阶B-树,满足以下条件(M阶是指该B-树是M叉树):

1. 每个节点至多拥有M颗子树
2. 根节点至少拥有两颗子树
3. 除了根节点以外,其余每个分支节点至少拥有M/2颗子树
4. 所有的叶子节点都在同一层上
5. 有k个子树的分支节点则存在k-1个关键字,关键字按照递增顺序进行排序
6. 根节点外,关键字数量满足ceil(M/2)-1 <= n <= M-1

分析一下这些条件:

如图是一个6阶B-树

条件1:比如(0012 0016 0022 0025 0028)这个节点,最多只能连6根线下去;

条件2比较好理解

条件3:就是每个分支节点必须要有3颗及以上的子树

条件4:叶子节点都在一层,保持绝对平衡。

条件5:比如(0003 0006)这个节点有2个关键字,它就有3个子树。因为有三个范围,分别对应三个子树。例如{x < 0003; 0003 < x < 0006; x > 0006}三个范围。

条件6:这个6阶B-树中,关键字的数量满足 2≤n≤5。

满足这6个条件就是B-树了。

B-树的操作

值的添加

B-树中值的添加涉及到分裂操作。因为当添加到一个节点的关键字数等于阶数时,就会通过分裂操作来满足B-树的性质。

还是以6阶B-树为例:

从(0001 0002 0003 0004 0005)该节点再添加0006关键字,

当节点超过5个key值时,会执行分裂操作。

值的删除

B-树中值的删除涉及到合并和借位操作。

以6阶B-树为例:

合并操作

删除0001关键字,

由于删除0001后,该节点只有0002一个关键字了,不满足条件6,因此需要合并操作。

借位操作

删除0002关键字,

由于删除0002后,该节点只有0003一个关键字了,这时候就借位根节点0006,将0007升级为根节点。

目录
相关文章
|
1月前
|
存储 数据库 索引
B树和B+树的插入、删除图文详解
B树和B+树的插入、删除图文详解
10 0
|
1月前
|
算法
数据结构和算法学习记录——二叉搜索树的插入操作、删除操作
数据结构和算法学习记录——二叉搜索树的插入操作、删除操作
14 0
|
2月前
|
NoSQL 容器 消息中间件
二叉搜索树查询/插入/求前驱/求后继/删除
二叉搜索树查询/插入/求前驱/求后继/删除
二叉搜索树查询/插入/求前驱/求后继/删除
二叉排序树的插入和删除操作
二叉排序树的插入和删除操作
|
9月前
|
机器学习/深度学习 C++
AVL树的插入(C++实现)
AVL树的插入(C++实现)
54 0
C++ -- AVL树插入实现和测试
1. AVL树概念 AVL树就是自平衡二叉查找树,为了解决二叉树退化为单链表,使得增删查改时间度为O(N),这里采用控制平衡策略达到效率是O(logN)。 2. AVL树满足性质 每个节点的左右子树高度之差绝对不能超过1 左边插入(父节点高度差-1) 右边插入(父节点高度差+1) 不插入(自身节点高度差为0)
112 0
|
算法 C++ 容器
【C++】AVL树和红黑树的插入
【C++】AVL树和红黑树的插入
|
算法
一天一个算法——>二叉搜索树的插入、查询、删除
一天一个算法——>二叉搜索树的插入、查询、删除
65 0
|
算法
一天一个算法——>平衡二叉树的插入
一天一个算法——>平衡二叉树的插入
49 0
数据结构145-二叉搜索树-删除操作
数据结构145-二叉搜索树-删除操作
47 0
数据结构145-二叉搜索树-删除操作