数据结构之B树
1 引言
B-tree,B即Balanced,是自平衡的多叉搜索树,用于组织和存储大量数据,以及数据库和文件系统等需要高效查找和插入操作的应用中。
为什么是“大量数据”?当主存不足以放入大量数据时,不常用的数据应存储于外存,而访问外存有额外时间开销(如磁盘转动时间、磁头移动时间等),于是我们需要一个数据结构来减少磁盘访问次数。
B树每个节点包含多个关键字(键)和对应的数据指针(节点),关键字按照大小排序,并且每个节点的关键字都对应子节点的范围。
B树的根节点存储在主存中,而其他节点存储在磁盘或其他外部存储设备上。
M阶B树是有以下特性的M叉树:
- 数据项(data items)存储在叶节点(leaves);
- 非叶节点(nonleaf nodes)最多存储指引搜索路线的M-1个关键字Key,并且Key i是该节点子树i+1的最小值;
- 根节点(root)也是非叶节点,它有2至M个子节点;
- 所有非叶节点(root除外)有\(\lceil M/2 \rceil\)至M个子节点;
- 所有叶节点都位于最底层,有\(\lceil L/2 \rceil\)至L个数据项。L是指定值,由存储块和记录大小决定,即L=存储块大小/记录大小。
五阶B树示例如下图所示:

上图中,M=5,L=5,于是,根节点有2到5个子节点,非叶节点最多有4个关键字,除根节点外的非叶结点有3到5个子节点,叶节点有3到5个数据项。每个节点都是一个磁盘块(disk block)。
2 B树的操作
添加
如图2,插入57到图1。

插入操作步骤如下:
- 从根节点开始,按照键值的大小进行搜索,直到找到合适的叶子节点。在这个例子中,我们找到了可以插入57的叶子节点。
- 检查叶子节点是否已满。如果叶子节点未满,则可以直接将57插入到适当的位置。
- 如果叶子节点已满,需要进行节点的分裂操作。首先,将叶子节点中的数据项和新的数据项按照键值的顺序重新排序。然后,将前一半数据项保留在原始叶子节点中,将后一半数据项移动到新创建的叶子节点中。同时,更新父节点中的键值和分支信息,以反映新的叶子节点的存在。
- 如果父节点也已满,可能需要继续进行分裂操作,以保持B树的平衡性。
如图3,插入55到图2,共两步:分裂页节点和更新父节点。所以一共有三次disk write操作。

如图4,插入40到图3,由于父节点满项,所以除了分裂子节点,更新父节点,还需要再分裂父节点。一共五次disk write。

添加操作可能导致的根节点分裂是B树高度增加唯一方式。
删除
A(寻找键值) ==> B{是否存在}
B ==是==> C[删除键值]
B ==否==> D(结束)
C ==> E{该节点是否符合最小占用}
E ==是==> D
E ==否==> F{邻居节点是否比最小占用多}
F ==是==> G[从邻居节点借一个]
F ==否==> H[合并邻居节点]
G ==> D
H ==> I{父节点是否符合最小占用}
I ==是==> D
I ==否==> J{是否为根节点}
J ==否==> F
J ==是==> K{根节点是否只有一个子节点}
K ==否==> D
K ==是==> L[删除根节点,子节点作为新根节点]
L ==> D
上图删除根节点是B树高度减小的唯一方式。
数据结构之B树的更多相关文章
- D&F学数据结构系列——B树(B-树和B+树)介绍
B树 定义:一棵B树T是具有如下性质的有根树: 1)每个节点X有以下域: a)n[x],当前存储在X节点中的关键字数, b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x ...
- Go 数据结构--二分查找树
Go 数据结构--二分查找树 今天开始一个Go实现常见数据结构的系列吧.有时间会更新其他数据结构. 一些概念 二叉树:二叉树是每个节点最多有两个子树的树结构. 完全二叉树:若设二叉树的高度为h,除第 ...
- 【经典数据结构】B树与B+树
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- Linux 内核中的数据结构:基数树(radix tree)
转自:https://www.cnblogs.com/wuchanming/p/3824990.html 基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相 ...
- 数据结构---平衡查找树之B树和B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...
- 【经典数据结构】B树与B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- 【经典数据结构】B树与B+树的解释
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...
- 数据结构-PHP 线段树的实现
转: 数据结构-PHP 线段树的实现 1.线段树介绍 线段树是基于区间的统计查询,线段树是一种 二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查 ...
- 算法数据结构(一)-B树
介绍 B树的目的为了硬盘快速读取数据(降低IO操作次树)而设计的一种平衡的多路查找树.目前大多数据库及文件索引,都是使用B树或变形来存储实现. 目录 为什么B树效率高 B树存储 B树缺点 为什么B树效 ...
- [转]数据结构之Trie树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
随机推荐
- OData WebAPI实践-OData与EDM
本文属于 OData 系列 引言 在 OData 中,EDM(Entity Data Model) 代表"实体数据模型",它是一种用于表示 Web API 中的结构化数据的格式.E ...
- sklearn中的KFold简单介绍
这一部分主要讲解关于什么是K-foldCV(K折交叉验证),简单的使用一些案例进行分析,然后使用sklearn库函数中一些简单的案例进行分析. 在机器学习中,多数最主要的功能函数被封装到sklearn ...
- 2021-07-19:给定一个正数N,比如N = 13,在纸上把所有数都列出来如下: 1 2 3 4 5 6 7 8 9 10 11 12 13,可以数出1这个字符出现了6次,给定一个正数N,如果把1
2021-07-19:给定一个正数N,比如N = 13,在纸上把所有数都列出来如下: 1 2 3 4 5 6 7 8 9 10 11 12 13,可以数出1这个字符出现了6次,给定一个正数N,如果把1 ...
- 2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2
2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对.例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2 ...
- Django 14天从小白到进阶- Day1 Django 初识
来自作者:金角大王 本节内容 Http原理介绍 自行开发一个Web框架 WSGI介绍 Django介绍 MVC/MTV Django安装 创建项目与APP 开发第一个页面 为什么学Django? Go ...
- 8张图带你全面了解kafka的核心机制
前言 kafka是目前企业中很常用的消息队列产品,可以用于削峰.解耦.异步通信.特别是在大数据领域中应用尤为广泛,主要得益于它的高吞吐量.低延迟,在我们公司的解决方案中也有用到.既然kafka在企业中 ...
- Kubernetes 证书详解
K8S 证书介绍 在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 ...
- 分布式机器学习(Parameter Server)
分布式机器学习中,参数服务器(Parameter Server)用于管理和共享模型参数,其基本思想是将模型参数存储在一个或多个中央服务器上,并通过网络将这些参数共享给参与训练的各个计算节点.每个计算节 ...
- Grafana系列-GaC-1-Grafana即代码的几种实现方式
系列文章 Grafana 系列文章 Terraform 系列文章 概述 GaC(Grafana as Code, Grafana 即代码) 很明显是扩展自 IaC(Infrastructure as ...
- 程序包xx不存在解决方案:java: 程序包org.aspectj.lang.annotation
java: 程序包org.aspectj.lang.annotation不存在 #我自己已经配置好pom.xml文件,但是一直报错这个 aspectj 不存在 下面是我的pom.xml配置 可以看出来 ...