b树

【经典数据结构】B树与B+树

大城市里の小女人 提交于 2019-12-03 04:42:20
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画: B+ 树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。

B-Tree B树

匿名 (未验证) 提交于 2019-12-03 00:37:01
什么是B-Tree   B-Tree就是我们常说的B树,一定不要读成B减树,否则就很丢人了。B树这种数据结构常常用于实现数据库索引,因为它的查找效率比较高。 磁盘IO与预读 磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘IO的时间,大概9ms左右。这个成本是访问内存的十万倍左右;正是由于磁盘IO是非常昂贵的操作,所以计算机操作系统对此做了优化:预读;每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中。因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。 B-Tree与二叉查找树的对比   我们知道二叉查找树查询的时间复杂度是O(logN),查找速度最快和比较次数最少,既然性能已经如此优秀,但为什么实现索引是使用B-Tree而不是二叉查找树, 关键因素是 磁盘IO的次数 。 数据库索引是存储在磁盘上,当表中的数据量比较大时,索引的大小也跟着增长,达到几个G甚至更多。当我们利用索引进行查询的时候,不可能把索引全部加载到内存中,只能逐一加载每个磁盘页,这里的磁盘页就对应索引树的节点。 一、 二叉树

B树和B+树

匿名 (未验证) 提交于 2019-12-03 00:33:02
一、为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢? 这个要从几个方面来说了: (1)计算机有一个 局部性原理 ,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 (2)所以当你用 红黑树的时候,你一次只能得到一个键值的信息,而用B树,可以得到最多M-1个键值的信息 。这样来说B树当然更好了。 (3)另外一方面,同样的数据, 红黑树的阶数更大,B树更短 ,这样查找的时候当然B树更具有优势了,效率也就越高。 二、B树 对于B树,我们首先要知道它的应用,B树大量应用在数据库和文件系统当中。 B树是对二叉查找树的改进。 它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。 B树为系统最优化大块数据的读和写操作。B树算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。 假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,则需要20层!假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 B树的结构: 1. 根节点至少有两个子节点 ; 2. 每个节点有M-1个key,并且以升序排列 ; 3

DSAA补充之B树、B+树

匿名 (未验证) 提交于 2019-12-03 00:27:02
  以前记录的B树 DSAA之B-tree(六) ,这个定义真是有点四不像啊。是B+树的感觉,又没有底层的link。所以今天有必要重新审视下B树和B+树的概念。本文内容摘自 维基百科 。 According to Knuth’s definition, a B-tree of order m is a tree which satisfies the following properties: Every node has at most m children. 这个符号是向上取整的意思 The root has at least two children if it is not a leaf node. 非子叶节点包含k-1个关键字,k为该节点的子代数目 All leaves appear in the same level Each internal node’s keys act as separation values which divide its subtrees. For example, if an internal node has 3 child nodes (or subtrees) then it must have 2 keys: a1 and a2. All values in the leftmost subtree will be less

mysql索引原理及优化(二)

匿名 (未验证) 提交于 2019-12-02 22:02:20
索引原理分析:数据结构 索引是最常见的慢查询优化方式 其是一种优化查询的数据结构,MySql中的索引是用B+树实现,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,优化查询。 可以提高查询速度的数据结构: 哈希表、完全平衡二叉树、B树、B+树等等 哈希 不支持范围查询 。 完全平衡二叉树 :对于数据量大情况,它相比于哈希或者B树、B+树需要 查找次数更多 。 B树 :比完全平衡二叉树要矮,查询速度更快,所需索引空间更小。 B+树 :B+树比B树要胖,B+树的非叶子节点会冗余一份在叶子节点中,并且也在 叶子节点会用指针相连 。 B树相比完全平衡二叉树查询次数更少,即有更少的磁盘IO次数,性能更优; B+树是B树的升级版 ,其为了提高范围查找的效率。 总结:Mysql选用B+树这种数据结构作为索引, 可以提高查询索引时的磁盘IO效率,并且可以提高范围查询的效率,并且B+树里的元素也是有序的。 ac也走,但是只走a索引。 为什么哈希表、完全平衡二叉树、B树、B+树都可以优化查询,为何Mysql独独喜欢B+树? 哈希表有什么特点? 假如有这么一张表(表名: sanguo ): 现在对 name 字段建立哈希索引: select * from sanguo where name='周瑜' 可以直接对‘周瑜’按哈希算法算出来一个数组下标

B树和B+树画图详解

