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

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

B树

  • B树的概念

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

    其有如下性质:

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

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

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

    2. 插入后,如果当前节点的关键字数量小于等于M−1M-1M−1,则结束,否则执行步骤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. 如果当前节点关键字数量大于等于ceil(M/2)−1ceil(M/2)-1ceil(M/2)−1,则结束,否则转入4
    4. 如果兄弟节点(不论左兄弟,还是右兄弟),关键字数量大于ceil(M/2)−1ceil(M/2)-1ceil(M/2)−1,则父节点中对应的关键字下移到当前节点,兄弟节点对应的关键字上移到父节点,结束。若无兄弟节点关键字数量大于ceil(M/2)−1ceil(M/2)-1ceil(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*树 理解其中一种你就都明白了

腾讯、阿里面试题 了解B+树吗?相关推荐

  1. 腾讯产品面试题 | 如何把剃须刀卖给张飞?

    这是2018年被求职者评为"腾讯淘汰率最高"的腾讯产品面试题,最近有用户在后台留言"这道题又重出江湖了",但思来想去都觉得是个考察销售能力的题,希望给出产品角度 ...

  2. [剑指offer]面试题18:树的子结构

    面试题18:树的子结构 题目:输入两棵二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下: struct BinaryTreeNode {int value;BinaryTreeNode *l ...

  3. 淘汰率最高的腾讯产品面试题

    这是2018年被求职者评为"腾讯淘汰率最高"的腾讯产品面试题,最近有用户在后台留言"这道题又重出江湖了",但思来想去都觉得是个考察销售能力的题,希望给出产品角度 ...

  4. C语言单链表实现FCFS算法,2014腾讯实习笔试题

    2014腾讯实习笔试题 1. 关于二叉树,下面说法正确的是() A. 对于N个节点的二叉树,其高度为nlog2n; B. 一个具有1025个节点的二叉树,其高度范围在11~1025之间 C. 二叉树的 ...

  5. 腾讯python面试题_面试题 | 腾讯数据分析面试题分享

    原标题:面试题 | 腾讯数据分析面试题分享 annatx | 作者 高级农民工 | 来源 今天给各位分享两道数据分析试题, 这是腾讯数据分析面试官在面试时考察候选人喜欢出的题,属于硬性技能考察题目,特 ...

  6. 【重点递归】剑指offer——面试题18:树的子结构

    剑指offer--面试题18:树的子结构 Solution1: 此题答案是抄的书上的,要记忆并熟练运用关于二叉树的递归思想!!! /* struct TreeNode {int val;struct ...

  7. 2021届腾讯实习笔试题

    第一题 #include<iostream>using namespace std;void getNode(int x, int k);int main0() {int q;cin &g ...

  8. 阿里、华为、腾讯Java技术面试题精选

    有位大神总结了阿里.华为.腾讯Java技术面试题精选,对此梦想菌感激涕零,无以为报,大家一起快来学习下吧! JVM的类加载机制是什么?有哪些实现方式? 类加载机制: 类加载指的是将类的class文件中 ...

  9. 08年朗讯(青岛)笔试题

    08年11月11日南京区朗讯(青岛)笔试题 第一部分:智力题. 1.兔子繁殖--斐波那契数列. 2.数据推理题. 3.抓球. 第二部分:技术题 一.C++ 1.写出输出结果. int main() { ...

最新文章

  1. 小手段:开启 GNOME 的窗口分组效果
  2. linspace python_python np.linspace
  3. phpcms v9 搜索页显示自定义字段
  4. Redis 实战之主从复制、高可用、分布式
  5. go设计模式之单例模式
  6. Windows Server 2008 故障转移群集简介
  7. 使用GDAL库中的RPC校正问题
  8. 解决matlab的警告: MATLAB 先前因底层图形错误而崩溃。
  9. 几十个珍藏的网站,相信你会用到的
  10. 服务器系统2008 64,服务器主机server 2008 R2 操作系统漏洞
  11. 有没有想过Surface只是伪刚需?
  12. mysql 查看环境变量_MySQL的环境变量
  13. numpy操作技巧二三事
  14. python 方差分析_使用Python的重复测量方差分析
  15. 搜索战火重燃,夸克升级个人云服务做网盘的逻辑是什么?
  16. 微信 for Windows 内测3.3.0版本,能刷朋友圈啦!
  17. 2022软件测试最强晋级之路
  18. 2015062402 - 求伯君
  19. 2022年中国半导体设备市场规模达到1728.41亿元,市场迎来新一轮上升周期
  20. 模拟接听电话的方法,兼容华为android5.0以上设备

热门文章

  1. 信息系统建设和服务能力评估CS1和CS2的申请条件!
  2. 电商平台选择积分抵扣的两个原因
  3. mysql curd_mysql 基础之CURD
  4. JQuery-淘宝精品
  5. iOS录屏直播(三)AppGroup
  6. Mysql数据库的使用方法
  7. Microsoft SQL Server 2005 中安装 Northwind 和 pubs 示例数据库
  8. 为中国智造注入新动力 金智维获高瓴创投领投逾2亿元B轮融资
  9. 【Unity3D 教程系列第 19 篇】Unity 中根据长方体模型的尺寸添加碰撞盒 BoxCollider
  10. 本地计算机架设http服务器,Http File Server(简易Http服务器服务端)