b树

B树、B+树、B-树

早过忘川 提交于 2019-12-01 20:46:21
1、多路查找树(mutil-way search tree)定义 多路查找树,其每一个节点的孩子数可以多于两个,且每一个节点处可以存储多个元素。 由于它是查找树,所以元素之间存在某种特定的排序关系。由于多路查找树的定义(特点):每个节点可以有多个孩子;每个节点可以存储多个元素。所有它有很多特殊形式:2-3树、2-3-4树、B树、B+树、B-树。 2、 B树(B-Tree即B-树): B树是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。节点最大的孩子数目称为B树的阶(Order)。2-3树是3阶B树,2-3-4树是4阶B树。 m阶B树具有如下属性: 如果根节点不是叶节点,则其至少有两颗子树。 所有叶子节点都位于同一层。 每个非根的分支节点都至少有k-1个元素和k个孩子,其中ceil(m/2)<=k<=m。ceil(m/2)是m/2向上取整。每一个叶子节点都至少有k-1个元素。 每个非终端结点中包含有n个关键字信息: (n,A0,K1,A1,K2,A2,......,Kn,An)。其中: a) Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。 b) Ai为指向子树根节点的指针,且指针A(i-1)指向子树中所有结点的关键字均小于Ki,但都大于K(i-1)。 c) 关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1 3

Mysql中的索引

末鹿安然 提交于 2019-12-01 17:13:19
1,什么是索引,为什么要使用索引? 索引是帮助Mysql高效获取数据的排好序的数据结构。建立索引可以帮助我们快速检索我们需要的信息,减少磁盘的I/O次数,加快检索速度。索引的数据结构包括:二叉树,红黑树,Hash表,B-树等。 2,数据查询的方式 二叉查找树的方式查找信息 普通情况下,在一个二叉树中查找到5非常快速。只需要2步,但在某些极端情况下,如对于顺序插入信息的二叉树,查找到我们需要的信息就非常麻烦了。 红黑树 红黑树是一种 自平衡二叉查找树 ,就是会自动平衡更新根节点和其它节点的位置,也就是说根节点和其它节点的位置是不固定,会根据插入的信息进行动态改变的。 按照1~5的顺序插入数据后,会重新排列分支节点的位置。 对于少量数据使用红黑树是完全可以的,但是一个项目的数据库中存储的数据都是10万条以上,再使用红黑树,树的度又会变得很大了。这个时候就可以使用B 树了。 B 树 B树是一种 多路自平衡搜索树 ,它是一种特殊的平衡二叉树,但是B书允许每个节点有更多的子节点。B树示意图如下: B树的特点: (1)所有键值分布在整个树中(2)任何关键字出现且只出现在一个节点中 (3)搜索有可能在非叶子节点结束(4)在关键字全集内做一次查找,性能逼近二分查找算法 比如我们想要找到主键为28的数据,过程如下: 1,根据根节点找到磁盘块1,进行一次I/O(磁盘的输入和输出)操作; 2

B树,B+树,B*树

六月ゝ 毕业季﹏ 提交于 2019-12-01 09:36:36
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

C++实现的B树

允我心安 提交于 2019-11-30 19:39:15
参考资料:按第一个参考资料构建,代码基本上来自于第二个参考资料 https://www.cnblogs.com/guohai-stronger/p/9225057.html https://www.cnblogs.com/newhand-liu/archive/2012/04/20/2793288.html #include <iostream> using namespace std; static const int M=5; //阶 static const int KEY_MAX=M-1; //每个节点最多含有2个关键字 static const int KEY_MIN=2; //每个节点至少有1个关键字 static const int CHILD_MAX=KEY_MAX+1; //子 static const int CHILD_MIN=KEY_MIN+1; template<class T> struct Node { bool isLeaf; int keyNum; T keyValue[KEY_MAX+1]; Node<T>* pChild[CHILD_MAX+1]; }; template<class T> class BTree{ public: BTree(T a[],int n); void Insert(T data); bool Contain(T

索引数据结构 B+树等

人盡茶涼 提交于 2019-11-30 16:53:52
本文将详细介绍数据结构中的一些常用的搜索树结构,包括:B树、B-树、B+树、B*树;分别介绍这些树结构的定义、特征、搜索方法、性能等情况,最后给出了一个简要的总结。 一、 B 树 B树即二叉搜索树,它的特征是: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 一颗典型的B树图如下所示: B 树的搜索: 从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; B 树的性能: 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销,如下图所示: 但B树在经过多次插入与删除后,有可能导致不同的结构,如下图: 右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”

B树和B+树