老子叫甜甜 提交于 2019-12-02 14:32:35
B树系列 文章目录 B树系列 1. B树 1. B树特点 2. B树的分裂过程:(插入) 3. B树的删除操作 2. B+树 1. B树和B+树的相同点: 2. B树和B+树的不同点 3. B+树的插入操作 3. B树和B+树总结⭐ 4. 搜索树总结 B树和B+树的出现是为了查询数据时减少磁盘的IO次数,我们知道平衡二叉查找树是一种查询速度很快的数据结构。它的时间复杂度为(logN),但是它由于是一个二叉树,所以树的高度相对于多叉树来讲是比较高的,所以为了平衡磁盘IO与时间复杂度直接的关系,我们引入了B树和B+树; 1. B树 上图为一个3-4树,或者叫4阶树,即一个节点最多存储3个key,一个节点最多有4个孩子(3+1); 在B树里,一个节点里面有多个key; 1. B树特点 每个节点最多有 m-1 个关键字(可以存有的键值对); 根节点最少可以只有一个关键字; 非根节点至少有m / 2 个关键字; 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它; 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同; 每个节点都存有索引和数据,也就是对应的key和value; 所以得到结论: 根节点的关键字数量范围: 1 <= k <= m-1; 非根节点的关键字数量范围: m/2 <= k <= m-1;

B树和B+树笔记

感情迁移 提交于 2019-12-02 10:46:23
B树和B+树都属于多叉平衡查找树,使得查询时间复杂度为O(logN)。 B树: 树结点:记录——关键字(数据库中的索引),关键字对应记录的指针,子节点的指针。 关键字:数据库中的索引,每个树结点记录的关键字个数大于1小于树的M。 关键字对应记录的指针:根据该指针数据库可以直接查询到该索引对应的数据库记录。 子节点的指针:根据该指针查询子节点,子节点的关键字大小位于父节点某两个关键字的中间。 B+树: 非叶子树结点:记录——关键字(数据库中的索引),子节点的指针, 不记录关键字对应的数据 。 叶子结点:记录——关键字(数据库中的索引),关键字对应的数据(聚簇索引:该索引对应的记录的指针;非聚簇索引:该索引对应的聚簇索引,并通过回表查询该聚簇索引对应的数据) 关键字:数据库中的索引,每个树结点记录的关键字个数大于1小于树的M。 子节点的指针:根据该指针查询子节点,子节点的关键字大小位于父节点某两个关键字的中间。 B树的优点:B树查询数据时,如果查询的数据离根节点很近,且树结点中记录了对应记录的指针,因此可以较为快速的获取该条数据,不用遍历到叶子结点。 B+树的优点:1.非叶子结点不记录索引对应的记录的指针,因此可以用更多空间用于存放索引记录,降低了树的高度,可以快速的进行查询。        2.所有关键字的数据都记录在叶子结点,因此查询速度稳定(都需要遍历到叶子)。 3

B树Java代码实现以及测试

随声附和 提交于 2019-12-02 07:29:35
  B树Java实现方式: /** * 一颗B树的简单实现。 * * @param <K> - 键类型 * @param <V> - 值类型 */ @SuppressWarnings("all") public class BTree<K, V> { private static Log logger = LogFactory.getLog(BTree.class); /** * B树节点中的键值对。 * <p/> * B树的节点中存储的是键值对。 * 通过键访问值。 * * @param <K> - 键类型 * @param <V> - 值类型 */ private static class Entry<K, V> { private K key; private V value; public Entry(K k, V v) { this.key = k; this.value = v; } public K getKey() { return key; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } @Override public String toString() { return key + ":" + value; } } /**

多路查找树

别说谁变了你拦得住时间么 提交于 2019-12-02 05:04:46
多路查找树(muitl-way search tree) ,其每一个节点的孩子数可以多于两个,且每一个节点处可以存储多个元素。主要有4中特殊形式。 一、2-3树 定义:其中的每一个节点都具有两个孩子(称为2节点)或者三个孩子(称为3节点)。 并且2-3树中所有的叶子都在同一层上。 一个2节点包含一个元素和两个孩子(或者没有孩子)。 一个3节点包含一小一大两个元素和三个孩子(或者没有孩子)。 1. 2-3树的插入实现 1)对于空树,插入一个2节点即可; 2)插入节点到一个2节点的叶子上。由于本身就只有一个元素,所以只需要将其升级为3节点即可。 3)插入节点到一个3节点的叶子上。因为3节点本身最大容量,因此需要拆分,且将树中两元素或者插入元素的三者中选择其一向上移动一层。 三种情况: 升级父节点 升级根节点 增加树高度 2. 2-3树的删除实现 1)所删元素位于一个3节点的叶子节点上,直接删除,不会影响树结构。 2)所删元素位于一个2节点上,直接删除,破坏树结构。 分为四种情况: 此节点双亲也是2节点,且拥有一个3节点的右孩子; 此节点的双亲是2节点,它右孩子也是2节点; 此节点的双亲是3节点; 当前树是一个满二叉树,降低树高; 3)所删元素位于非叶子的分支节点。此时按树中序遍历得到此元素的前驱或后续元素,补位。 分支节点是2节点 分支节点是3节点 二、2-3-4树 2-3-4树是2