- 浏览: 29590 次
- 性别:
- 来自: 广州
最新评论
B 树
即二叉搜索树:
1. 所有非叶子结点至多拥有两个儿子( Left 和 Right );
2. 所有结点存储一个关键字;
3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;
如:
B 树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比 结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;
如果 B 树的所有非叶子结点的左右子树的 结点数目均保持差不多(平衡),那么 B 树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变 B 树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;
如:
但 B 树在经过多次插入与删除后,有可能导致不同的结构:
右边也是一个
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
;
转自: http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx
发表评论
-
(转)Andriod是什么
2010-12-02 11:24 1614导读:Sans Serif是Google的 ... -
(转)SQLite入门与分析(六)---再谈SQLite的锁
2010-11-19 00:09 942写在前 面:SQLite封锁机制的实现需要底层文件系统的 ... -
(转)SQLite入门与分析(五)---Page Cache之并发控制
2010-11-19 00:05 1048写在前面:本节主要谈 ... -
(转)SQLite入门与分析(四)---Page Cache之事务处理(3)
2010-11-19 00:01 953Code 写在前面:由于 内容较多,所以断续没有写完的 ... -
(转)SQLite入门与分析(四)---Page Cache之事务处理(2)
2010-11-18 23:57 1143写在前面:个人认为pager层是SQLite实现最为核心的 ... -
(转)SQLite入门与分析(四)---Page Cache之事务处理(1)
2010-11-18 23:53 940写在前面:从本章开始,将对SQLite的每个模块进行讨论。 ... -
(转)SQLite入门与分析(三)---内核概述(2)
2010-11-18 23:48 1302写在前面:本节 是前 ... -
(转)SQLite入门与分析(三)---内核概述(1)
2010-11-18 23:41 797写在前面:从本 章开始, ... -
(转)SQLite入门与分析(二)---设计与概念(续)
2010-11-18 23:38 1040写在前面:本节 讨论事务,事务是DBMS最核心的技术之一 ... -
(转)SQLite入门与分析(二)---设计与概念
2010-11-18 23:35 792写在前面:谢谢各位的 ... -
(转)SQLite入门与分析(一)
2010-11-18 23:31 906写在前面:出于项目的 需要,最近打算对SQLite的内核 ... -
(转)深入研究B树索引(五)续
2010-11-18 15:10 9275.3 重建 B 树索引 ... -
(转)深入研究B树索引(五)
2010-11-18 15:07 11915. 重建 B ... -
(转)深入研究B树索引(四)续
2010-11-18 14:58 9164.2 B 树索引的对于删除( DEL ... -
(转)深入研究B树索引(三、四)
2010-11-18 14:44 7153. B 树索 ... -
(转)深入研究B树索引(二)
2010-11-18 14:20 7582. B 树索引的内部结构 ... -
(转)深入研究B树索引(一)
2010-11-18 14:12 1001摘要: 本文对B 树索引的结构、内部管理等方面做了一个全面 ... -
画UML图时注意的几个原则(转)
2010-08-03 12:34 1624软件开发中,分析和设计时,文档的编写和思想的交流,经常要绘制各 ... -
你是个软件架构师吗?(转)
2010-07-14 11:11 664开发和架构的界限难以 ... -
(转)同曲异奏——高效能项目团队的五大特点
2010-03-29 00:24 859同曲异奏——高效能项 ...
相关推荐
B树、B+树、B*树和R树都是针对不同场景优化的数据结构。它们各有特点,在不同的应用场景下表现出了不同的优势。选择合适的树形结构取决于具体的应用需求。例如,在需要高效处理大规模数据并进行频繁查询的场景下,B+...
- B-树、B+树和B*树都是为了处理大量数据设计的自平衡多路搜索树。 - B-树支持关键字在非叶子节点处命中,B+树将所有关键字存储在叶子节点中,增加了叶子节点之间的链接。 - B*树通过增加指向兄弟节点的指针以及提高...
B树、B-树、B+树以及B*树都是基于树形结构的自平衡数据结构,它们各有侧重,适用于不同的应用场景: - **B树** 更适合需要频繁插入和删除操作的场景。 - **B-树** 保证了较高的查找效率,适用于对查找速度要求较高的...
2. **每个节点都有多个子节点**:这允许B+树具有较高的阶,可以存储大量的数据,并且在插入、删除时能保持树的高度相对稳定。 3. **节点内部有序**:节点中的键值按照升序排列,便于区间查询和排序。 4. **叶子...
在数据库和文件系统中,数据存储和检索的高效性至关重要,这就引出了我们今天要讨论的主题:B树、B+树、B*树以及R树。这些数据结构都是为了优化磁盘I/O操作而设计的,尤其适用于大规模数据的存储。 首先,B树...
B树++(B*树)是对B+树的进一步优化,增加了节点的扇出率,减少了节点分裂和合并的频率,提高了空间利用率。 R树(R-tree)是一种多维空间索引结构,用于处理高维数据,如地理信息系统中的坐标数据。R树允许节点...
B-树和B+树的主要区别在于,B-树的搜索、插入和删除可以在非叶子节点进行,而B+树的所有操作都在叶子节点进行,这使得B+树更适用于需要遍历所有记录的情况,例如数据库索引。B+树的叶子节点之间的链指针减少了查找...
2. **B-+树**:B-+树是一种特殊的B-树,它的所有数据都存储在叶子节点上,而非叶子节点只存储索引信息。这样设计的好处是可以减少磁盘I/O次数,并且便于进行范围查询。B-+树中,叶子节点之间通过指针相互连接,形成...
B树、B-树、B+树和B*树都是数据库和文件系统中常用的高效数据结构,它们主要用于解决大数据量的存储和检索问题。这些数据结构都是多路搜索树,与二叉搜索树不同的是,它们的每个节点可以有多个子节点,从而允许更...
- **非叶子节点不存储数据**:B+树的非叶子节点只用来作为索引,不存储实际数据,而数据都存储在叶子节点上。 - **所有叶子节点都有指向相邻叶子节点的指针**:这一特性确保了任何数据项的搜索都可以通过一次从根...
1. **非叶子节点仅作为索引**:B+树的非叶子节点不存储数据,只作为索引,所有数据都存储在叶子节点中。 2. **链接结构**:叶子节点之间通过指针相互连接,形成一个有序链表,便于范围查找和遍历。 3. **所有关键字...
**B+树与B-树概述** B+树和B-树是计算机科学中用于数据库和文件系统等数据存储的重要数据结构,它们主要用于高效地管理大量数据,特别是当数据需要在磁盘等慢速存储介质上进行操作时。这两种树都是自平衡的,能保持...
- **B-树**:由根节点和其他所有节点组成,每个节点都遵循B-树的规则。 2. **模块设计**: - **B-树构造**:初始化节点,设置阶数,分配内存。 - **查找算法**:从根节点开始,按照B-树的性质逐层向下比较键值,...
B-树和B+树的C语言实现(数据结构)。
与二叉搜索树不同,B+树的每个节点可以有多个子节点,每个节点存储多个键值,并且所有数据都存储在叶子节点上,非叶子节点只作为索引使用。这使得B+树的高度较低,减少I/O操作,提高数据访问效率。 2. **B+树的特性...
与普通的二叉搜索树不同,B+树的所有数据都存储在叶子节点上,且叶子节点之间通过指针链接,使得数据的遍历更为高效。此外,B+树的每个内部节点(非叶子节点)可以包含多个子节点,这使得它能够处理大量数据并保持较...
**B+树详解** B+树(B Plus Tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,因为它能保持数据排序并提供快速的查找、插入和删除操作。这种数据结构的特点是所有数据都在叶子节点,非叶子节点只...
【B树、B+树和B*树:数据结构中的高效索引技术】 在计算机科学中,数据结构的选择对算法的效率至关重要。特别是在处理大规模数据时,如何有效地存储和检索信息是一个关键问题。B树(B-tree)、B+树(B+tree)和B*树...
B树、B-树、B+树和B*树是数据库和文件系统中常见的数据结构,主要用于高效地存储和检索大量数据。它们都是自平衡的多路搜索树,能够保持数据的有序性,并且在插入、删除和查找操作时保持较高的效率。 1. **B树**:B...
### 二叉树、B树、B+树、红黑树 #### 一、二叉树 二叉树是一种常见的树形数据结构,在计算机科学中应用广泛。它具有以下特点: - **节点最多有两个子节点**:即每个节点最多有一个左子节点和一个右子节点。 - **...