b树

B树,B+树,B*树学习笔记

五迷三道 提交于 2020-02-28 16:47:20
B B+ 这两种处理索引的数据结构的不同之处: 1. B树中同一键值不会出现多次,并且它有可能出现在叶结点,也有可能出现在非叶结点中.而B+树的键一定会出现在叶结点中,并且有可能在非叶结点中也有可能重复出现,以维持B+树的平衡. 2.因为B树键位置不定,且在整个树结构中只出现一次,虽然可以节省存储空间,但使得在插入、删除操作复杂度明显增加.B+树相比来说是一种较好的折中. 3.B树的查询效率与键在树中的位置有关,最大时间复杂度与B+树相同(在叶结点的时候),最小时间复杂度为1(在根结点的时候).而B+树的时候复杂度对某建成的树是固定的. 为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引? 1) B+-tree的磁盘读写代价更低 B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+ 树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+ 树多一次盘块查找时间

MySQL索引入门指北

萝らか妹 提交于 2020-02-28 16:11:49
自从两年前了解到的索引以来的,就一直想写一篇有关索引的文章。然而我是个拖延癌症患者,一拖就是两年,不愧是我。该篇文章算是自己的笔记,欢迎批评。 概述 索引是什么?很多书和文章都会使用图书的目录来类比。目录的目的就是用方便我们查找具体内容的位置,具体的章节的范围。与此类似,MySQL中索引的用途是帮助我们加速查询以及排序。 在InnoDB中的索引类型有哈希索引、B+树索引、全文索引。哈希索引在InnoDB中设计为自适应的,不展开讨论。在InnoDB1.12之后有了全文索引,也是应用倒排,还没踩过坑(据说不支持中文),有时间可以研究一下。 本篇主要讨论B+树索引。 B+树 学习MySQL的索引,必须得先了解其原理,否则很多问题将一头雾水。下文将讲述索引数据结构的原理,而不涉及其复杂的具体实现。 在谈B+树之前,不妨先思考,为什么索引能加快查询?为什么要用B+树作为索引而不用B树?哈希索引查询复杂度为O(1)为什么又不用哈希索引? BST和AVL 在了解B树和B+树之前,先了解一下二叉搜索树(BST)和平衡二叉树(AVL)。 在顺序存储结构中(如数组),最快的情况是第一个就是目标值,最坏的情况是最后一个是目标值,假设有n个元素,用大O标记法平均的时间复杂度为O(n)。 使用二叉搜索树可以有效的优化搜索时间。利用二叉搜索树的特性左子节点比父节点小、右子节点比父节点大

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

放肆的年华 提交于 2020-02-26 23:31:53
原文: 【经典数据结构】B树与B+树 本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对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

C#实现平衡多路查找树(B树)

自古美人都是妖i 提交于 2020-02-26 23:22:03
原文: C#实现平衡多路查找树(B树) 写在前面:搞了SQL Server时间也不短了,对B树的概念也算是比较了解。去网上搜也搜不到用C#或java实现的B树,干脆自己写一个。实现B树的过程中也对很多细节有了更深的了解。 简介 B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减少IO操作大量被应用。遗憾的是,他们并没有说明为什么取名为B树,但按照B树的性质来说B通常被解释为Balance。在国内通常有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。 一个典型的 B树如图1所示。 图1.一个典型的B树 符合如下特征的树才可以称为B树: 根节点如果不是叶节点,则至少需要两颗子树 每个节点中有N个元素,和N+1个指针。每个节点中的元素不得小于最大节点容量的1/2 所有的叶子位于同一层级(这也是为什么叫平衡树) 父节点元素向左的指针必须小于节点元素,向右的指针必须大于节点元素,比如图1中Q的左指针必须小于Q,右指针必须大于Q 为什么要使用B树 在计算机系统中,存储设备一般分为两种,一种为主存(比如说CPU二级缓存,内存等),主存一般由硅制成,速度非常快,但每一个字节的成本往往高于辅助存储设备很多。还有一类是辅助存储(比如硬盘,磁盘等),这种设备通常容量会很大,成本也会低很多,但是存取速度非常的慢

b树与b+树原理解析

喜你入骨 提交于 2020-02-25 19:55:50
B树原理 b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。 B+树原理 B+树其实和B树是非常相似的, 相同点 根节点至少一个元素 非根节点元素范围:m/2 <= k <= m-1 不同点。 B+树有两种类型的节点:内部结点(也称索引结点)和叶子结点。内部节点就是非叶子节 点,内部节点不存储数据,只存储索引,数据都存储在叶子节点。 内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有 key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。 每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。 父节点存有右孩子的第一个元素的索引。 B树与B+树的区别 其实二者最主要的区别是: (1) B+树改进了B树, 让内结点只作索引使用,

B树与B+

假装没事ソ 提交于 2020-02-22 02:30:00
简单剖析B树(B-Tree)与B+树 https://blog.csdn.net/z_ryan/article/details/79685072 B树和B+树的插入、删除图文详解 https://www.cnblogs.com/nullzx/p/8729425.html 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树) https://blog.csdn.net/sup_heaven/article/details/39313731 B树与B+树简明扼要的区别 https://blog.csdn.net/zhuanzhe117/article/details/78039692 B树、B-树、B+树、B*树的区别 https://www.tuicool.com/articles/qqYF7z 【数据结构】B-Tree, B+Tree, B*树介绍 http://blog.sina.com.cn/s/blog_6776884e0100ohvr.html 来源: https://www.cnblogs.com/kelelipeng/p/10684649.html

