右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的
树结构索引;所以,使用
B树还要考虑尽可能让
B树保持左图的结构,和避免右图的结构,也就
是所谓的“平衡”问题;
实际使用的
B树都是在原
B树的
基础上加上平衡算法,即“平衡二叉树”;如何保持
B树
结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法
是一种在
B树中插入和删除结点的
策略;
B-树
是一种多路搜索树(并不是二叉的):
1.
定义任意非叶子结点最多只有
M个儿子;且
M>2;
2.
根结点的儿子数为
[2,
M];
3.
除根结点以外的非叶子结点的儿子数
为
[M/2, M];
4.
每个结点存放至少
M/2-1(取上整)和至多
M-1个关键字;(至少
2个关键字)
5.
非叶子结点的关键字个数
=指向儿子的指针个数
-1;
6.
非叶子结点的关键字:
K[1],
K[2], …, K[M-1];且
K[i] < K[i+1];
7.
非叶子结点的指针:
P[1],
P[2], …, P[M];其中
P[1]指向关键字小于
K[1]的
子树,
P[M]指向关键字大于
K[M-1]的子树,其它
P[i]指向关键字属于
(K[i-1],
K[i])的子树;
8.
所有叶子结点位于同一层;
如:(
M=3)
B-树的搜索,从根结点开
始,对结点内的关键字(有序)序列进行二分查找,如果
命中则结束,否则进入查询关键字所属范围的儿子结点;
重复,直到所对应的儿子指针为
空,或已经是叶子结点;
B-树的特性:
1.
关键字集合分布在整颗树中;
2.
任何一个关键字出现且只出现在一个
结点中;
3.
搜索有可能在非叶子结点结束;
4.
其搜索性能等价于在关键字全集内做
一次二分查找;
5.
自动层次控制;
由于限制了除根结点以外的非叶子结点,
至少含有
M/2个儿子,确保了结点的至少
利用率,其最底搜索性能为:
其中,
M为设定的非叶子结点最多子树个数,
N为关键字总数;
所以
B-树的性能总是等价于二分查找(与
M值无关),也就没有
B树
平衡的问题;
由于
M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占
M/2的结点;删除结点时,需将两个不足
M/2的兄弟结点合并;
B+树
B+
树是
B-树的变体,也是一种多路搜索树:
1.
其定义基本与
B-树同,除了:
2.
非叶子结点的子树指针与关键字个数
相同;
3.
非叶子结点的子树指针
P[i],指向关键字值属于
[K[i], K[i+1])的子树
(
B-树是开区间);
5.
为所有叶子结点增加一个链指针;
6.
所有关键字都在叶子结点出现;
如:(
M=3)
B+的搜索与
B-树也基本相同,区别是
B+树只有达到叶子结点才命中(
B-树可以在
非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+
的特性:
1.
所有关键字都出现在叶子结点的链表
中(稠密索引),且链表中的关键字恰好
是有序的;
2.
不可能在非叶子结点命中;
3.
非叶子结点相当于是叶子结点的索引
(稀疏索引),叶子结点相当于是存储
(关键字)数据的数据层;
4.
更适合文件索引系统;
B*树
是
B+树的变体,在
B+树
的非根和非叶子结点再增加指向兄弟的指针;
B*树定义了非叶子结点关键字个数至少为
(2/3)*M,即块的最
低使用率为
2/3
(代替
B+树的
1/2);
B+
树的分裂:当一个结点满时,分配一
个新的结点,并将原结点中
1/2的数据
复制到新结点,最后在父结点中增加新结点的指针;
B+树的分裂只影响原结点和父
结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;
B*
树的分裂:当一个结点满时,如果它
的下一个兄弟结点未满,那么将一部分
数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字
(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之
间增加新结点,并各复制
1/3的数据到新结点,最后在父结点增加新结点的指针;
所以,
B*树分配新结点的概率比
B+树要低,空间使用率更高;
小结
B
树:二叉树,每个结点只存储一个关键
字,等于则命中,小于走左结点,大于
走右结点;
B-
树:多路搜索树,每个结点存储
M/2到
M个关键字,非
叶子结点存储指向关键
字范围的子结点;
所有关键字在整颗树中出现,且只出现一
次,非叶子结点可以命中;
B+
树:在
B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点
中出现,非叶子结点作为叶子结点的索引;
B+树总是到叶子结点才命中;
B*
树:在
B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率
从
1/2提高到
2/3;
相关推荐
### B树-B+树-B*树谈到R树 #### 一、引言 在计算机科学领域,树形数据结构作为一种高效的数据组织方式被广泛应用。在众多树形结构中,B树、B+树、B*树和R树因其在处理大规模数据集时表现出的优秀性能而备受关注。...
B树、B-树、B+树以及B*树都是基于树形结构的自平衡数据结构,它们各有侧重,适用于不同的应用场景: - **B树** 更适合需要频繁插入和删除操作的场景。 - **B-树** 保证了较高的查找效率,适用于对查找速度要求较高的...
### B树、B-树、B+树、B*树详解 #### 一、B树 (Binary Search Tree) **定义**: - B树通常指的是**二叉搜索树**(Binary Search Tree, BST)。这是一种特殊的二叉树,其中每个节点最多有两个子节点(左子节点和右...
B树++(B*树)是对B+树的进一步优化,增加了节点的扇出率,减少了节点分裂和合并的频率,提高了空间利用率。 R树(R-tree)是一种多维空间索引结构,用于处理高维数据,如地理信息系统中的坐标数据。R树允许节点...
在IT领域,B+树(B Plus Tree)是一种重要的数据结构,广泛应用于数据库管理系统和文件系统中,以高效地处理大量的数据。B+树的主要特点是平衡性和数据存储的有序性,使得查找、插入和删除操作的性能保持在一个相对...
**B+树详解** B+树(B Plus Tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,因为它能保持数据有序,并且在插入、删除和查找操作上具有较高的效率。B+树的主要特点是所有数据都存储在叶子节点,非...
本压缩包“b+b-树c语言版”提供了C语言实现的B+树相关功能,包括创建、删除、查询和插入操作。以下是关于B+树及其C语言实现的详细知识。 **B+树简介** B+树(B Plus Tree)是一种自平衡的树,它的设计目的是为了...
**B+树详解** B+树(B Plus Tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,因为它能保持数据排序并提供快速的查找、插入和删除操作。这种数据结构的特点是所有数据都在叶子节点,非叶子节点只...
在计算机科学领域,数据结构是编程的基础,B+树(B-plus tree)作为一种高效的数据存储结构,被广泛应用于数据库和文件系统中。本篇将详细阐述如何使用C++语言实现B+树,以及其核心原理和操作。 B+树是一种自平衡的...
### 从B树、B+树、B*树到R树:深入了解数据结构的应用 #### 一、前言 在大规模数据存储与检索领域,树形数据结构扮演着至关重要的角色。传统二叉查找树虽然提供了较为高效的查找性能,但由于其高度与数据量成正比...
B-树和B+树是两种重要的数据结构,主要用于数据库和文件系统的索引,它们能够高效地处理大量的数据,尤其适合磁盘等慢速存储介质。这两种数据结构都是多路平衡查找树,能够保持数据的有序性,同时通过减少磁盘I/O...
**B+树详解** 在高级数据库系统中,B+树是一种至关重要的数据结构,它广泛应用于数据库和文件系统的索引实现。B+树是B树的一种变体,优化了对磁盘等外存储器的数据访问效率,使得大量数据的检索更为高效。 1. **B+...
**B+树与B-树概述** B+树和B-树是计算机科学中用于数据库和文件系统等数据存储的重要数据结构,它们主要用于高效地管理大量数据,特别是当数据需要在磁盘等慢速存储介质上进行操作时。这两种树都是自平衡的,能保持...
### B+树C语言代码实现解析 #### 一、引言 本文将深入解析一份C语言实现的B+树代码,这份代码不仅演示了如何在操作系统文件系统之上构建B+树,而且还展示了如何通过文件操作来模拟B+树的建立过程。通过分析这段代码...
B-树和B+树的C语言实现(数据结构)。
B-树(Balanced Tree)和B+树是两种常见的自平衡的多路搜索树,广泛应用于数据库和文件系统中,以优化大容量数据的访问效率。这两种数据结构都是为了在磁盘等慢速存储设备上实现高效的查找、插入和删除操作。 B-树...
B树、B-树、B+树和B*树都是数据库和文件系统中常用的高效数据结构,它们主要用于解决大数据量的存储和检索问题。这些数据结构都是多路搜索树,与二叉搜索树不同的是,它们的每个节点可以有多个子节点,从而允许更...
【B树、B+树和B*树:数据结构中的高效索引技术】 在计算机科学中,数据结构的选择对算法的效率至关重要。特别是在处理大规模数据时,如何有效地存储和检索信息是一个关键问题。B树(B-tree)、B+树(B+tree)和B*树...
### 二叉树、B树、B+树、红黑树 #### 一、二叉树 二叉树是一种常见的树形数据结构,在计算机科学中应用广泛。它具有以下特点: - **节点最多有两个子节点**:即每个节点最多有一个左子节点和一个右子节点。 - **...
B+树(B+ Tree)是一种自平衡的树数据结构,广泛应用于数据库系统和文件系统中,用于高效地存储和检索大量数据。它的主要特点是所有数据都存储在叶子节点上,且叶子节点之间通过指针链接,使得遍历变得更加简单。 #...