当年我跳槽Java高级开发就是这么答B树和B+树区别的

简介: 今天,我给大家介绍一种面试中经常被问到数据结构树。大家可能也经常会听到二叉树、二叉查找树、AVL平衡二叉树、B树、 等等,那今天我给大家一次性讲清楚。

今天,我给大家介绍一种面试中经常被问到数据结构树。大家可能也经常会听到二叉树、二叉查找树、AVL平衡二叉树、B树、 等等,那今天我给大家一次性讲清楚。

另外,我花了1个多星期,准备了一份10W字的面试题解析配套文档,想获取的小伙伴可以扫描文章底部二维码领取!

1、树形结构的演变历史

树是一种数据结构,它的结构形状如同一棵树木,但是是倒立的状态。

cf209a19c8f49617ffe242d41a7829b4.jpg

树的分叉就相当于树形数据结构中的节点,树上的节点可以从树根无限延伸。如图所示:

8a12b7c318cc5edbb4448adb14ad12e9.jpg

但是,这种无限延伸的树在实际开发中一般用于可无限扩展的树形功能菜单。这样的无限级、无限宽扩展的结构查询性能会比较低。因此,为了提高树形结构的查询性能,于是就出现了二叉树,来看这么一张图:

87ec93e8a24e1280dbddac2d91fb735d.jpg

所谓二叉树是指每个节点最多支持两个分叉,相比于单向链表来说它多了一个分支。而二叉查找树,是在二叉树的基础上增加一个规则。它的规则是左子树的所有子节点都要小于它的根节点,而右侧子节点要大于它的根节点。

853dfe74902b7ded00998411625732cd.jpg

我们再来看这个图,二叉查找树有可能会出现斜树问题,从而导致时间复杂度会增加。因此,又引入了一种叫做平衡二叉树的机制。它具有二叉查找树的所有特点,同时还增加了一个规则。它的规则是左右两个子树的高度差的绝对值不能超过1。 为了达到这样一个平衡,所以它会引入一个左旋和右旋的机制,来实现树的平衡。

97493ae9619f3c6b82eac05a2b34a41e.jpg

我们再来看这张图,这是B树。它是一种多路平衡查找树。它既满足平衡二叉树的规则,又可以有多个子路。子路的数量呢取决于它的关键字的数量。如图所示,根节点中有两个关键字3和5,那么它能够拥有的子路数量等于关键字的数量加1。因此,从这个特征来看,在存储同样数量的情况下,平衡二叉树的高度一定要大于B树的高度。

2、B树和B+树的区别

B+树呢,其实是在B树的基础上做了增强,和B树有两个最大的区别:

第1个:B树的数据存储在每个节点上,而B+树中的数据只存储在叶子节点上,并且通过链表的方式将所有叶子节点全部串联起来

第2个:B+树的子树数量等于它的关键字的数量,而B树是关键字数量加1。我们来看这个图:

91b66ebe559a4048803ba9e4c5b93d55.jpg

这个是B树的存储结构。从B树的结构上可以看到,每个节点都会存储数据。我们再来看这个图:

4108fbe606f8cc330dc09e80ecc771d3.jpg

这是一个B+树的结构。B+树的数据是存储在叶子节点上的,并且呢,叶子节点的数据是用双向链表来关联。

3、选择B树和B+树的理由

那为什么要用B树或者B+树来做索引结构呢?

3e08431793e947aa1ef7be4be2ec36a6.jpg

因为AVL树的高度要比B树或者B+树的高度更高,而高度就意味着磁盘IO的数量,所以,为了减少磁盘IO的次数,文件系统或者数据库才会使用B树,或者B+树来做索引结构。

51d04db5b04e37d139a8169deb1b6b91.jpg

在比较经典的程序应用中,MongoDB使用的是B树,MongoDB中所有的节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询会更快。

34f1fb808c4f2f5f94bc28ad6b841e05.jpg

而MySQL作为一个关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。

以上就是我对B树和B+树的理解。程序的本质就是数据结构加算法。数据结构在实际开发中非常常见,比如数组、链表、双向链表、红黑树、跳跃表、B树、B+树、队列等。所以,数据结构是编程最重要的基本功之一,很多大厂面试也经常会问到。同时,基本功也是决定大家在技术路上能够达到的高度的重要因素。

相关文章
|
3天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
6天前
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
|
8天前
|
前端开发 Oracle Java
【前端学java】java开发的依赖安装与环境配置(1)
【8月更文挑战第8天】java开发的依赖安装与环境配置
26 1
【前端学java】java开发的依赖安装与环境配置(1)
|
1天前
|
数据采集 供应链 JavaScript
分享基于Java开发的Java毕业设计实战项目题目
这篇文章分享了67套基于Java开发的毕业设计实战项目题目,覆盖了互联网、企业管理、电子政务、Java基础项目、ERP系统、校园相关、医疗以及其他细分行业等多个领域,并推荐了使用IDEA、Vue和Springboot的技术栈。
|
1天前
|
分布式计算 Java API
Java 8带来了流处理与函数式编程等新特性,极大提升了开发效率
Java 8带来了流处理与函数式编程等新特性,极大提升了开发效率。流处理采用声明式编程模型,通过filter、map等操作简化数据集处理,提高代码可读性。Lambda表达式支持轻量级函数定义,配合Predicate、Function等接口,使函数式编程无缝融入Java。此外,Optional类及新日期时间API等增强功能,让开发者能更优雅地处理潜在错误,编写出更健壮的应用程序。
6 1
|
6天前
|
存储 关系型数据库 MySQL
一天五道Java面试题----第八天(怎么处理慢查询--------->简述Myisam和innodb的区别)
这篇文章是关于Java面试中关于数据库性能优化和MySQL特性的五个问题,包括处理慢查询、ACID特性保证、MVCC概念、MySQL主从同步原理以及MyISAM和InnoDB存储引擎的区别。
|
6天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
6天前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
13 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
|
11天前
|
Java
JAVA中public class和class的区别
JAVA中public class和class的区别
26 7