B树和B+树的插入、删除图文详解

有些话、适合烂在心里 提交于 2020-02-19 10:54:58
简介:本文主要介绍了B树和B+树的插入、删除操作。写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下这篇博客以做记录。由于是自身对B+树的理解,肯定有考虑不周的情况,或者理解错误的地方,请留言指出。 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-1个关键字。 4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。 5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。 上图是一颗阶数为4的B树。在实际应用中的B树的阶数m都非常大(通常大于100),所以即使存储大量的数据,B树的高度仍然比较小。每个结点中存储了关键字(key)和关键字对应的数据(data),以及孩子结点的指针。 我们将一个key和其对应的data称为一个记录 。 但为了方便描述,除非特别说明,后续文中就用key来代替(key,

Tree

两盒软妹~` 提交于 2020-02-17 12:29:55
Tree 星星为什么这么渺小?那是因为他们把自己放的太高了! 背景 :简单了解二叉树、平衡树、红黑树、B树和B+树之间的特点和差异。 1. 二叉排序树的特点 a、树的左边节点比根节点小,右边节点比根节点大; b、左右子树也都是二叉排序树; c、但是,在一些特殊情况下,比如插入数据是有序的,就会发生退化情况,如有序序列,即二叉排序树退化成链表。 图1. 二叉树 2. 平衡树 图2. 红黑树 1、为了保证树的平衡,引入了平衡树。在插入数据的时候,同时调整这棵树,让它的节点尽可能均匀分布; 2、红黑树就是平衡树的一种,jdk内置的TreeSet底层就是用的红黑树; 3、之所以要保证树的平衡性,是因为树的查找性能取决于树的高度,让树尽可能平衡,就是为了降低树的高度。 3. B树 a、B树是一种多路搜索树,他的每个节点可以拥有多余两个孩子节点,M路的B树最多能拥有M个孩子节点; b、这种多路的设计,可以进一步降低树的高度。路数越多,树的高度越低。如果设计成无限多路,B树就退化成有序数组了; c、B树一般用于文件系统索引,文件系统和数据库索引一般都存储在硬盘上的,如果数据量大的话,不一定能一次性加载到内存中;如果一棵树无法一次性加载进内存,这时候B树的多路存储能力就出来了,可以每次加载B树的一个节点,然后一步步往下找;如果在内存中,红黑树比B树效率更高,但是涉及到磁盘操作,B树就更优了。 图3

B树及代码实现(c++)

泄露秘密 提交于 2020-02-16 19:16:35
这里推荐一篇图文并茂的好文章, B树、B+树、B*树 这里我实现代码过于粗糙,应该有很多地方可以改进, 另外我并没有实现b+树以及b*树,但其实应该也不复杂,无非是在struct增加指向兄弟结点的指针,应该也容易实现: /* * B 树 * */ # include "iostream" # include "vector" # include <cstring> # include <typeinfo> # include <cmath> # include <algorithm> using namespace std ; //#define DEGREE 6; const int DEGREE = 4 ; int maxD = DEGREE - 1 ; int minD = ( int ) std :: ceil ( DEGREE / 2. ) - 1 ; /* NOLINT */ template < class T > int getArrayLen ( T & array ) { //使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度 return ( sizeof ( array ) / sizeof ( array [ 0 ] ) ) ; } // TODO: 用预值,定义data数组 typedef struct BTnode { //

[C++ 系列] 80. 基于4阶B树详解R-BTree红黑树

狂风中的少年 提交于 2020-02-14 00:38:39
文章目录 0. 前言 1. 红黑树的概念 1.1 疑问:红黑树如何保持平衡呢? 1.2 常见的红黑树 2. 红黑树的构成性质 2.1 红黑树的5条重要性质 2.2 请问下面这棵树是 红黑树 吗? 3. 红黑树与4阶B树的关系 3.1 红黑树与4阶B树的等价变换 3.2 红黑树 VS 2-3-4树 4. 相关英文单词 5. 红黑树的添加 5.1 添加前准备 5.2 添加的所有情况 5.3 修复性质4--LL\RR 5.4 修复性质4--LR\RL 5.5 如何区分其它的四种情况 5.6 修复性质4 – 上溢 – LL 5.7 修复性质4 – 上溢 – RR 5.8 修复性质4 – 上溢 – LR 5.9 修复性质4 – 上溢 – RL 6. 红黑树添加元素总结 7. 红黑树的删除 7.1 删除 – RED节点 7.2 删除 – BLACK节点 7.3 删除 – 拥有1个RED子节点的BLACK节点 7.4 删除 – BLACK叶子节点 – sibling(兄弟节点)为BLACK,且有 RED 子节点 7.5 删除 – BLACK叶子节点 – sibling(兄弟节点)为BLACK,没有 RED 子节点 7.6 删除 – BLACK叶子节点 – sibling(兄弟节点)为RED 8. 红黑树删除元素总结 9. 答疑:红黑树的平衡 10. 平均时间复杂度 11. AVL树 vs 红黑树