B树、B+树到底是什么?

  • B树
    • 概念
    • B树的高度
    • 查找
  • B+树
    • 概念
  • 区别
  • 后续

B树

B树又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的,通常用m表示。一般从查找效率考虑,通常要求m>=3.

概念

一棵m阶b树或为空树,或为满足如下特质的n叉树:

  1. 树中每个结点至多有m棵子树,即至多含有m-1个关键字
  2. 若根节点不是终端结点,则至少有两棵树
  3. 除根结点外的所有非叶节点至少有【m/2】(向上取整)棵子树,即至少含有【m/2】(向上取整)-1个关键字
  4. 所有非叶节点的结构如下:
    其中Ki(i=1,2,。。。,n)为结点的关键字,Pi(i=1,2,。。。,n)为指向子树根结点的指针
n P0 K1 P1 K2 P2 Kn Pn
  1. 所有的叶节点都出现在同一层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空)
  2. B树是所有结点的平衡因子均等于0的多路平衡查找树。

B树的高度

B树的高度不包括最后的不带任何信息的叶结点所在的那一层。
若n>=1,则对任意一棵包含n个关键字、高度为h、阶数为m的B树:

  1. 因为B树中每个结点最多有m棵子树,m-1个关键字,所以在一棵高度为h的m阶B树中关键字的个数应满足n<=(m-1)(1+m+m^2 +…+ m^h-1 )=m^h-1 ,因此有h>=logm(n+1)
  2. 若让每个结点中的关键字个数达到最少,则容纳同样多关键字的B树的高度达到最大。由B树的定义:第一层至少有1个节点;第二层至少有2个结点;除根结点外的每个非终端节点至少有【m/2】棵子树,则第三层至少有2【m/2】个结点。。。第h+1层至少有2(【m/2】^(h-1)),
    注意到第h+1层是不包含任何信息的叶结点。对于关键字个数为n的B树,叶结点即查找不成功的结点为n+1,因此有n+1>2([m/2])^(h-1),即h<log[m/2] ( (n+1)/2)+1

查找

在B树上查找于二叉排序树很相似,只是每个结点都是多个关键字的有序表,在每个结点上所做的不是两路分支决定,而是根据该节点的子树所做的多路分支决定。
B树的查找包含两个基本操作:

  1. 在B树中找结点
  2. 在结点内找关键字。

由于B树常存储在磁盘上,因此前一个查找操作是在磁盘上进行的,而后一个查找操作是在内存中继续的。即在找到目标结点后,先将结点信息读入内存,然后在结点内采用顺序查找法,或折半查找法。
在B树上查找到某个结点后,先在有序表中进行查找,若找到则查找成功,否则按照对应的指针信息到所指的子树中去查找。查找到叶结点(对应指针为空指针)时,则说明树中没有对应的关键字,查找失败。

B+树

B+树是对应数据库所需而出现的一种B树的变形树。

概念

一棵m阶的B+树需满足下列条件:

  1. 每个分支结点最多有m棵子树
  2. 非叶根节点至少有两棵子树,其他每个分支结点至少有【m/2】棵子树
  3. 结点的子树个数于关键字个数相等
  4. 所有叶结点包含全部关键字及其相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来。
  5. 所有分支结点(可视为索引的索引)中仅包含他的各个子节点(即下一级的索引块)中关键字的最大值及指向其子节点的指针。

区别

  1. 在B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一棵子树;而在B树中,具有n个关键字的结点含有n+1棵子树。
  2. 在B+树中,每个结点(非根内部结点)的关键字个数n的范围是【m/2】<=n<=m(根节点:1<=n<=m);
    在B树中,每个结点(非根叶结点)的关键字个数n的范围是【m/2】-1<=n<=m-1(根节点:1<=n<=m-1)。
  3. 在B+树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶节点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。
  4. 在B+树中,叶结点包含了全部关键字,即在非叶结点中出现的关键字也会出现在叶结点中;而在B树中,叶结点包含的关键字和其他结点包含的关键字是不重复的。

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏。
订阅专栏后,可以在微信公众号上私聊我,直接发给你源码。
或者关注公众号。

编写不易,感谢支持。

B树、B+树到底是什么?相关推荐

  1. B树B+树的原理和操作

    3.B- 树 3.1什么是B-树 具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让 ...

  2. Dom树 CSS树 渲染树(render树) 规则、原理

      前端不可不学的浏览器渲染机制,阿里年年问,去一个栽一个.听说百度也在考这个,你还不准备学吗? 首先你要了解浏览器渲染的顺序:   1.构建dom 树   2.构建css 树   3.构建渲染树   ...

  3. java树_Java树

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合.把它叫做"树"是因为它 ...

  4. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  5. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  6. bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  7. Trie(前缀树/字典树)及其应用

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

  8. 【计算理论】图灵机 ( 非确定性图灵机 | 非确定性图灵机指令分析 | 计算过程 | 非确定性指令出现多个分支 | 非确定性图灵机转为计算树 | 计算树 )

    文章目录 一.非确定性图灵机 二.非确定性图灵机 指令 三.非确定性图灵机 计算示例 初始状态 四.计算步骤 1 五.计算步骤 2 六.计算步骤 3 ( 出现非确定性分支 ) 七.计算步骤 3-1 ( ...

  9. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  10. python 树_Python树的概念

    1.定义 1)非线性结构,每个元素可以有多个前驱和后继. 2)树是n(n>=0)个元素的集合. n=0时,称为空树. 树只有一个特殊的没有前驱的元素,称为树的根root. 树中除了根节点外,其余 ...

最新文章

  1. 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法...
  2. 研究学者、医师与产业投资者齐聚一堂,将碰撞出何种火花?
  3. Python中threading的join和setDaemon的区别及用法 例子
  4. 二分类预测用的几个预测结果精确度计算方法
  5. c字段和属性的区别_如何将唯一属性类字段设置为不允许重复?
  6. 研华外触发实验PCI1714板卡安装事项
  7. 服务器时间修改方法,修改云服务器时间设置方法
  8. 正点原子STM32学习笔记——MPU6050介绍
  9. 工具WinRunner 及Bochs
  10. FPN网络结构及Pytorch实现
  11. 由IP6K防尘和IPX9K防水组合的IP6K9K
  12. Excel图标也可以变脸
  13. 双系统重装win10后恢复grub引导
  14. logback 多实例 归档问题 无法自动删除.tmp文件问题
  15. 一次培训机构的面试经历
  16. shell下删除文件末尾的空行
  17. 摆脱外包进大厂,苦逼翻身把歌唱,20K、30K、40K!咬牙硬吃下这份儿数据结构与算法手册
  18. Hadoop实战系列之MapReduce 分析 Youtube视频数据
  19. 牛客小白月赛5 I.区间 (interval)
  20. 高可用性GRE+IPSEC中心—分支

热门文章

  1. c语言一级考试题目第四季度,模拟试题8套
  2. scrapy 图片url 转base64_一文快速掌握 scrapy 爬虫框架
  3. 微信公众平台 获取用户列表
  4. Docker应用五:使用Dockerfile部署MongoDB
  5. 【转】SQLServer 游标简介与使用说明
  6. notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别? (转载)
  7. 分享ArcGis For Flex API 1.3 Diagram
  8. JavaScript设计模式(一)-- 简单工厂模式
  9. sublime text3常用的一些快捷键
  10. win 10 VMware与Hyper-v共存