B+树真的不难,楼下菜大爷都能学得会的B+树!(数据结构可视化神器推荐)

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

最新整理面试题
在这里插入图片描述

上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题

最新整理电子书

在这里插入图片描述

最新整理大厂面试文档

在这里插入图片描述

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

讲b+树前,先调查一下它的血亲!一个都别想跑!来来来,给我排整齐给大家看看~

B树、B-树(嫌疑较大,留意)、B+树、B*树

一个普普通通的树(二叉树),非要搞这么多玩意,区别是啥:

| 姓名(术语) | 简介 |

| — | — |

| B树 | 多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中; |

| B-树 | 就是B树(没想到吧) |

| B+树 | 在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中; |

| B*树 | 在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3; |

秘闻;

  • 因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,所以人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树

💙前提条件,温故而知新💙


💨什么是AVL树

  • 平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。

💨什么是红黑树

  • 平衡二叉树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少。用于搜索时,插入删除次数多的情况下我们就用红黑树来取代AVL。

💨什么是二叉搜索树

举个例子,二叉搜索树来作为索引的案例:

在这里插入图片描述

现在来查找节点为5的节点,来看看需要几步:

在这里插入图片描述

没错,一共四步,但是要注意,一般索引是在内存中执行的,所以价格很昂贵!!在最坏的情况下磁盘读写次数==二叉搜索树的高度,这在实际应用中肯定是不行的,所以基于此,诞生了B树*(多路平衡树)来减少数的高度,那么🔻

💨什么是B树(多路平衡树)❓

B树其实最开始源于的是二叉树,二叉树是只有左右孩子的树,当数据量越大的时候,二叉树的节点越多,那么当从根节点搜索的时候,影响查询效率。所以如果这些节点存储在外存储器中的话,每访问一个节点,相当于进行了一次I/O操作。前面说过,为了减少磁盘的 I/O 操作才有的B树,那么来看下B树有什么特点:

还是上面那个问题,来看下B树怎么个解决方案:

在这里插入图片描述

ps:K被称为B树的阶,K的值取决于磁盘页(内存的最小存储单位)的大小

在这里插入图片描述

假设搜索节点6,步骤:

  • ①定位到根节点(9),6比9小,所以在左子树找

  • ②定位到节点(4,7),6在4、7中间,所以在中间子树找

  • ③定位到(5,6),6比5大,所以和该节点的右边比较

  • ④找到,over

可以看出,在B树里面的比较次数也很多,但是❗减少了I/O操作,因为B树可以减少树的高度,也就减少了磁盘读写次数,在实际应用场景,B树对性能的提升非常明显。

最后,大家可能之前都知道B树的特点,现在应该会更好理解(m是树的高度,k是树的阶):

  • 1.根结点至少有两个子节点。

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

  • 3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m。

  • 4.所有的叶子结点都位于同一层。

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

🧡b+树到底是啥玩意?就这?🧡


在这里插入图片描述

前面说了这么多,到这里才步入主题,先来调查一下…

在这里插入图片描述

经过菜菜调查发现,B+树的出现带来了这些优点:

1)B+树的磁盘读写代价更低

B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B

树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了;

2)B+树查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

3)B+树便于范围查询(最重要的原因,范围查找是数据库的常态)

B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低;

B+树最大的性能问题在于会产生大量的随机IO,主要存在以下两种缺点:

  • 主键不是有序递增的,导致每次插入数据产生大量的数据迁移和空间碎片;
  • 即使主键是有序递增的,大量写请求的分布仍是随机的;

看下B+树长什么样子

在这里插入图片描述

如果要查找0007的话,查找方式如下

在这里插入图片描述

并且,为什么MySQL数据库索引选择使用B+树?

B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索引中可以存放更多的节点。减少更多的I/O支出。因此,B+树成为了数据库比较优秀的数据结构,MySQL中MyIsAM和InnoDB都是采用的B+树结构。不同的是前者是非聚集索引,后者主键是聚集索引。

看下B+树的顺序查找:

在这里插入图片描述

B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。B+树支持range-query(区间查询)非常方便,而B树不支持。

B+ 树通常用于数据库和操作系统的文件系统中

NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。

💚B树、B+树都知道了,B*树不了解一下?💚


先看下百度的回答:

B_树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;B_树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针:

找的网图(大佬莫怪)

在这里插入图片描述

B+树和B*树的区别是啥?

  • B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

  • B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

可以看出,B*树分配新结点的概率比B+树要低,空间使用率更高;

💜数据库索引数据结构了解下?💜


MySql索引数据结构(BTREE和Hash),也来简单了解下 BTREE和Hash的区别

  • 1、Hash 索引,其检索效率非常高,索引的检索可以一次定位。BTREE 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问

  • 2、Hash 索引仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询。

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

满足"=",“IN"和”<=>"查询,不能使用范围查询。

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

[外链图片转存中…(img-PwTcckNd-1715812547555)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B是一种平衡的多路搜索,被广泛应用于数据库索引中。它的索引实现和可方法如下: 1. 索引实现: - B的每个节点可以包含多个关键字和对应的指针。关键字按照升序排列。 - 每个节点的关键字数量必须在一个范围内,通常是至少2/3*M个关键字,至多M个关键字(M是节点的最大度数)。 - B的根节点至少有两个子节点,除非它是叶子节点。 - 插入数据时,先在叶子节点找到合适的位置插入,并保持节点的关键字仍然有序。 - 如果插入后某个节点的关键字数量超过了M,需要进行分裂操作,将中间的关键字提升到上一层节点中,并将左右两个子节点分别作为新的子节点。 - 删除数据时,先找到对应的关键字,如果关键字在叶子节点,则直接删除。如果不在叶子节点,则找到其后继关键字,将后继关键字替换到当前节点中,并在后继关键字所在的叶子节点中递归删除后继关键字。 2. 可方法: - 可以使用状图来可B的结构,将根节点放在最上面,每一层节点依次从左到右展示,并用连接线连接各个节点。 - 每个节点的关键字可以在对应的节点下方以水平方向展示,关键字按照从左到右的顺序排列。 - 可以使用不同的颜色来区分叶子节点和非叶子节点,以及当前查询的关键字的位置。 - 可以通过点击节点来展开或收拢节点的子节点,以便更好地展示的结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值