维基百科对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+树:

下图是B+树的插入动画:

B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。

B+ 树的优点在于:

  • 由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
  • B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。下面是B 树和B+树的区别图:

分析

对B树和B+树的分析和对前面讲解的2-3树的分析类似,

对于一颗节点为N度为M的子树,查找和插入需要logM-1N ~ logM/2N次比较。这个很好证明,对于度为M的B树,每一个节点的子节点个数为M/2 到 M-1之间,所以树的高度在logM-1N至logM/2N之间。

这种效率是很高的,对于N=62*1000000000个节点,如果度为1024,则logM/2N <=4,即在620亿个元素中,如果这棵树的度为1024,则只需要小于4次即可定位到该节点,然后再采用二分查找即可找到要找的值。

B树和B+树详细解析相关推荐

  1. php tire树,Immutable.js源码之List 类型的详细解析(附示例)

    本篇文章给大家带来的内容是关于Immutable.js源码之List 类型的详细解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.存储图解 我以下面这段代码为例子,画 ...

  2. 【机器学习】树回归和聚类算法解析和应用

    [机器学习]树回归和聚类算法解析和应用 文章目录 1 树回归 2 CART ( Classification And Regression Tree) 分类回归树 3 K-means3.1 合理选择 ...

  3. 【数据结构】B树和B+树的笔记详细诠释

    目录 前言 1. 概念指引 1.1 二叉排序树 1.2 平衡二叉树 2. B树 3. B+树 4. 总结 前言 该笔记取决于 天勤的数据结构笔记 本文主要讲解b树和b+树的概念以及基本的代码逻辑 在讲 ...

  4. 超级详细树讲解三 —— B树、B+树图解+代码

    首先很高兴你看到了这篇文章,这篇文章可能会花费你很长很长的时间去看,但是这篇文章包括的内容绝对足够你对树的一个系统性的学习.为什么要写这篇文字呢?因为自己在学习树的时候,有些博客只有图解,有些博客只有 ...

  5. 数据结构与算法——24. 树的应用:表达式解析树

    文章目录 一.解析树 二.解析树实例:表达式解析 1. 建立表达式解析树 (1)建立表达式解析树的规则 (2)建立表达式解析树的思路 (3)python代码实现 2. 表达式解析树的求值 (1)增加程 ...

  6. 数据结构与算法(Python版)四十八:树的应用(表达式解析)

    树的应用:解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树主谓宾,定状补 程序设计语言的编译 词法.语法检查从语法树生成目标代码 自然语言 ...

  7. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  8. KNN算法与Kd树(转载+代码详细解释)

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

  9. Trie树(字典树)详细知识点及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

最新文章

  1. Pytest - 使用介绍
  2. excel表格出问题了
  3. 运维企业专题(1)HTTP加速器——Varnish缓存机制前篇
  4. [力扣] 二叉树的层序遍历
  5. 程序员书单_UML篇
  6. 【机器学习基础】深入讨论机器学习 8 大回归模型的基本原理以及差异!
  7. 河马 webshell扫描器对linux服务器进行安全扫描
  8. 头条限流是什么原因_抖音号被限流是因为什么原因?
  9. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理
  10. 前馈神经网络_深度学习基础理解:以前馈神经网络为例
  11. AndroidのTextView之CompoundDrawable那些坑
  12. linux安装tomcat_Linux云服务器安装jdk、Tomcat、MySQL5.7 - 咸鱼落成
  13. web页面的回流,认识与避免
  14. java text类型转换_java语言实现Text格式转换成pdf文件
  15. Gifxing在线图片无损压缩,gif压缩
  16. 我奋斗十八年不是为了和你一起喝咖啡
  17. Oracle 11g Release 1 (11.1) 单行函数——(返回字符值)字符函数
  18. 阿里云前端周刊 - 第 13 期 1
  19. QQ欢乐斗地主心得体会 (三):高倍场攻略
  20. 差分数组分析详解+例题

热门文章

  1. Django安装(for Mac)
  2. Codevs 2460 == BZOJ 1036 树的统计
  3. 搭建Hadoop平台(一)之配置用户名及hosts文件
  4. (转)OAuth 2.0的设计思路
  5. IOS端与Java端MD5加密方法
  6. jQuery中 trigger() 使用心得
  7. 最近公共祖先LCA 【专题@AbandonZHANG】
  8. 报表软件公司高价悬赏BUG,100块1个我真是醉了
  9. 帆软报表插件开发之fine-decision中的EmbedRequestFilterProvider扩展
  10. java.lang.object源码_第三篇:java.lang.Object 类源码分析