1.什么是B树

B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree)一个节点可以拥有最少2个子节点。

2.B树适用的场景

与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。B树减少定位记录时所经历的中间过程,从而加快存取速度。B树这种数据结构可以用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实现上。

3.B树特点

  • 保持键值有序,以顺序遍历
  • 使用层次化的索引来最小化磁盘读取
  • 使用不完全填充的块来加速插入和删除
  • 通过优雅的遍历算法来保持索引平衡

另外,B树通过保证内部节点至少半满来最小化空间浪费。一棵B树可以处理任意数目的插入和删除。

B树的弊端

  • 除非完全重建数据库,否则无法改变键值的最大长度。这使得许多数据库系统将人名截断到70字符之内。

(其他关联数组的实现,例如三元搜索树或者开散列哈希表,可以动态适应任意长度的键值)。

4.其他

1.  数据库系统维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引的实现通常使用B树及其变种B+树。

创建索引可以大大提高系统的性能。

第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

2.R树

R树是B树在高维空间的扩展,是一棵平衡树。每个R树的叶子结点包含了多个指向不同数据的指针,这些数据可以是存放在硬盘中的,也可以是存在内存中。根据R树的这种数据结构,当我们需要进行一个高维空间查询时,我们只需要遍历少数几个叶子结点所包含的指针,查看这些指针指向的数据是否满足要求即可。这种方式使我们不必遍历所有数据即可获得答案,效率显著提高。

如何查询特定的数据。又以餐厅为例,假设我要查询广州市天河区天河城附近一公里的所有餐厅地址怎么办?

  1. 打开地图(也就是整个R树),先选择国内还是国外(也就是根结点)。
  2. 然后选择华南地区(对应第一层结点),选择广州市(对应第二层结点),
  3. 再选择天河区(对应第三层结点),
  4. 最后选择天河城所在的那个区域(对应叶子结点,存放有最小矩形),遍历所有在此区域内的结点,看是否满足我们的要求即可。

相关知识:

一:为什么要用B树

磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。

为什么B类树可以进行优化呢?我们可以根据B类树的特点,构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息,保证层数尽量的少,以便后面我们可以更快的找到信息,磁盘的I/O操作也少一些,而且B类树是平衡树,每个结点到叶子结点的高度都是相同,这也保证了每个查询是稳定的。

1.二叉搜索树:

  • 1.所有非叶子结点至多拥有两个儿子(Left和Right);
  • 2.所有结点存储一个关键字;
  • 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

2.B-树
是一种多路搜索树(并不是二叉的):

  1. 若根结点不是终端结点,则至少有2棵子树
  2. 除根节点以外的所有非叶结点至少有 M/2 棵子树,至多有 M 个子树(关键字数为子树减一)
  3. 所有的叶子结点都位于同一层

如:(M=3)

因为 B 树的子树大小排序规则,因此在 B 树中查找数据时,一般需要这样:

  1. 从根节点开始,如果查找的数据比根节点小,就去左子树找,否则去右子树
  2. 和子树的多个关键字进行比较,找到它所处的范围,然后去范围对应的子树中继续查找
  3. 以此循环,直到找到或者到叶子节点还没找到为止

用一张图对比平衡二叉树和 B 树:

可以看到,B 树的每个节点可以表示的信息更多,因此整个树更加“矮胖”,这在从磁盘中查找数据(先读取到内存、后查找)的过程中,可以减少磁盘 IO 的次数,从而提升查找速度。

我们知道,平衡的树之所以能够加快查找速度,是因为在添加、删除的时候做了某些操作以保证平衡。

