[C++]数据结构:从m叉搜索树谈到B-树的结构特点、阶数、高度、元素个数之间的关系
2012-12-30 00:58
531 查看
在介绍一下B-树之前,我们先来介绍一下m叉搜索树的概念。
m叉搜索树必须满足以下结构特点:
1)在对应的扩充搜索树(用外部节点代替零指针),每个内部节点最多可以有m个子女即m-1个元素。
2)每个含有p个元素的节点有p+1个子女。
3)考察含有p个元素的任意节点,
设k1……kp是这些元素的关键值。
这些元素按顺序排列,即k1<k2<k3……<kp。
设c0……cp是节点的p+1个孩子。
以c0为根的子树中的元素关键值均小于k1,以cp为根的子树中的元素关键值均大于kp,以ci为根的子树中的元素关键值均大于k
i小于k
i+1 。
下图给出了一棵七叉搜索树。
黑色方块标注了外部节点,其他所有节点都是内部节点。
先看这个头结点,包含了两个元素和三个子女:
两个元素的关键值分别为10和80,
三个子女的元素个数分别为1、6、4,孩子个数依次加一,为2,7,5。
接下来简单的介绍一下m叉搜索树的搜索,插入,删除等操作。
1.搜索。
搜索操作其实非常简单,从根节点开始,如果要搜索的元素在根节点的某两个连续的元素之间的话,
就沿着它们中间的指针往下搜索。
如果遇到节点元素的关键值和搜索值相等,则说明搜索成功。
举例:搜索38元素
如果没有出现相等的情况,也就是出现了外部节点的情况,掉到了树的外部,则说明不存在这个元素。
举例:搜索35
2.插入。
插入操作可以紧接在搜索操作后面进行。
接着上面搜索操作来说,当搜索完毕发现到达了外部节点也就是没有搜索到相应的元素的时候,查看该节点的状况以便进行下一步操作。
第一种情况,该节点尚未达到最大容纳数目:可以按照顺序插入在适当的位置。
举个栗子,插入35元素。
第二种情况,该节点的元素数目已经达到了上限,所以必须产生一个新的节点,作为该节点的孩子出现。
举个例子,插入65元素。
3.删除。
删除操作基本可以分为两步,先将其搜索出来对应的节点位置,然后再将该元素从树中移除。
而移除操作分两种。
一种是删除节点的左右子树均为0,那么直接将该元素移除即可。
比如要删除元素84:
第二种是删除的元素的左右子女至少有一个是非零的,因此需要从非空相邻子树找一个元素进行替换。
先看下面这个栗子。需要删除的元素是元素5。我们先找到了这个元素并且进行了删除操作,
但是此时该节点为空,我们需要一个替补选手顶替该元素的位置。但是2、3、4选谁比较合适呢?
显然2,3是不合适的,因为m叉搜索树必须满足节点元素大于左子树的所有节点的元素小于右子树的所有节点的元素的结构性质。
所以我们将左子树中的最右节点:4,移上来到了被删除元素的位置。
下面来总结一下m叉搜索树的删除操作:
如果非空子树是左子树,则将左子树中的最大值移上来替换原来的元素。
如果非空子树是右子树,则将右子树中的最小值移上来替换原来的元素。
如果左右子树均非空,则两种替换方案均可。
删除之后的移位替补操作能够保证删除操作之后依旧保持搜索树的结构特征。
4.高度。
一棵高度为h的m叉搜索树至少有h个元素,即每层一个节点,每个节点一个元素。
上限取于这种情况:从1到h-1层每个节点都含有m个孩子并且第h层的节点没有孩子(只有外部节点)。
对每层的节点数目进行求和,于是最大的节点数目为:
再算上每个节点最多有m-1个元素,所以高度为h的m叉搜索树的元素个数最多为:
至此,m叉搜索树就介绍到这里。
那么m序B-树是什么呢?
我们先来谈谈m序B-树的结构特点。
如果一棵m序B-树非空,那么相应的扩充树满足以下特征:
1)根节点至少有2个孩子。
2)除根节点外,所有的内部节点至少有「m/2]个孩子。
3)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
那么下面这个栗子显然就不符合B-树的条件,因为它的所有外部节点不在同一层:
那如果他的所有节点都在同一层那么它是B-树吗?
还是不行,因为根据第二个性质,他的非根内部节点【5】只有2个孩子,内部节点【32,38】只有3个孩子。
而七序B-树至少有【7/2】=4个孩子。
显然这棵树就被排除在m序B-树的行列了。
那么什么才是真正的m-序B-树呢?
千呼万唤始出来,我们来举一个七序B-树的图:
我们先从最简单的m序B-树(二序B-树)说起。
在一棵二序B-树中,没有哪个内部节点会有2个以上的孩子(即最多两个孩子)。
而同时每个内部节点至少有2个子女(如果少于2个子女则不是内部节点),
所以一棵二序B-树的所有内部节点都刚好有2个孩子。
这一点加上所有外部节点都在同一层上的结构特点表示二序B-树其实是一棵满二叉树。
换句话说,一棵二序B-树的元素个数必定为2的整数次方-1。
而在一棵三序B-树中,内部节点既可以有2个孩子也可以有3个孩子。
因此也把三序B-树称作2-3树。
下图是一个三序B-树的例子。当然你也可以称它为2-3树。
下面我们来谈谈B-树的阶数、高度、key个数之间的关系。
B-树的阶数就是m的值,也就是最多含有的子女数目。
比如3序B-树,阶数就为3,每个非根节点的最大子女数目为m。
B-树的高度就是从树最下面的节点到树的根节点所经过的路径节数。
key个数就是树中的元素个数。
为了便于表示,我们设:
d=[m/2](上取整);
n为树中的元素个数;
h是树的高度;
m为树的阶数。
则有以下关系成立:
下面我们就先来证明一下第一条关系。
首先,先证明n的上限。
由定义知m序B-树源于m叉搜索树,
所以满足结构特点:在对应的扩充搜索树(用外部节点代替零指针),每个内部节点最多可以有m个子女及m-1个元素。
上面我们已经得出了结论,这样一棵树最多的元素数目为:
下面来证明下限的情况。
注意到m序B-树的所有外部节点均在h+1层,根节点至少有两个孩子,所以每层的节点最小数目依次为为:
因此外部节点的最小数目为:
由于外部节点的数量始终比元素的个数多1,因此有以下不等式成立:
第二条的关系直接可由第一条得到。
总结一下B-树的阶数m、高度h、元素个数n之间的关系:
m叉搜索树必须满足以下结构特点:
1)在对应的扩充搜索树(用外部节点代替零指针),每个内部节点最多可以有m个子女即m-1个元素。
2)每个含有p个元素的节点有p+1个子女。
3)考察含有p个元素的任意节点,
设k1……kp是这些元素的关键值。
这些元素按顺序排列,即k1<k2<k3……<kp。
设c0……cp是节点的p+1个孩子。
以c0为根的子树中的元素关键值均小于k1,以cp为根的子树中的元素关键值均大于kp,以ci为根的子树中的元素关键值均大于k
i小于k
i+1 。
下图给出了一棵七叉搜索树。
黑色方块标注了外部节点,其他所有节点都是内部节点。
先看这个头结点,包含了两个元素和三个子女:
两个元素的关键值分别为10和80,
三个子女的元素个数分别为1、6、4,孩子个数依次加一,为2,7,5。
接下来简单的介绍一下m叉搜索树的搜索,插入,删除等操作。
1.搜索。
搜索操作其实非常简单,从根节点开始,如果要搜索的元素在根节点的某两个连续的元素之间的话,
就沿着它们中间的指针往下搜索。
如果遇到节点元素的关键值和搜索值相等,则说明搜索成功。
举例:搜索38元素
如果没有出现相等的情况,也就是出现了外部节点的情况,掉到了树的外部,则说明不存在这个元素。
举例:搜索35
2.插入。
插入操作可以紧接在搜索操作后面进行。
接着上面搜索操作来说,当搜索完毕发现到达了外部节点也就是没有搜索到相应的元素的时候,查看该节点的状况以便进行下一步操作。
第一种情况,该节点尚未达到最大容纳数目:可以按照顺序插入在适当的位置。
举个栗子,插入35元素。
第二种情况,该节点的元素数目已经达到了上限,所以必须产生一个新的节点,作为该节点的孩子出现。
举个例子,插入65元素。
3.删除。
删除操作基本可以分为两步,先将其搜索出来对应的节点位置,然后再将该元素从树中移除。
而移除操作分两种。
一种是删除节点的左右子树均为0,那么直接将该元素移除即可。
比如要删除元素84:
第二种是删除的元素的左右子女至少有一个是非零的,因此需要从非空相邻子树找一个元素进行替换。
先看下面这个栗子。需要删除的元素是元素5。我们先找到了这个元素并且进行了删除操作,
但是此时该节点为空,我们需要一个替补选手顶替该元素的位置。但是2、3、4选谁比较合适呢?
显然2,3是不合适的,因为m叉搜索树必须满足节点元素大于左子树的所有节点的元素小于右子树的所有节点的元素的结构性质。
所以我们将左子树中的最右节点:4,移上来到了被删除元素的位置。
下面来总结一下m叉搜索树的删除操作:
如果非空子树是左子树,则将左子树中的最大值移上来替换原来的元素。
如果非空子树是右子树,则将右子树中的最小值移上来替换原来的元素。
如果左右子树均非空,则两种替换方案均可。
删除之后的移位替补操作能够保证删除操作之后依旧保持搜索树的结构特征。
4.高度。
一棵高度为h的m叉搜索树至少有h个元素,即每层一个节点,每个节点一个元素。
上限取于这种情况:从1到h-1层每个节点都含有m个孩子并且第h层的节点没有孩子(只有外部节点)。
对每层的节点数目进行求和,于是最大的节点数目为:
再算上每个节点最多有m-1个元素,所以高度为h的m叉搜索树的元素个数最多为:
至此,m叉搜索树就介绍到这里。
那么m序B-树是什么呢?
我们先来谈谈m序B-树的结构特点。
如果一棵m序B-树非空,那么相应的扩充树满足以下特征:
1)根节点至少有2个孩子。
2)除根节点外,所有的内部节点至少有「m/2]个孩子。
3)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
那么下面这个栗子显然就不符合B-树的条件,因为它的所有外部节点不在同一层:
那如果他的所有节点都在同一层那么它是B-树吗?
还是不行,因为根据第二个性质,他的非根内部节点【5】只有2个孩子,内部节点【32,38】只有3个孩子。
而七序B-树至少有【7/2】=4个孩子。
显然这棵树就被排除在m序B-树的行列了。
那么什么才是真正的m-序B-树呢?
千呼万唤始出来,我们来举一个七序B-树的图:
我们先从最简单的m序B-树(二序B-树)说起。
在一棵二序B-树中,没有哪个内部节点会有2个以上的孩子(即最多两个孩子)。
而同时每个内部节点至少有2个子女(如果少于2个子女则不是内部节点),
所以一棵二序B-树的所有内部节点都刚好有2个孩子。
这一点加上所有外部节点都在同一层上的结构特点表示二序B-树其实是一棵满二叉树。
换句话说,一棵二序B-树的元素个数必定为2的整数次方-1。
而在一棵三序B-树中,内部节点既可以有2个孩子也可以有3个孩子。
因此也把三序B-树称作2-3树。
下图是一个三序B-树的例子。当然你也可以称它为2-3树。
下面我们来谈谈B-树的阶数、高度、key个数之间的关系。
B-树的阶数就是m的值,也就是最多含有的子女数目。
比如3序B-树,阶数就为3,每个非根节点的最大子女数目为m。
B-树的高度就是从树最下面的节点到树的根节点所经过的路径节数。
key个数就是树中的元素个数。
为了便于表示,我们设:
d=[m/2](上取整);
n为树中的元素个数;
h是树的高度;
m为树的阶数。
则有以下关系成立:
下面我们就先来证明一下第一条关系。
首先,先证明n的上限。
由定义知m序B-树源于m叉搜索树,
所以满足结构特点:在对应的扩充搜索树(用外部节点代替零指针),每个内部节点最多可以有m个子女及m-1个元素。
上面我们已经得出了结论,这样一棵树最多的元素数目为:
下面来证明下限的情况。
注意到m序B-树的所有外部节点均在h+1层,根节点至少有两个孩子,所以每层的节点最小数目依次为为:
因此外部节点的最小数目为:
由于外部节点的数量始终比元素的个数多1,因此有以下不等式成立:
第二条的关系直接可由第一条得到。
总结一下B-树的阶数m、高度h、元素个数n之间的关系:
相关文章推荐
- C++ 与 C#数据结构类型对应关系表
- [C++]数据结构:平衡的二叉搜索树之AVL树的结构特点与基础插入删除操作
- <java EE 项目:Musicstore>项目结构分析: 项目的3层结构之间的关系 :(表示层,业务层,数据层)
- C++与QML文档之间传复杂数据结构(如结构体)
- C++与QML文档之间传复杂数据结构(如结构体)
- C++和C#之间的数据类型对应关系
- 数据结构与算法之间的关系
- ffmpeg主要数据结构及其之间的关系
- 插入算法 二分搜索 读数据结构与算法-C++
- ffmpeg主要数据结构及其之间的关系
- Flex 和C++ 之间传输结构体数据--用XML传输
- ffmpeg主要数据结构及其之间的关系
- siebel学习笔记-数据结构层次,BC之间的关系
- C++ 与 C#数据结构类型对应关系表 (转)
- linux源码-TCP/IP协议栈学习预备(1) 数据结构之各socket之间的关系
- C++数据类型和C#的部分对应关系 API与C#数据结构类型对应关系表
- [C++]数据结构:线性表的公式化描述和链式描述的结构特点与基本操作
- 数据结构实现以较高的效率实现删除线性表中元素值在x到y(x和y自定)之间的所有元素。
- C++ 与 C#数据结构类型对应关系表
- ffmpeg主要数据结构及其之间的关系