首页 > 其他分享 >图解B+树的插入与删除

图解B+树的插入与删除

时间:2024-07-30 11:31:16浏览次数:16  
标签:关键字 结点 删除 索引 叶子 插入 key 图解

B+树的定义

上一篇我们介绍了B树, B+树与B树最大的不同是, B+树所有的关键字都存储在叶子节点, 中间节点仅作为索引.
关于B+树的定义以及解释要比B树多很多, 可能这也是因为B+树在实际使用中要比B树广泛很多. 我这里直接参考了nullzx对B+树的定义以及视图, 我主要修改我的B树的代码实现, 希望有用.

各种资料上B+树的定义各有不同, 一种定义方式是关键字个数和孩子结点个数相同. 这里我们采取维基百科上所定义的方式, 即关键字个数比孩子结点个数小1, 这种方式是和B树基本等价的. 上图就是一颗阶数为4的B+树.

除此之外B+树还有以下的要求.

  1. B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点. 根结点本身即可以是内部结点, 也可以是叶子结点. 根结点的关键字个数最少可以只有1个.
  2. B+树与B树最大的不同是内部结点不保存数据, 只用于索引, 所有数据(或者说记录)都保存在叶子结点中.
  3. \(m\) 阶B+树表示了内部结点最多有 \(m-1\) 个关键字(或者说内部结点最多有 \(m\) 个子树), 阶数 \(m\) 同时限制了叶子结点最多存储 \(m-1\) 个记录.
  4. 内部结点中的key都按照从小到大的顺序排列, 对于内部结点中的一个key, 左树中的所有key都小于它, 右子树中的key都大于等于它. 叶子结点中的记录也按照key的大小排列.
  5. 每个叶子结点都存有相邻叶子结点的指针, 叶子结点本身依关键字的大小自小而大顺序链接.

B+ 树的插入操作

B+树的插入操作

  1. 若为空树, 创建一个叶子结点, 然后将记录插入其中, 此时这个叶子结点也是根结点, 插入操作结束.

  2. 针对叶子类型结点:根据key值找到叶子结点, 向这个叶子结点插入记录. 插入后, 若当前结点key的个数小于等于 \(m-1\), 则插入结束. 否则将这个叶子结点分裂成左右两个叶子结点, 左叶子结点包含前 \(\frac{m}{2}\) 个记录, 右结点包含剩下的记录, 将第 \(\frac{m}{2}+1\) 个记录的key进位到父结点中(父结点一定是索引类型结点), 进位到父结点的key左孩子指针向左结点,右孩子指针向右结点. 将当前结点的指针指向父结点, 然后执行第3步.

  3. 针对索引类型结点:如果叶子节点发生分裂, 会在索引节点中插入关键字. 若当前索引结点key的个数小于等于 \(m-1\), 则插入结束. 否则, 将这个索引类型结点分裂成两个索引结点, 左索引结点包含前 $ \frac{m-1}{2}个key$, 右结点包含 \(m-\frac{m-1}{2}个key\), 将第 \(\frac{m}{2}\)个key进位到父结点中, 进位到父结点的key左孩子指向左结点, 进位到父结点的key右孩子指向右结点. 将当前结点的指针指向父结点, 然后重复第3步.

下面是一颗5阶B树的插入过程, 5阶B数的结点最少2个key, 最多4个key.

是不是

标签:关键字,结点,删除,索引,叶子,插入,key,图解
From: https://www.cnblogs.com/wevolf/p/18331997

相关文章

  • 删除不必要的 Seaborn Boxplot y 轴缩放
    我正在使用Seaborn生成许多箱线图。大多数都使用正确的线性y轴刻度生成良好,但是有些在图的左上角有一个值(例如1e-7+7.0334e-1),我认为这是一个缩放器,因此y轴标签看起来确实错误(显示〜5.8而不是〜0.7)。有没有办法可以在没有这个缩放因子的情况下强制显示y轴刻度?提前致谢......
  • T-SQL——关于将有序数据插入临时表
    目录0.背景1.解决方案1:使用ROW_NUMBER()OVER(ORDERBY……)2.解决方案2:给临时表创建聚集索引3.参考shanzm-2024年7月30日0.背景问题:需要将排序后的数据结果集插入到临时表中,少量数据发现没有任何问题,插入到临时表中的结果集保留了插入前的顺序。但是当待插入的临时表......
  • C++提高编程—2、STL—基础知识以及Vector容器的数据插入和遍历
    2.1STL的诞生2.2STL的基本概念2.3STL的六大组件2.4STL中容器、算法、迭代器2.5容器算法迭代器初识2.5.1vector存放内置数据类型#include<iostream>usingnamespacestd;#include<vector>#include<algorithm>//标志算法头文件//vector容器存放内置......
  • Python 在PDF中添加、替换、或删除图片
    PDF文件中的图片可以丰富文档内容,提升用户的阅读体验。除了在PDF中添加图片外,有时也需要替换或删除其中的图片,以改进视觉效果或更新信息。本文将提供以下三个示例,介绍如何使用Python操作PDF文件中的图片:Python在PDF中添加图片Python替换PDF中的图片Python删除PDF中的图片......
  • Centos7系统根分区空间小,home空间大。怎么删除home分区 增加到root
    查看分区df-Th删除home分区或注释掉vi/etc/fstab卸载home分区umount /home查看逻辑分区lvsca移除/home的lv分区lvremove/dev/mapper/centos-home  查看一下vg设置vgdisplay可以看到空闲出来的空间把空闲出来的全部拓展到根目录下lvextend-l+100%free......
  • 从Python中的数据框中删除不必要的数据
    所以我这里有一个dat文件,我正在使用Python来读取它。在整个文件中,有一些不必要的行,例如BEGIN等,而我真正想开始阅读的部分是从数据帧开始。因此,我想检查在Python中执行此操作的最佳方法是什么,并且只阅读数据框何时开始?谢谢!以下是使用Python从数据......
  • idea 删除项目
    今天学习javadoc时在cmd命令提示符中总显示说“不是内部或外部命令,也不是可运行的程序或批处理文件”,因此上网查找解决办法,正所谓一顿操作猛如虎一看结果二百五。那些方法不仅没能解决问题,反而使原本好好的javaclass成为咖啡杯图标从而不能运行。多次修改无果后,决定删除项目重来......
  • 如何在Markdown中插入公式
    如何优雅地在Markdown中输入数学公式参考:作者:咕噜咕噜酱链接:原文链接版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎2.5中国大陆许可协议进行许可。对于一些理科生来说,在学习数学知识的时候,在计算机上写公式是比较头疼的事情。好在Markdown支持LATEX公式输入,在......
  • 如何恢复 Excel 文件 [未保存/覆盖/删除]
    MicrosoftExcel是Microsoft用户使用的强大办公软件。用户可以创建各种工作簿来提高工作效率。但是,当您意外删除一些重要的Excel文件或由于电源故障或软件崩溃导致Excel文件未保存时,您可能会感到不知所措。在这种情况下,您可以浏览我们的帖子并找到适合您恢复Excel文件......
  • 从文档中删除文本,只留下模板
    我使用doctr库来识别文本并获取pdf文档中文本的坐标。但是,我根本不需要此文档中的文本,只需要文档模板。我正在寻找如何删除文本的解决方案,并决定最好遍历获得的坐标并删除这些坐标内的文本。我开始研究如何在Python中实现这一点。不幸的是,信息不多,但我设法找到了这......