腾讯、阿里面试题 了解B+树吗?

article/2025/9/3 2:53:04

腾讯、阿里面试题: 了解B+树吗?

由于MySQL的索引结构是B+树,所以B+树是大厂的高频面试题,想理解B+树,最好先理解B树,下面详细介绍B树、B+树

B树

  • B树的概念

    B树又称为B-树,是一种平衡多路查找树,描述B树,一般需要指定其阶数 M M M,阶数指的是一个节点包含的子节点最大数量。当 M M M取2的时候,就是常见的二叉树

    其有如下性质:

    • 每个节点最多有 M − 1 M-1 M1个关键字
    • 除根节点外,其余的节点至少有 c e i l ( M / 2 ) − 1 ceil(M/2)-1 ceil(M/2)1个关键字( c e i l ceil ceil向上取整函数)
    • 每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它
    • 所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
  • B树的插入操作

    如下描述是B树的插入算法,相对来说比较简单

    1. 找到关键字的插入位置,一定是叶节点位置,进行插入操作

    2. 插入后,如果当前节点的关键字数量小于等于 M − 1 M-1 M1,则结束,否则执行步骤3

    3. 进行分裂操作,当前节点按中间关键字分裂成三部分,中间关键字插入到父节点中,

    左边部分,成为中间关键字的左节点,右边部分成为中间关键字的右节点,然后

    当前节点指向父节点,转到2,执行递归操作。

    下面是一个5阶B树的分裂过程,上面图是分裂前,下面图是分裂后

  • B树的构建过程

    下面以构建一个5阶树,介绍B树的构建过程。

    • 依次插入关键字3,5, 2, 6

    • 插入4的时候,由于当前节点关键字数量等于M(5),需要进行分裂操作

    • 依次插入关键字1,8,7,9插入9的时候又进行了分裂

    • 依次插入关键字10,11,12插入12的时候又进行了分裂过程

    • 插入关键字13,14,15,16,17,中间插入15的时候进行了分裂操作

    • 最后插入18,进行了两次分裂操作

      其实插入的过程会发现,顺序插入空间效率最差,比如[11,12]节点,就插入不了任何元素.

  • B树的删除过程

    B树的删除算法较为复杂,下面首先介绍算法,之后结合实例,阐述

    1. 查找关键字,如果不存在,结束,否则进入步骤2.
    2. 如果关键字处于叶节点,直接删除。如果关键字处于非叶子节点,则用其前继关键字(前继关键字一定位于叶节点)覆盖要删除的关键字,之后删除后继关键字,将当前节点指向包含后继关键字的节点。以上两种情况,均最后转入步骤3
    3. 如果当前节点关键字数量大于等于 c e i l ( M / 2 ) − 1 ceil(M/2)-1 ceil(M/2)1,则结束,否则转入4
    4. 如果兄弟节点(不论左兄弟,还是右兄弟),关键字数量大于 c e i l ( M / 2 ) − 1 ceil(M/2)-1 ceil(M/2)1,则父节点中对应的关键字下移到当前节点,兄弟节点对应的关键字上移到父节点,结束。若无兄弟节点关键字数量大于 c e i l ( M / 2 ) − 1 ceil(M/2)-1 ceil(M/2)1,则转入步骤5
    5. 合并操作,将父结点中关键字下移与当前结点及它的兄弟结点中的官架子合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。当前节点指向父节点,重复2,进行递归操作。

    下面是一个5阶数的删除过程实例

    原B树如下图所示

    • 删除关键字7

      其前继关键字(类似于平衡二叉树的前继节点,其实也可以为后继节点)为6,覆盖删除后,当前节点只有一个关键字5,而其左兄弟节点有3个关键字节点大于2.所以3上移,4下移到当前节点.

    • 删除关键字18

      删除关键字18,其实是一个复杂的过程,删除完之后,没有兄弟节点关键字数量大于2,所以进行合并操作左兄弟节点[14,15],父节点中的16,和当前节点合并成一个新节点[14,15,16,17],合并后父节点由于只剩13,所有又要与其父节点关键字,左兄弟节点合并,构造一个新的节点,最后结果如下

  • B树的优缺点

    B树主要的优点是相对于二叉树,每个节点包括更多的关键字,所以其树高相对较低,查找效率很高.

B+树

参考文章

B树和B+树的插入、删除图文详解
平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了


http://chatgpt.dhexx.cn/article/1qJ8PGas.shtml

相关文章

2021.3.10阿里面试题

获得第一行 n m ktempinput() templisttemp.split(" ") nint(templist[0]) mint(templist[1]) kint(templist[2])获得城市二维列表city[] for i in range(n):temp input()templist list(temp)if in templist: #找到起始位置,然后记录下标&…

阿里巴巴面试题- - -JVM篇(十四)

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,…

总结一下软通外派阿里的面试题

