b-树

B树、B-树、B+树、B*树

风流意气都作罢 提交于 2020-03-23 15:21:41
B树 即 二叉搜索树 : 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; (平衡二叉搜索树的优势) 如果 B 树的所有非叶子结点的左右子树的结点数目均保持差不多( 平衡 ),那么 B 树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是 常数开销 ; 如: 但B树在经过多次插入与删除后,有可能导致不同的结构: 右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的策略; B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2

30、B-树与B+树的异同

…衆ロ難τιáo~ 提交于 2020-03-03 10:20:56
前面已经介绍过B-树,接下来,我们主要介绍一下B+树。 1、B+树的概念 B+树是应文件系统所需而生的一种B-树和变形树。一棵m阶B+树和m阶的B-树的差异在于: (1)有n棵子树的结点中含有n个关键字。 (2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身关键字的大小自小而大顺序链接。 (3)所有的非终端节点可以看成是索引部分,结点 中仅含有其子树(根结点)中的最大(小)关键字。 B+树通常有两个指针,一个指向根结点,另一个指向关键字最小的叶子结点。因些,对于B+树进行查找两种运算:一种是从最小关键字起顺序查找,另一种是从根结点开始,进行随机查找。 2、B+树的查找 跟B树的查找类似,但是也有不同。由于跟记录有关的信息存放在叶结点中,查找时若在上层已找到待查的关键码,并不停止,而是继续沿指针向下一直查到叶结点层的关键码。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。此外,B+树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。上面两种方式结合起来,使得B+树非常适合范围检索。 3、B+树的插入 B+树的插入与B树的插入过程类似。不同的是B+树在叶结点上进行,如果叶结点中的关键码个数超过m,就必须分裂成关键码数目大致相同的两个结点,并保证上层结点中有这两个结点的最大关键码。 4、B+树的删除

29、B-树的插入、查找、删除

吃可爱长大的小学妹 提交于 2020-03-03 10:16:30
前面讨论的查找都是内查询算法,被查询的数据都在内存。当查询的数据放在外存,用平衡二叉树作磁盘文件的索引组织时,若以结点为内外存交换的单位,则找到需要的关键字之前,平均要进行lgn次磁盘读操作,而磁盘、光盘的读写时间要比随机存取的内存代价大得多。其二,外存的存取是以“页”为单位的,一页的大小通常是1024字节或2048字节。 针对上述特点,1972年R.Bayer和E.M.Cright提出了一种B-树的多路平衡查找树,以适合磁盘等直接存取设备上组织动态查找表。B-树上算法的执行时间主要由读、写磁盘的次数来决定,故一次I/O操作应读写尽可能多的信息。因此B-树的结点规模一般以一个磁盘页为单位。一个结点包含的关键字及其孩子个数取决于磁盘页的大小。 一、基本概念 B-树又称为多路平衡查找树。 一棵度为m的B-树称为m阶B_树。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。B-树中所有结点的孩子结点最大值称为B-树的阶,通常用m表示。从查找效率考虑,一般要求m≥3。一棵m阶的B-树或者是一棵空树,或者是满足下列要求的m叉树: (1)根结点或者为叶子,或者至少有两棵子树,至多有m棵子树。 (2)除根结点外,所有非终端结点至少有ceil(m/2)棵子树,至多有m棵子树。 (3)所有叶子结点都在树的同一层上。 (4)每个结点的结构为: (n,A0,K1,A1,K2

B-树

六眼飞鱼酱① 提交于 2020-03-02 11:29:21
B-树(读作B树) mysql数据库的索引基于Hash表或B+树 索引采用树结构存储,查询效率高,还可以操持有序。 数据库不使用二叉树的原因: 从算法逻辑上来讲,二叉树的查找速度和比较次数都是小的。但是,要考虑磁盘IO。 数据库的索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多,当我们利用索引查的时候,不可能把整个索引全部加载到内存,只能逐一加载每一个磁盘页(磁盘页对应索引数的节点) 磁盘IO数是由数的高度确定的,磁盘IO数<=树的高度 为了减少磁盘IO,就要把树变得"矮胖",这就是B-树的特征之一 B树是一种多路平衡查找树,一个m阶B树有如下几个特征: 1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m 4.所有的叶子结点都位于同一层。 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 应用:MongoDB 来源: CSDN 作者: 蒟蒻级玩家 链接: https://blog.csdn.net/qq_44144735/article/details/104605384

B 树 - Java 实现

大兔子大兔子 提交于 2020-01-23 17:57:37
文章目录 树定义 搜索关键码 插入关键码 删除关键码 当数据规模大到内存已不足以容纳时, 常规的平衡二叉搜索树的效率将大打折扣。其原因在于,查找过程对 外存的访问次数 过多。 磁盘等外部存储器的一个特点是: 读取 物理地址连续 的一千个字节,与读取单个字节所消耗的时间几乎是没有区别的。 此时,可以使用多路搜索树。多路搜索树可以由二叉搜索树变换得到。如, 此时,搜索过程每下降一层,都以“大节点”为单位从外存中读取一组(而不再是一个)关键码。更为重要的是, 这组关键码在逻辑上与物理上都彼此相邻 ,故可以批量方式从外存一次性读出,且所需时间与读取单个关键码几乎一样。 B 树 所谓 m 阶 B-树 , 即 m 路平衡搜索树( m ≥ 2 m \ge 2 m ≥ 2 )。 所有 外部节点 的 深度相等 。 设一个内部节点存有 n 个关键码, 以及用以指示对应分支的 n+1 个指针。除 根 以外的所有内部节点,都应满足: ⌈ m / 2 ⌉ ≤ 分支数 ≤ m \lceil m/2 \rceil \le \text{分支数} \le m ⌈ m / 2 ⌉ ≤ 分支数 ≤ m ,而在非空的 B-树中,根节点应满足: 2 ≤ 分 支 数 ≤ m 2 \le 分支数 \le m 2 ≤ 分 支 数 ≤ m 每个内部节点中的关键码按顺序排列。 由于各节点的分支数介于 ⌈ m / 2 ⌉ \lceil

B-树和B+树和B*树和R树

妖精的绣舞 提交于 2020-01-12 16:49:28
  在大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 ,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用 多叉树 结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。   为了更有效的 减少树的深度 ,新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构。即B树结构。    磁盘读取数据是以盘块 (block) 为基本单位的。 位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/ 写信息时尽量 减少磁头来回移动的次数 ,避免过多的查找时间 Ts 。   所以,在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入块(block)中某数据时,首先需要 定位到磁盘中的某块 。 1.B-树(B树)   1)定义   B是 balanced,而不是b inary,B-树或B_树 不要误解成“B减树”,“-”“_”只是连字符。   是一种多路搜索树(并不是二叉的),一个M阶的B树: 1

B+树与B*树小结

只愿长相守 提交于 2020-01-08 09:31:45
一、B+树 1.B+树定义与特性 B+ 树是 B- 树的变体,也是一种多路搜索树: 其定义基本与 B- 树同,除了: 1). 非叶子结点的 子树指针与关键字个数相同 ; 2). 非叶子结点的 子树指针 P[i ] ,指向关键字值属于 [K[i], K[i+1]) 的子树 ( B- 树是开区间); 3). 为所有叶子结点 增加一个链指针 ; 4). 所有关键字都在叶子结点出现 为了全面 这里给出网上另外一种说法: 一棵m阶的B+树和m阶的B树的差异在于: 1.有n棵子树的结点中含有n个关键字; (而B 树是n棵子树有n-1个关键字) 2. 所有的叶子结点中包含了全部关键字的信 息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3. 所有的非终端结点可以看成是索引部分 ,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) 下图给出典型的3阶B+树示例 B+ 的特性: 1). 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好 是有序的; 2). 不可能在非叶子结点命中; 3). 非叶子结点相当于是叶子结点的索引 (稀疏索引),叶子结点相当于是存储 (关键字)数据的数据层; 4). 更适合文件索引系统; 2.B+树的基本操作 1)查找操作