平衡二叉树的平衡条件是:左右子树的高度差不大于 1;而 B 树的平衡条件则有三点:

  1. 叶子节点都在同一层
  2. 每个节点的关键字数为子树个数减一(子树个数 k 介于树的阶 M 和它的二分之一
  3. 子树的关键字保证左小右大的顺序

也就是说,一棵 3 阶的 B 树(即节点最多有三个子树),每个节点的关键字数最少为 1,最多为 2,如果要添加数据的子树的关键字数已经是最多,就需要拆分节点,调整树的结构。

B树适用场景

文件系统和数据库系统中常用的B/B+ 树,他通过对每个节点存储个数的扩展,使得对连续的数据能够进行较快的定位和访问,能够有效减少查找时间,提高存储的空间局部性从而减少IO操作。他广泛用于文件系统及数据库中,如:

  • Windows:HPFS 文件系统

  • Mac:HFS,HFS+ 文件系统

  • Linux:ResiserFS,XFS,Ext3FS,JFS 文件系统

  • 数据库:ORACLE,MYSQL,SQLSERVER 等中

  • 数据库:ORACLE,MYSQL,SQLSERVER 等中

3.B+树

由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引,而B树则常用于文件索引。

B树和B+树的区别

一棵 B+ 树需要满足以下条件:

  1. 节点的子树数和关键字数相同(B 树是关键字数比子树数少一)
  2. 节点的关键字表示的是子树中的最大数,在子树中同样含有这个数据
  3. 叶子节点包含了全部数据,同时符合左小右大的顺序

如:(M=3)

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;

B+ 树的三个优点:

  1. 层级更低,IO 次数更少
  2. 每次都需要查询到叶子节点,查询性能稳定
  3. 叶子节点形成有序链表,范围查询方便

简单概括下 B+ 树的三个特点:

  1. 关键字数和子树相同
  2. 非叶子节点仅用作索引,它的关键字和子节点有重复元素
  3. 叶子节点用指针连在一起

首先第一点不用特别介绍了,在 B 树中,节点的关键字用于在查询时确定查询区间,因此关键字数比子树数少一;而在 B+ 树中,节点的关键字代表子树的最大值,因此关键字数等于子树数。

第二点,除叶子节点外的所有节点的关键字,都在它的下一级子树中同样存在,最后所有数据都存储在叶子节点中。根节点的最大关键字其实就表示整个 B+ 树的最大元素。

第三点,叶子节点包含了全部的数据,并且按顺序排列,B+ 树使用一个链表将它们排列起来,这样在查询时效率更快。

由于 B+ 树的中间节点不含有实际数据,只有子树的最大数据和子树指针,因此磁盘页中可以容纳更多节点元素,也就是说同样数据情况下,B+ 树会 B 树更加“矮胖”,因此查询效率更快。

B+ 树的查找必会查到叶子节点,更加稳定。

有时候需要查询某个范围内的数据,由于 B+ 树的叶子节点是一个有序链表,只需在叶子节点上遍历即可,不用像 B 树那样挨个中序遍历比较大小。

4.B*树

B*树是B+树的变种,相对于B+树他们的不同之处如下:

(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),b*树的初始化个数为(cei(2/3*m))

(2)B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;

在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;

5、 总结

1、相同思想和策略

从平衡二叉树、B树、B+树、B*树总体来看它们的贯彻的思想是相同的,都是采用二分法和数据平衡策略来提升查找数据的速度;

2、不同的方式的磁盘空间利用

不同点是他们一个一个在演变的过程中通过IO从磁盘读取数据的原理进行一步步的演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的;

小结

  1. B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
  2. B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
  3. B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
  4. B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

参考

https://zhuanlan.zhihu.com/p/27700617

https://www.jianshu.com/p/332caf8bed3a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

https://juejin.im/entry/5b0cb64e518825157476b4a9

https://blog.csdn.net/yutianxin123/article/details/52269810

https://blog.csdn.net/hust_dxxxd/article/details/50905446

20190513面试B树相关推荐

  1. 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

    [本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树二叉树的创建,关系建立二叉树的创建 ...

  2. 这家总资产排名第一的银行,为什么叫“小”摩?

    小摩真的小吗? 总资产排名第一的摩根大通表示不服,我哪里小了啊喂. 本文先聊聊大摩和小摩的历史渊源,再说下我和小摩之间的故事,最后给几点准备面试的建议. 小摩和大摩 先来搞清楚概念: 小摩 = JP摩 ...

  3. @Autowired 和 @Resource 的区别(为什么更推荐使用@Resource ?)

    @Autowired 和 @Resource 的有什么区别? 相同点 不同点 @Autowired @Resource @Resource的装配顺序 要是实在不理解可以看看这个视频 !!! 为什么更推 ...

  4. c++ 常用面试题整理(不定时更新)

    c++常用面试题整理 目录 开头.学好C++需要哪些知识 第一部分. c++ 基础 1.C和C++的区别 2.C++中指针和引用的区别 3.结构体struct和共同体union(联合)的区别 4.st ...

  5. 面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/exC8JdQS InnoDB的一棵B+树可以存放多少行数 ...

  6. 腾讯面试官用「B+树」虐哭我了

    作者 | L的存在 来源 | 我是程序员小贱(ID:Lanj1995Q) 我们知道当系统要处理的数据量非常庞大的时候,数据不可能全部存放于内存,需要借助磁盘来完成存储和检索.在数据库中支持很多种索引方 ...

  7. hashmap中用红黑树不用其他树_HashMap面试专题:常问六题深入解析

    引言 其实我很早以前就想写一篇关于HashMap的面试专题.对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看,专攻HashMap即可. 然而,鉴于网 ...

  8. mysql存储base64位用什么类型_【漫画】面试现场:为什么MySQL数据库要用B+树存储索引?...

    推荐阅读:MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒! 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说 ...

  9. 面试常考的树,我这样讲给你听!

    我们今天先来看,什么是"树". 树是由顶点和边组成的且不存在环的数据结构.作为一个应用非常广的数据结构,不仅在工作中常用,在面试中也非常常考. 一是因为树的结构天然决定了它和递归联 ...

最新文章

  1. 信息熵是什么 转 理论吃透的创新解释
  2. 第十六届全国大学生智能车竞赛全国总决赛线上比赛规范
  3. Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面
  4. xshell通过隧道连接_工作常见问题--如何解决xshell远程连接自动断开的问题
  5. mysql开窗函数over_sql中的开窗函数over()
  6. 图片优化_Web 性能优化: 图片优化让网站大小减少 62%
  7. OpenFileDialog 类的ShowDialog() 错误的解决
  8. 常见的几种负载均衡算法
  9. vue 执行函数this_在vue中使用回调函数,this调用无效的解决
  10. spark运行pi_如何使用甜蜜的橙色Pi起床并运行
  11. 一种基于红黑树的定时器
  12. 千万不要错过云计算兴起的时代
  13. VS C# string 字符包含判断
  14. Redis分布式架构以及实战
  15. 新手入门—递归实现指数型枚举
  16. 如何对极乐迪斯科(Disco Elysium for mac)进行安装
  17. 卸载office提示无法打开修补程序包 修补程序包是否存在的解决方法.
  18. 无线安全WLAN WEP破解(一)
  19. IDEA中Tomcat启动后提交表单,请求的资源[/servlet_demo2/book-add.html]不可用
  20. http/2与http/1的区别

热门文章

  1. 什么是OpCode?
  2. ECMAScript 2015 ES6
  3. Java基础入门(上)
  4. 2014年3月份第3周51Aspx源码发布详情
  5. 小米电视没有U盘怎么安装软件方法
  6. Orbit Downloader 小巧无广告的下载工具,超赞的在线视频下载能力,比迅雷清爽多了!
  7. Android fastboot 基本操作命令(Android 刷机)
  8. 【MongoDB】mongodb | 安装 | 使用 | mdb
  9. 【Vue】直播流m3u8,rtsp,rtmp,flv,mp4测试地址
  10. QtQuick串口编程Demo