具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种一种树。而事实上是,B-tree就是指的B树。特此说明。
我们知道,B 树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。与本blog之前介绍的红黑树很相似,但在降低磁盘I/0操作方面要更好一些。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树,B*树来存储信息。
B树与红黑树最大的不同在于,B树的结点可以有许多子女,从几个到几千个。那为什么又说B树与红黑树很相似呢?因为与红黑树一样,一棵含n个结点的B树的高度也为O(lgn),但可能比一棵红黑树的高度小许多,应为它的分支因子比较大。所以,B树可以在O(logn)时间内,实现各种如插入(insert),删除(delete)等动态集合操作。
如下图所示,即是一棵B树,一棵关键字为英语中辅音字母的B树,现在要从树种查找字母R(包含n[x]个关键字的内结点x,x有n[x]+1]个子女(也就是说,一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子女)。所有的叶结点都处于相同的深度,带阴影的结点为查找字母R时要检查的结点)如图:
相信,从上图你能轻易的看到,一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子女。如含有2个关键字D H的内结点有3个子女,而含有3个关键字Q T X的内结点有4个子女。
B 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的特性如下:
1. 树中每个结点最多含有m个孩子(m>=2);
2. 除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);
3. 若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点)。
4. 所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null);(读者反馈@冷岳:这里有错,叶子节点只是没有孩子和指向孩子的指针,这些节点也存在,也有元素。@JULY:其实,关键是把什么当做叶子结点,因为如红黑树中,每一个NULL指针即当做叶子结点,只是没画出来而已)。
5. 每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
a) Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。
b)Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。
c) 关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。
一颗m阶的B树满足的条件
(1)每个结点至多有m个子结点;
(2)除根结点和叶结点外,其它每个结点至少有[m/2] 个子结点;
(3)若根结点不是叶子结点,则至少有两个子结点;
(4)所有的叶结点在同一层;
(5)有k个子结点的非根结点恰好包含k-1个关键码。
针对上面第5点,再阐述下:B树中每一个结点能包含的关键字(如之前上面的D H和Q T X)数有一个上界和下界。这个下界可以用一个称作B树的最小度数(算法导论中文版上译作度数,最小度数即内节点中节点最小孩子数目)t(t>=2)表示。
每个非根的结点必须至少含有t-1个关键字。每个非根的内结点至少有t个子女。如果树是非空的,则根结点至少包含一个关键字;
每个结点可包含之多2t-1个关键字。所以一个内结点至多可有2t个子女。如果一个结点恰好有2t-1个关键字,我们就说这个结点是满的(而稍后介绍的B*树作为B树的一种常用变形,B*树中要求每个内结点至少为2/3满,而不是像这里的B树所要求的至少半满);
当关键字数t=2(t=2的意思是,tmin=2,t可以>=2)时的B树是最简单的(有很多人会因此误认为B树就是二叉查找树,但二叉查找树就是二叉查找树,B树就是B树,B树的真正最准确的定义为:一棵含有t(t>=2)个关键字的平衡多路查找树)。每个内结点可能因此而含有2个、3个或4个子女,亦即一棵2-3-4树,然而在实际中,通常采用大得多的t值。
B树中的每个结点根据实际情况可以包含大量的关键字信息和分支(当然是不能超过磁盘块的大小,根据磁盘驱动(disk drives)的不同,一般块的大小在1k~4k左右);这样树的深度降低了,这就意味着查找一个元素只要很少结点从外存磁盘中读入内存,很快访问到要查找的数据。
B树的类型
#define m 1024
struct BTNode;
typedef struct BTNode *PBTNode;
struct BTNode {
int keyNum; //实际关键字个数,keyNum<m
PBTNode parent; //指向父节点
PBTNode *ptr; //子树指针向量:ptr
[0]...ptr[keyNum]
KeyType *key; //关键字向量:key[0]...key
[keyNum]
}
typedef struct PBTNode *BTree;
typedef BTree *PBTree;
节点定义如下图所示:
为了简单,这里用少量数据构造一棵3叉树的形式,实际应用中的B树结点中关键字很多的。上面的图中比如根结点,其中17比表示一个磁盘文件的文件名;小红方块表示这个17文件内容在硬盘中的存储位置;p1表示指向17左子树的指针。
其结构可以简单定义为:
typedef struct {
/*文件数*/
int file_num;
/*文件名(key)*/
char * file_name[max_file_num];
/*指向子节点的指针*/
BTNode * BTptr[max_file_num+1];
/*文件在硬盘中的存储位置*/
FILE_HARD_ADDR offset[max_file_num];
}BTNode;
假如每个盘块可以正好存放一个B树的结点(正好存放2个文件名)。那么一个BTNODE结点就代表一个盘块,而子树指针就是存放另外一个盘块的地址。
下面,咱们来模拟下查找文件29的过程:
1. 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作 1次】
2. 此时内存中有两个文件名17、35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。
3. 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作 2次】
4. 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发,26<29<30,因此我们找到指针p2。
5. 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作 3次】
6. 此时内存中有两个文件名28,29。根据算法我们查找到文,29,并定位了该文件内存的磁盘地址。
分析上面的过程,发现需要3次磁盘IO操作和3次内存查找操作。关于内存中的文件名查找,由于是一个有序表结构,可以利用折半查找提高效率。至于IO操作时影响整个B树查找效率的决定因素。
当然,如果我们使用平衡二叉树的磁盘存储结构来进行查找,磁盘4次,最多5次,而且文件越多,B树比平衡二叉树所用的磁盘IO操作次数将越少,效率也越高。
B树的高度
根据上面的例子我们可以看出,对于辅存做IO读的次数取决于B树的高度。而B树的高度由什么决定的呢?
根据B树的高度公式:
其中T为度数(每个节点包含的元素个数),即所谓的阶数,N为总元素个数或总关键字数。
我们可以看出T对于树的高度有决定性的影响。因此如果每个节点包含更多的元素个数,在元素个数相同的情况下,则更有可能减少B树的高度。这也是为什么SQL Server中需要尽量以窄键建立聚集索引。因为SQL Server中每个节点的大小为8092字节,如果减少键的大小,则可以容纳更多的元素,从而减少了B树的高度,提升了查询的性能。
上面B树高度的公式也可以进行推导得出,将每一层级的的元素个数加起来,比如度为T的节点,根为1个节点,第二层至少为2个节点,第三层至少为2t个节点,第四层至少为2t*t个节点。将所有最小节点相加,从而得到节点个数N的公式:
两边取对数,则可以得到树的高度公式。
这也就是说每个节点必须至少有两个子元素,因为根据高度公式,如果每个节点只有一个元素,也就是T=1的话,那么高度将会趋于正无穷。
- 大小: 28.4 KB
- 大小: 36.3 KB
- 大小: 3 KB
- 大小: 1.2 KB
分享到:
相关推荐
### B树第三节学习(插入与删除的思路与理论) #### 插入操作 在了解B树的插入操作之前,我们需要明确几个概念。B树是一种自平衡的搜索树,它的每一个节点都包含多个关键字以及指向子节点的指针。在B树中,节点的...
在学习数据结构的过程中,树是一种非常重要的非线性数据结构。本文将根据给定的文件信息,详细介绍树的定义、基本术语以及相关的知识点。 #### 树的定义 树(Tree)是n(n≥0)个节点的有限集。如果n=0,则称为空树;...
本套课件涵盖了从第1节到第21节的全面内容,旨在帮助学习者掌握数据结构的基本概念、原理以及实际应用。 1. **绪论**:在第1节中,通常会介绍数据结构的重要性,它是如何影响程序设计的,并简述常见的数据结构类型...
在八年级地理下册第七章第一节“自然特征与农业”中,我们探讨了我国南方地区的自然地理特性和其对农业生产的影响。南方地区位于秦岭淮河以南,青藏高原以东,东海和南海之间,跨越北回归线,包括众多的地形区,如A...
### 气象灾害学习课件知识点总结 #### 一、洪涝灾害 - **定义**: 因连续性降水或短时强降水导致江河水位上涨泛滥,或积水淹没低洼土地,造成财产损失和人员伤亡的灾害。 - **分布特征**: - **气候因素**: 主要分布...
以上就是关于八年级物理新人教版上册第一章第一节“运动的描述”的知识点详解,涵盖了物体运动的定义、参照物的选择、运动的相对性等多个方面。通过这些知识点的学习,学生能够理解物体运动的基本概念,并能运用到...
### 第4章 第7节 拓扑排序与关键路径(C++版) #### 引言 本章节将深入探讨拓扑排序与关键路径的概念及其在实际项目管理中的应用,并通过具体的例子来阐述如何利用C++语言实现这些算法。拓扑排序是一种针对有向无环...
标题中的“函数第二节1922一次函数.ppt”指的是一个关于数学中一次函数的课件,描述中没有提供具体信息,但从标签和部分内容来看,我们可以深入探讨一次函数的概念及其应用。 一次函数是数学中非常基础且重要的概念...
第一节包含5段对话,每段对话后一个选择题,考生有10秒时间回答并准备下一题。第二节包含更长的对话或独白,同样有时间阅读题目和作答。听力部分旨在测试学生理解口头英语的能力,涵盖日常对话、场景对话以及可能...
在高中数学的学习中,第1章第7节主要探讨了变量之间的相关性,这是统计学中的一个重要概念。相关性指的是两个或多个变量之间存在的某种关联性,这种关联可能表现为一个变量的变化会影响另一个变量的数值。在本节的...
通过小组讨论和自我检查,提高对知识的理解和记忆,并为下一节课的学习做好准备,如昆虫的生殖和发育。 **练习题解析** 1. A、用水稻的种子进行繁殖 - 属于有性生殖。 2. B、两个 - 扦插紫背天葵时,一般保留两个节...
第一题,病毒虽不是细胞,但其生命活动必须在细胞内进行,所以选项B“一个受精卵”是细胞层次;第二题,病毒没有细胞结构,必须寄生于细胞内繁殖,A选项正确;第三题,生命系统层次从简单到复杂依次是细胞、组织、...
- 题目4:A、B、C选项中描述了时刻与时间间隔的区别,D选项正确,第4秒末与第5秒初表示同一个时刻。 - 题目5:B选项正确,物体沿直线运动时,位移的大小等于路程;其他选项描述不准确。 通过以上内容,我们可以深入...
### 第1节 牛顿第一定律 第2课时 惯性及惯性现象 #### 知识点1:惯性 **惯性定义:** 物体保持原有运动状态不变的性质称为惯性。它是物体本身固有的属性,与物体的运动状态无关。 1. **惯性是物体的一种属性**...
总的来说,这份高一英语第一学期的第一次质量检测试题着重考察了学生的听力理解能力,这是英语学习中的基础技能之一。通过这样的检测,学生可以检验自己在实际语境中理解和应用英语的能力,同时也可以为之后的学习...
### 第1节 能源学习课件知识点解析 #### 知识点1:能源定义 - **能源**:指的是能够为生产和生活活动提供所需能量的各种物质。这些物质通过一定的技术手段转换成可用的能量形式,例如热能、电能等。 #### 知识点2...
- 听力第一节包含5段对话,每段对话后一个题目,考生需在听完对话后从A、B、C三个选项中选择最佳答案,只读一遍。 - 听力第二节包含5段对话或独白,每段后面有几个小题,同样需要在听完后快速作答,每段读两遍。 ...
树和二叉树是计算机科学中的一些重要概念,本节将从树的定义、树的路径长度、二叉树、哈夫曼树、哈夫曼编码等方面对树和二叉树进行详细的介绍和解释。 1. 树的定义 树是一种非线性的数据结构,它由节点和边组成,...
《2018年七年级生物上册第三单元第二章第二节植株的生长练习》是针对初一学生学习生物学知识的复习资料,主要探讨植物生长的过程和相关生理现象。本章内容聚焦在植物的根与茎的生长以及植物对无机盐的需求。 一、...