B+树|MYSQL索引使用原则

早过忘川 提交于 2020-01-01 04:57:06
‘’MYSQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。 事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。 B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,而且只支持索引单个 AUTO_INCREMENT 列。 不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。 一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf

B-/B+树 MySQL索引结构

限于喜欢 提交于 2020-01-01 04:23:14
索引 索引的简介 简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构” 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁盘上 我们一般所说的索引,如果没有特殊说明的话,就是指B+树结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引。 一般java开发知道这些基本够用了 索引的优势 类似大学图书馆建数目索引,提高数据检索效率,降低数据库的io成本 通过索引对数据进行排序,降低数据排序成本,降低了cpu的 劣势 索引实际上也是一张表,保存了主键和索引字段,并指向实体表的记录,所以索引列也要空间 虽然索引大大提高了查询速度,但是会降低更新表的速度,如对表进行insert,update和delete。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件每次添加了索引列的字段 索引只是提高效率的一个因素,如果你的mysql有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。 索引的使用 单值索引 唯一索引 复合索引 基本语法 show index from TableName;(查看表的索引) eg:show index from city; create [unique] index indexname(索引名称) on TableName

B-树(B树)

二次信任 提交于 2019-12-14 01:37:18
,B-树就是B树 英文名字叫做B-tree,中间的短线是英文连接符,只是翻译的时候将短线翻译成了减号。 全称Balance-tree(平衡多路查找树) , 平衡 的意思是左边和右边分布均匀。 多路 的意思是相对于二叉树而言的,二叉树就是二路查找树,查找时只有两条路,而B-tree有多条路,即父节点有多个子节点。 二,B-树用途 使用B-tree结构可以 显著减少定位 记录时所经历的中间 过程 ,从而加快存取速度。这个数据结构一般用于 数据库的索引 ,综合效率较高。 三,阶的概念 对于一棵m阶B-tree,每个结点至多可以拥有m个子结点。 即遍观整棵树,子节点最多的个数是m,那么这棵树就是m阶树。 四,树的度 树的度就是树的高度,即树的层数。 下图以二叉树为例,其他类型数与此相同。 五,B-树的定义 (1)树中每个结点至多有m 棵子树(注:m指的是树的阶); (2)若根结点不是叶子结点,则至少有两棵子树(注:根节点至少有两个儿子); (3)除根结点之外的所有非叶子结点至少有p个子节点( , 为向上取整。); (4)所有的非叶子结点中 包含以下数据 :(n,A0,K1,A1,K2,…,Kn,An) 其中: Ki (i=1,2,…,n)为 关键码 ,且Ki<Ki+1(注: ki是真实数据 ,存放在线性表当中,且从左至右升序排列) Ai 为指向儿子的指针(i=0,1,…,n),且指针Ai