前段时间,面了几家大外派到阿里的项目,所以和大家分享一下面试题 上来就是老套路 面试官:说下你们项目的流程 果咩: 巴拉巴拉。。。。 面试官:你们项目如何使用redis高可用的 果咩:可以使用哨兵模式和C…

阿里巴巴一面 :十道经典面试题解析

1. 用到分布式事务嘛?为什么用这种方案,有其他方案嘛? 什么是分布式事务 谈到事务,我们就会想到数据库事务,很容易就想到原子性、一致性、持久性、隔离性。 分布式事务跟数据库事务有点不一样,它是指事务的参与者、支持事务的服务器、资源…

46 道阿里巴巴 Java 面试题,你会几道?

做技术的有一种资历,叫做通过了阿里的面试。 这些阿里 Java 相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。 希望对大家帮助,祝面试成功,有…

最新出炉的阿里巴巴面试题及答案汇总(513页)

前言 秋招已经结束了,不知道各位有没有拿到自己心仪的offer?最近有不少粉丝去阿里巴巴面试了,回来之后我整理成了一份手册java面试时常用到的面试题(附答案)那么今天分享给大家,祝愿大家都能找到满意的工作…

阿里云面试题

转自:https://yq.aliyun.com/articles/6656 今天为大家分享的是《阿里巴巴常考面试题及汇总答案(上篇)》 原文如下: 一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答&…

历年阿里面试题汇总(2017年不断更新中)

Volatile的特征: A、禁止指令重排(有例外) B、可见性 Volatile的内存语义: 当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。 当读一个volatile变量时,JMM会把线程对应的…

iOS-阿里面试题

先把这个几个面试写出来,各位看官可以试着去网上找找答案。 这些是《蚂蚁金服》的面试题 问题缩减如下: 1:在KVO中,他是怎么知道监听的对象发生了变化? 2:字典的工作原理 ?怎100w个中是怎么快…

最全阿里面试题:已拿offer,阿里P8岗位完整阿里技术面试题目,这些面试题你能答出多少

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如 何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是 影响数据库并发访问性能的一个重要因素&#…

阿里 90 道常问面试题及答案(软件测试岗位)

目录 1、问:你在测试中发现了一个 bug,但是开发经理认为这不是一个 bug,你应该怎样解决? 2、问:给你一个网站,你如何测试? 3、在搜索引擎中输入汉字就可以解析到对应的域名,请问如…

阿里面试题及答案

一面 1、自我介绍下自己,不超过3分钟(实际上我的自我介绍不到一分钟) 2、你感觉比本科阶段自己进步了多少,有哪些进步 3、研究生期间最大的进步是什么 4、你觉得你适合从事哪个方向的开发 5、synchronized与lock的区别&#xff0…

最新阿里高级Java面试题(首发,70道,带详细答案)

阿里巴巴 整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害。下面题目都带超详细的解答,详情见底部。 1、java事件机制包括哪三个部分?分别介绍。 2、为什么要使用线程池? 3、线程池有什么作用? …

阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题

阿里巴巴2022年Java架构师岗面试题(正式版) 这不马上就是金三银四的面试跳槽季了嘛,小编也是通过一些小手段为大家拿到了一份阿里巴巴2022年Java架构师岗面试题(正式版)现在分享给大家,这份资料也是阿里面试…

vue打包找不到js或css文件

修改vue.config.js文件中的publicPath 把 / 改成 ./

Vue打包优化篇-CDN加速

优化原因 在没有使用cdn加速之前打包后数据如下,可以看出element-ui、vue、vuex、vue-router这些依赖都打进chunk-vendors.js中导致体积很大,假设再来很多依赖项是不是更大,同时也会影响单页面应用首屏加载速度,所以这里采用一种打…

vue打包后dist的使用

发现问题 vue项目完成打包出dist后准备打开index.html,发现居然页面是一片空白,f12一片报红。 分析问题 经过多次网上查询后发现这是由于vue打包时,脚手架会帮你配置好大量参数,但其中路径publicPath被配置为了"/",需…

vue打包的文件加上版本号

为什么要加版本号?因为有时候打包文件部署上线后发现线上没更新,原因是因为线上环境有缓存,故加上版本号可解决此问题! 在vue.config.js配置: 输出文件名js文件增加版本号: output: {filename: js/[name]…

解决vue打包后去掉console

方法一:使用插件 babel-plugin-transform-remove-console npm install babel-plugin-transform-remove-console --save-dev 安装插件生产环境:在项目的babel.config.js的plugin中添加节点。 let transformRemoveConsolePlugin [];if (process.env.N…

Vue打包路径配置

1. 配置文件 module.exports {// ......// 相对路径都是相对于index.js所在的目录config开始的build: {// index,assetsRoot两个路径基本不用改动,只是用于文件打包存放的路径// index.html的路径index: path.resolve(__dirname, ../dist/index.html),// js,css,f…