ぃ、小莉子 提交于 2019-11-30 16:46:43
B树和B+树 标签(空格分隔): 数据结构 参考/转载 : https://www.cnblogs.com/nullzx 1. B树 1.1 B树的定义 B树也称为B-树, 它是一颗多路平衡的查找树, 当我们描述一颗B树的时候需要指定他的阶数, 阶数表示了一个节点最多有多少个孩子节点, 一般用 m 表示. 当 m 取2的时候, 就是我们常见的二叉搜索树. 一颗 m 阶的B树定义如下: 每个节点最多有m-1个关键字. 根节点最少有1个关键字. 非根节点最少有Math.ceil(m/2)-1个关键字. 每个根节点中的关键字都按照从小到大的顺序排列, 每个关键字的左子树中的所有关键字都小于它, 而右子树中的所有关键字节点都大于它. 所有叶子节点都位于同一层, 或者说根节点到每个叶子节点的长度都相同. 上图是一个阶数为4的B树, 在实际应用中的B树的阶数都非常大(通常大于100), 所以即使存储大量的数据, B树的高度依然会比较小, 每个节点中存储了关键字(Key)和关键字对应的数据(data), 以及孩子节点的指针. 我们将一个key何其对应的data成为一个记录, 但为了方便描述, 除非特别说明, 后续文中就采用key来代替(key,value)键值对这个整体. 在数据库中我们将B树(和B+树)作为索引结构, 可以加快查询速度, 此时B树中的key就代表键,

数据结构 B树

为君一笑 提交于 2019-11-30 06:17:11
B树 tips:floor向上取整 B树的定义 B树,又称多路平衡查找树, B树中所有结点孩子结点数的最大值称为B树的阶 ,通常用m表示。 一棵m阶B树或者空树,或为满足以下条件的m叉树: 树中每个结点最多有m棵子树(即最多有m-1个关键字) 若根节点不是终端结点,那么最少有两颗子树 除根节点之外的所有非叶结点至少有floor[m/2]棵子树(即最少有floor[m/2] - 1个关键字) B树的高度 若n≥1,则对任意一棵包含n个关键字,高度为h,阶数为m的B树 因为B树每个结点最多有m 棵子树,m-1个关键字,所以在一棵高度为h的m阶B树中关键字的个数应该满足 ,因此有 ​ 若让每个结点中的关键字个数达到最少,则容纳同样多关键字的B树高度达到最大。由B树的定义可知,第一层至少有1个结点;第二层至少有2个结点,除了根节点之外的所有非叶结点至少有floor[m/2]棵子树,第三层至少有2*floor[m/2]个节点,以此类推,注意到第h+1层节点是不包含任何信息的叶节点。对于关键字个数为n的B树,叶节点即查找不成功的节点为n+1,因此有 ,即 ​ 来源: https://www.cnblogs.com/masterchd/p/11566882.html

面试官问你B树和B+树,就把这篇文章丢给他

南笙酒味 提交于 2019-11-30 04:21:39
  1 B树      在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。      1.1 B树概念      B树也称B-树,它是一颗多路平衡查找树。二叉树我想大家都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。      每个节点最多有m-1个关键字(可以存有的键值对)。      根节点最少可以只有1个关键字。      非根节点至少有m/2个关键字。      每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。      所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。      每个节点都存有索引和数据,也就是对应的key和value。      所以,根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m/2 <= k <= m-1。      另外,我们需要注意一个概念,描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母m表示阶数。      我们再举个例子来说明一下上面的概念,比如这里有一个5阶的B树,根节点数量范围:1 <= k <= 4,非根节点数量范围:2 <= k <

MySQL的B树索引与索引优化

若如初见. 提交于 2019-11-30 04:18:14
选自:https://www.cnblogs.com/lfs2640666960/p/8550452.html MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引结构,理解常见的MySQL索引优化思路? 为什么索引无法全部装入内存 索引结构的选择基于这样一个性质:大数据量时,索引无法全部装入内存。 为什么索引无法全部装入内存?假设使用树结构组织索引,简单估算一下: 假设单个索引节点12B,1000w个数据行,unique索引,则叶子节点共占约100MB,整棵树最多200MB。 假设一行数据占用200B,则数据共占约2G。 假设索引存储在内存中。也就是说,每在物理盘上保存2G的数据,就要占用200MB的内存, 索引:数据的占用比 约为1/10 。1/10的占用比算不算大呢?物理盘比内存廉价的多,以一台内存16G硬盘1T的服务器为例, 如果要存满1T的硬盘,至少需要100G的内存 ,远大于16G。 考虑到一个表上可能有多个索引、联合索引、数据行占用更小等情况,实际的占用比通常大于1/10,某些时候能达到1/3。在基于索引的存储架构中, 索引:数据的占用比 过高,因此,索引无法全部装入内存。 其他结构的问题 由于无法装入内存,则必然依赖磁盘(或SSD)存储

面试官问你B树和B+树,就把这篇文章丢给他

杀马特。学长 韩版系。学妹 提交于 2019-11-29 23:49:21
原文链接: 面试官问你B树和B+树,就把这篇文章丢给他 1 B树 在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。 1.1 B树概念 B树也称B-树,它是一颗多路平衡查找树。二叉树我想大家都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。 每个节点最多有m-1个 关键字 (可以存有的键值对)。 根节点最少可以只有1个 关键字 。 非根节点至少有m/2个 关键字 。 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。 每个节点都存有索引和数据,也就是对应的key和value。 所以,根节点的 关键字 数量范围: 1 <= k <= m-1 ,非根节点的 关键字 数量范围: m/2 <= k <= m-1 。 另外,我们需要注意一个概念,描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母m表示阶数。 我们再举个例子来说明一下上面的概念,比如这里有一个5阶的B树,根节点数量范围:1 <= k <= 4,非根节点数量范围:2 <= k <= 4。 下面,我们通过一个插入的例子