今天学习B树和B+树,B树和B+树都是基于二叉树的衍生,对于二叉树不太了解的读者可以翻看《数据结构:二叉树》

本文目录:

B树

定义及特性

B树,在写法上通常是B-树,这不是减号的意思,只是一种表达方式,它是一种能够存储数据、对数据进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。,概括来说是一个节点可以拥有多于2个节点的二叉查找树。

一个m阶的B树具有如下特点:

  • B树根节点至少有两个节点,每个节点可以有多个子树;

  • 每个中间节点都包含k-1个元素和k个子树,其中 m/2 <= k <= m ;

  • 所有的叶子结点都位于同一层;

  • 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

看概念还是挺晦涩的,直接放张图看看正宗的B树

可以看出,B树的节点可以有多个数据,并且可以拥有不只两个子树,左边子树的数据都比节点的数据小,右边子树的数据都比节点的数据大。

比起正常的平衡二叉树,B树每个节点显然能存储的数据更多,在查找数据方面也显得比较高效,所以B树被广泛应用于磁盘IO读取较为频繁的系统中。

查找顺序

在B树中,一般的查找顺序如下:

  1. 从根节点开始,如果查找的数据比根节点小,就去左子树找,否则去右子树

  2. 和子树的多个关键字进行比较,找到它所处的范围,然后去范围对应的子树中继续查找

  3. 以此循环,直到找到或者到叶子节点还没找到为止

保持平衡

B树查找的高效性是基于其独特的结构,一旦有数据插入或者删除,那么B树就需要调整自身来保持平衡。B树的平衡特性有三点:

  1. 叶子节点都在同一层

  2. 每个节点的关键字数 (也就是数据个数) 为子树个数减一(子树个数 k 介于 m/2 <= k <= m

  3. 子树的数据保证左小右大的顺序

举例子说,一棵4阶的B树,节点最多有4个子树,每个节点的关键字数最少为1,最多为3,插入数据时,如果要插入的子树的关键字数已经是最多,就需要拆分节点,调整B树的结构。

下面是一张从网上找到的动态图,完整展示了4阶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+树,B+树和结构很类似,但查询性能上更高,具有如下的特性:

  • 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点;

  • 叶子节点中包含了全部元素的信息,按照关键字的大小从左到右排序;

  • 中间节点的元素同时存在于子节点中,在子节点元素中是最大。

下面放张示例图:

从图中可以看出,B+树中间节点和叶子节点有重复的数据,这里声明一下,中间节点保存的只是子树数据的子针,并不是真实的数据,所以中间节点的存储占用空间较少。

同时,叶子节点之间用指针连在一起,换句话说,叶子节点形成了一个链表,把所有的数据都存储了进来。

为什么这样设计,比起B树有什么好处呢?

首先,因为B+树的中间节点只是保存子树的最大数据和子树的子针,本身的占用空间较小,因此可以容纳更多节点元素,也就是说同样数据情况下,B+ 树会 B 树更加“矮胖”,因此查询效率更快。

其次,查找某个范围的数据,只需在B+树的叶子节点链表中遍历即可,不需要像B 树那样挨个中序遍历比较大小。总结来说,B+树的优点就是:

  1. 层级更低,IO 次数更少;

  2. 每次都需要查询到叶子节点;

  3. 查询性能稳定叶子节点形成有序链表,范围查询方便

B+树的插入

B+树的插入过程也是比较麻烦的,因为也需要保持平衡,这里也是给大家展示一张动态图,具体就不分析了。

使用场景

最后说一下B树和B+树的使用场景,通过前面的学习,我们了解了这两种树都是可以有效减少IO次数的数据结构,基于这个优点,它们被广泛应用于磁盘文件系统中,

例如 windows的HPFS 文件系统、Linux的文件系统、Mysql的索引等,尤其是Mysql的索引结构,这是面试中的常见问题,所以,了解B树和B+树还是非常有必要的。

参考

https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ

https://www.cnblogs.com/vincently/p/4526560.html

数据结构:IO读写频繁的青睐,B树和B+树的更多相关文章

  1. 【数据结构】B树、B+树详解

    B树 前言 首先,为什么要总结B树.B+树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/+Tree作为索引结构(例如mysql的InnoDB引擎使用的B+树),理解不透彻B树,则 ...

  2. 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...

  3. 转 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tre ...

  4. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  5. 数据结构之B树、B+树(一)

    B-树 什么是B-树? B树是一种查找树,我们知道,这一类树(比如二叉搜索树,红黑树等等)最初生成的目的都是为了解决某种系统中,查找效率低的问题.B树也是如此,它最初启发于二叉搜索树,二叉搜索树的特点 ...

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

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...

  7. 数据结构---平衡查找树之B树和B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...

  8. 【经典数据结构】B树与B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...

  9. 【经典数据结构】B树与B+树的解释

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...

随机推荐

  1. 初识Identity并添加身份验证管理页面

    目录 初识Identity并添加身份验证管理页面 前言 什么是ASP.NET Core Identity 创建带有身份验证的WebApp 尝试运行 检查解决方案中的项目文件 发现问题 原因 解决问题 ...

  2. 面向对象总结、configparser配置文件模块、logging日志模块

    面向对象总结 # 学习态度# python基础 2个月# html css js jq 1个月 # 上课困 # 学习方法 :# 列出知识点# 例子 写了哪些 # 面向对象学了哪些块# 为什么要讲面向对 ...

  3. Linux系统磁盘与分区管理(7)

    Linux最传统的磁盘文件系统(filesystem)使用的是EXT4格式,所以要了解文件系统就得要由认识EXT4开始,而文件系统是创建在硬盘上面的,因此我们得了解硬盘的物理组成才行,下面我们回来详细 ...

  4. <转>(笔记)正则表达式的几种引擎

    这篇主要是基于<精通正则表达式>的一篇读书笔记,因为书还没看完,可能以后还会有相关的笔记.(工作以后看书的效率真的很低啊……) 正则引擎主要可以分为基本不同的两大类:一种是DFA(确定性有 ...

  5. 大众点评Cat--架构分析

    转自:http://blog.csdn.net/szwandcj/article/details/51025669 Cat功能强大且多,光日志的报表和图表分析就有十几种,但文档却很少,寥寥无几找到一些 ...

  6. servlet实现商品商场项目

    1.1 1.创建四个包DButils reposiable service servletJPK DButils包中的类jdbcutils.java 用于获取工具类DButils工具类的DataSou ...

  7. D17——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D17 20181014内容纲要: 1.jQuery介绍 2.jQuery功能介绍 (1)jQuery的引入方式 (2)选择器 (3)筛选 (4)文本操作 (5) ...

  8. postgresql-查看各个数据库大小

    查看各个数据库表大小(不包含索引),以及表数据量 mysql: select table_name,concat(round((DATA_LENGTH/1024/1024),2),'M')as siz ...

  9. POJ 2492

    #include<iostream> #include<stdio.h> #define MAXN 2050 using namespace std; int pre[MAXN ...

  10. MetaMask安装使用指南

    1.MetaMask(轻钱包) MetaMask是一款在谷歌浏览器Chrome上使用的插件类型的以太坊钱包,该钱包不需要下载,只需要在谷歌浏览器或基于谷歌浏览器内核的其它浏览器(如:360极速浏览器- ...