十三、数据结构---B+树
来源:互联网 发布:淘宝美工的电脑配置 编辑:程序博客网 时间:2024/05/24 23:12
十四、数据结构---B+树
一、B-树
1、什么是B-树
具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-tree,其实,这是个非常不好的直译,很容易让人产生误解。如人们很可能会以为B-树是一种树而B树又是另一种树。而事实上是,B-tree就是指的B树。
我们知道,B树是为了磁盘或其他存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。与红黑树很相似,但在降低磁盘I/O操作方面要更好一些。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树存储信息。
2、B-树概念(用阶定义B树)
是一种多路搜索树(并不是二叉的),又叫平衡多路查找树。一棵m阶的B树的特性如下:
a、定义任意非叶子结点最多只有M个儿子;且M>=2;
b、根节点的儿子数为[2,M](此时的根结点不是叶子结点);
c、除根结点以外的非叶子结点的儿子数为[M/2,M];
d、有j个孩子的非叶结点恰好有j-1个关键字,关键字按递增顺序排列。
e、非叶子结点的关键字个数n必须满足: [ceil(M / 2)-1]<= n <= M-1;(其中ceil(x)是一个取上限的函数)
f、非叶子结点的关键字:K[1],K[2],...,K[M-1];且K[i] < K[i+1];
g、非叶子结点的指针:P[1],P[2],...,P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树;
h、所有的叶子结点位于同一层,叶子结点不包含任何关键字信息
一棵含有N个总关键字数的m阶的B树的最大高度是多少?
答:若B树包含N个关键字,则次非叶子结点包含有N-1个孩子结点,而所有的叶子结点都在第i层,我们可以得出:
1、因为根至少有两个孩子,因此第2层至少两个结点
2、除根和叶子外,其他结点至少┌m/2┐个孩子
3、因此在第3层至少有2*┌m/2┐个结点
4、在第4层至少有2*(┌m/2┐^2)个结点
5、在第i层至少有2*(┌m/2┐^(i-2))个结点,
于是有: N+1 ≥ 2*(┌m/2┐^(i-2))
考虑第i层的结点个数为N+1,那么2*(┌m/2┐^(i-2)) ≤ N+1,也就是i层的最少结点数刚好达到N+1个,
即: i ≤ log┌m/2┐((N+1)/2)+2;
所以,当B树包含N个关键字时,B树的最大高度为i-1(因为计算B树高度时,叶结点所在层不计算在内),
即: i-1 ≤ log┌m/2┐((N+1)/2)+1;(log_ceil(m/2)(N+1)/2+1)
ceil:返回不小于(m/2)的下一个整数。
3、插入操作
插入一个元素时,首先在B树中是否存在,如果不存在,即在叶子结点处结束,然后在叶子结点中插入该新的元素,注意:如果叶子结点空间足够,这里需要向右移动叶子结点中大于新插入关键字的元素,如果空间满了以致没有足够的空间去添加新的元素,则将该结点进行"分裂",将一半数量的元素分裂到新的其相邻右节点中,中间关键字元素上移到父结点中(当然,如果父结点空间满了,也同样需要"分裂"操作),而且当结点中关键元素向右移动了,相关的指针也需要向右移。如果在根结点插入新元素,空间满了,则进行分裂操作,这样原来的根结点中的关键字元素向上移动到新的根结点中,因此导致树的高度增加一层。
B-树的特性:
1、关键字集合分布在整颗树中;
2、任何一个关键字出现且只出现在一个结点中;
3、搜索有可能在非叶子结点结束;
4、其搜索性能等价于在关键字全集内做一次二分查找;
5、自动层次控制;
二、B+树
B+树是B-树的变体,也是一种多路搜索树:
a、任意非叶子节点最多有M个子节点;且M>2;
b、除根结点以外的非叶子结点至少有M/2个子节点;
c、根结点至少有两个子节点;
d、除根结点外每个结点存放至少M/2和至多M个关键字;(至少2个关键字)
e、非叶子结点的子树指针与关键字个数相同;
f、所有结点的关键字:K[1],K[2],...K[M];且K[i] < K[i+1];
g、非叶子结点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树;
h、所有叶子结点位于同一层;
i、为所有叶子结点增加一个链指针;
j、所有关键字都在叶子结点出现;
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;
三、B+树的查找
对B+树可以进行两种查找运算:
1.从最小关键字起顺序查找;
2.从根节点开始,进行随机查找。
在查找时,若非终端结点上的关键值等于给定值,并不终止,而是继续向下直到叶子结点。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。
四、总结
B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
一、B-树
1、什么是B-树
具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-tree,其实,这是个非常不好的直译,很容易让人产生误解。如人们很可能会以为B-树是一种树而B树又是另一种树。而事实上是,B-tree就是指的B树。
我们知道,B树是为了磁盘或其他存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。与红黑树很相似,但在降低磁盘I/O操作方面要更好一些。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树存储信息。
2、B-树概念(用阶定义B树)
是一种多路搜索树(并不是二叉的),又叫平衡多路查找树。一棵m阶的B树的特性如下:
a、定义任意非叶子结点最多只有M个儿子;且M>=2;
b、根节点的儿子数为[2,M](此时的根结点不是叶子结点);
c、除根结点以外的非叶子结点的儿子数为[M/2,M];
d、有j个孩子的非叶结点恰好有j-1个关键字,关键字按递增顺序排列。
e、非叶子结点的关键字个数n必须满足: [ceil(M / 2)-1]<= n <= M-1;(其中ceil(x)是一个取上限的函数)
f、非叶子结点的关键字:K[1],K[2],...,K[M-1];且K[i] < K[i+1];
g、非叶子结点的指针:P[1],P[2],...,P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树;
h、所有的叶子结点位于同一层,叶子结点不包含任何关键字信息
一棵含有N个总关键字数的m阶的B树的最大高度是多少?
答:若B树包含N个关键字,则次非叶子结点包含有N-1个孩子结点,而所有的叶子结点都在第i层,我们可以得出:
1、因为根至少有两个孩子,因此第2层至少两个结点
2、除根和叶子外,其他结点至少┌m/2┐个孩子
3、因此在第3层至少有2*┌m/2┐个结点
4、在第4层至少有2*(┌m/2┐^2)个结点
5、在第i层至少有2*(┌m/2┐^(i-2))个结点,
于是有: N+1 ≥ 2*(┌m/2┐^(i-2))
考虑第i层的结点个数为N+1,那么2*(┌m/2┐^(i-2)) ≤ N+1,也就是i层的最少结点数刚好达到N+1个,
即: i ≤ log┌m/2┐((N+1)/2)+2;
所以,当B树包含N个关键字时,B树的最大高度为i-1(因为计算B树高度时,叶结点所在层不计算在内),
即: i-1 ≤ log┌m/2┐((N+1)/2)+1;(log_ceil(m/2)(N+1)/2+1)
ceil:返回不小于(m/2)的下一个整数。
3、插入操作
插入一个元素时,首先在B树中是否存在,如果不存在,即在叶子结点处结束,然后在叶子结点中插入该新的元素,注意:如果叶子结点空间足够,这里需要向右移动叶子结点中大于新插入关键字的元素,如果空间满了以致没有足够的空间去添加新的元素,则将该结点进行"分裂",将一半数量的元素分裂到新的其相邻右节点中,中间关键字元素上移到父结点中(当然,如果父结点空间满了,也同样需要"分裂"操作),而且当结点中关键元素向右移动了,相关的指针也需要向右移。如果在根结点插入新元素,空间满了,则进行分裂操作,这样原来的根结点中的关键字元素向上移动到新的根结点中,因此导致树的高度增加一层。
B-树的特性:
1、关键字集合分布在整颗树中;
2、任何一个关键字出现且只出现在一个结点中;
3、搜索有可能在非叶子结点结束;
4、其搜索性能等价于在关键字全集内做一次二分查找;
5、自动层次控制;
二、B+树
B+树是B-树的变体,也是一种多路搜索树:
a、任意非叶子节点最多有M个子节点;且M>2;
b、除根结点以外的非叶子结点至少有M/2个子节点;
c、根结点至少有两个子节点;
d、除根结点外每个结点存放至少M/2和至多M个关键字;(至少2个关键字)
e、非叶子结点的子树指针与关键字个数相同;
f、所有结点的关键字:K[1],K[2],...K[M];且K[i] < K[i+1];
g、非叶子结点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树;
h、所有叶子结点位于同一层;
i、为所有叶子结点增加一个链指针;
j、所有关键字都在叶子结点出现;
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;
三、B+树的查找
对B+树可以进行两种查找运算:
1.从最小关键字起顺序查找;
2.从根节点开始,进行随机查找。
在查找时,若非终端结点上的关键值等于给定值,并不终止,而是继续向下直到叶子结点。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。
四、总结
B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
阅读全文
0 0
- 十三、数据结构---B+树
- 【数据结构】B树/B+树
- 数据结构--B 树、B+ 树、B* 树
- 数据结构:B树&B+树&B*树
- (C语言)二叉树实现(数据结构十三)
- 数据结构--B树
- 经典数据结构B+树
- 数据结构B-树
- 【数据结构】B树_BTree
- 数据结构B树
- 数据结构-B树实现
- 数据结构之B树
- B+树数据结构
- 高级数据结构B树
- 数据结构-----------B树
- 【数据结构】浅析B树
- 数据结构之B-树
- java数据结构----B树
- 20170709_简述DNS的工作原理
- MOOC清华《程序设计基础》第5章:数字旋转方阵的填充-算法二
- java的断点续传
- sizeof 计算类的实例化大小
- 定义一个只在堆(栈)上生成对象的类
- 十三、数据结构---B+树
- Codevs 1066 引水入城
- Spring MVC原理及配置
- 使用注册表脚本文件(REG)添加、修改或删除Windows注册表项和值
- Mac抓包软件Charles
- Java经典算法40例(三)
- 创建RDD
- 跟我学C语言(第四天)
- keras一些example代码理解