简单剖析B树(B-Tree)与B+树

简单剖析B树(B-Tree)与B+树注意 首先需要说明的一点是 B 树就是 B 树 没有所谓的 B 减树引言 我们都知道二叉查找树的查找的时间复杂度是 logN 其查找效率已经足够高了 那为什么还有 树和 树的出现呢 难道它两的时间复杂度比二叉查找树还小吗 答案当然不是 树和 树的出现是因为另外一个问题 那就是磁盘 众所周知 操作的效率很低 那么 当在大量数据存储中 查询时我们不能一下子将所有数据加载到

注意:首先需要说明的一点是:B-树就是B树,没有所谓的B减树

引言

  这样就引出来了一个新的查找树结构 ——多路查找树。 根据AVL给我们的启发,一颗平衡多路查找树(B~树)自然可以使得数据的查找效率保证在O(logN)这样的对数级别上。

下面来具体介绍一下B树(Balance Tree),

B树

一个m阶的B树具有如下几个特征:B树中所有结点的孩子结点最大值称为B树的阶,通常用m表示。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。

1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子,其中 ceil(m/2) ≤ k ≤ m 3.每一个叶子节点都包含k-1个元素,其中 ceil(m/2) ≤ k ≤ m 4.所有的叶子结点都位于同一层。 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分 6.每个结点的结构为:(n,A0,K1,A1,K2,A2,… ,Kn,An) 其中,Ki(1≤i≤n)为关键字,且Ki 
  

查询

插入

例如:在下面的B树中插入key:4

这里写图片描述

第一步:检索key插入的节点位置如上图所示,在3,5之间;

最终结果如下图:虽然插入比较麻烦,但是这也能确保B树是一个自平衡的树
这里写图片描述

删除

 (1)找出该关键字所在的结点。然后根据 k所在结点是否为叶子结点有不同的处理方法。 (2)若该结点为非叶结点,且被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指的子树中 找出最小关键字Y,代替key[i]的位置,然后在叶结点中删去Y。 

因此,把在非叶结点删除关键字k的问题就变成了删除叶子结点中的关键字的问题了。

(1)如果被删关键字所在结点的原关键字个数n>=ceil(m/2),说明删去该关键字后该结点仍满足B树的定义。 这种情况最为简单,只需从该结点中直接删去关键字即可。 (2)如果被删关键字所在结点的关键字个数n等于ceil(m/2)-1,说明删去该关键字后该结点将不满足B树的定义, 需要调整。 调整过程为: 如果其左右兄弟结点中有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的关键字数目大于 ceil(m/2)-1。则可将右(左)兄弟结点中最小(大)关键字上移至双亲结点。而将双亲结点中小(大)于该上 移关键字的关键字下移至被删关键字所在结点中。 如果左右兄弟结点中没有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的关键字数目均等于 ceil(m/2)-1。这种情况比较复杂。需把要删除关键字的结点与其左(或右)兄弟结点以及双亲结点中分割二者 的关键字合并成一个结点,即在删除关键字后,该结点中剩余的关键字加指针,加上双亲结点中的关键字Ki一起, 合并到Ai(是双亲结点指向该删除关键字结点的左(右)兄弟结点的指针)所指的兄弟结点中去。如果因此使双亲 结点中关键字个数小于ceil(m/2)-1,则对此双亲结点做同样处理。以致于可能直到对根结点做这样的处理而使 整个树减少一层。 

总之,设所删关键字为非终端结点中的Ki,则可以指针Ai所指子树中的最小关键字Y代替Ki,然后在相应结点中删除Y。对任意关键字的删除都可以转化为对最下层关键字的删除。

这里写图片描述

注意

B+ 树

  B+树是B树的变种,有着比B树更高的查询效率。下面,我们就来看看B+树和B树有什么不同

特点

一个m阶的B+树具有如下几个特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据 都保存在叶子节点。 2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小 自小而大顺序链接。 3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。 

查找

  B+树的优势在于查找效率上,下面我们做一具体说明:
  首先,B+树的查找和B树一样,类似于二叉查找树。起始于根节点,自顶向下遍历树,选择其分离值在要查找值的任意一边的子指针。在节点内部典型的使用是二分查找来确定这个位置。
  (1)、不同的是,B+树中间节点没有卫星数据(索引元素所指向的数据记录),只有索引,而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少
  B树的卫星数据:
  这里写图片描述
  B+树的卫星数据:
  这里写图片描述
  需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
  
  (2)、其次,因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定
  (3)、在范围查询方面,B+树的优势更加明显
  B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,知道查找到范围的上限即可。整个过程比较耗时。
  而B+树的范围查找则简单了许多。首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,整个过程简单许多,效率也比较高。
  例如:同样查找范围[3-11],两者的查询过程如下:
  B树的查找过程:
  这里写图片描述
  B+树的查找过程:
  这里写图片描述


































插入

   B+树的插入与B树的插入过程类似。不同的是B+树在叶结点上进行,如果叶结点中的关键码个数超过m,就必须分裂成关键码数目大致相同的两个结点,并保证上层结点中有这两个结点的最大关键码。

删除

  B+树中的关键码在叶结点层删除后,其在上层的复本可以保留,作为一个”分解关键码”存在,如果因为删除而造成结点中关键码数小于ceil(m/2),其处理过程与B-树的处理一样。在此,我就不多做介绍了。

总结

B+树相比B树的优势
  1.单一节点存储更多的元素,使得查询的IO次数更少;
  2.所有查询都要查找到叶子节点,查询性能稳定;
  3.所有叶子节点形成有序链表,便于范围查询。






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226186.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午7:38
下一篇 2026年3月17日 上午7:39


相关推荐

  • MyEclipse建立JVM内存大小「建议收藏」

    MyEclipse建立JVM内存大小

    2022年1月16日
    54
  • 钉钉推出全球首个为AI打造的工作智能操作系统Agent OS

    钉钉推出全球首个为AI打造的工作智能操作系统Agent OS

    2026年3月16日
    3
  • clion 2021 激活码_最新在线免费激活

    (clion 2021 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    55
  • Pycharm安装python包的四种常用方式

    Pycharm安装python包的四种常用方式提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档文章目录前言一 鼠标点击安装二 命令方式安装总结前言 Pycharm 使用过程中总是需要根据任务安装一些 python 的包 有时候还会遇到某些包安装失败 今天总结了四种常见的安装方式 希望在一种方式安装失败的情况下 可以换其他方式进行尝试安装 一 鼠标点击安装 1 PythonInterp 按照上面的序号进行操作即可 2 PythonPackag 二 命令方式安装 1 Anaconda 命令安装使用下面

    2026年3月27日
    3
  • java set集合详解

    java set集合详解参考地址:https://blog.csdn.net/qq_33642117/article/details/52040345一,SetSet:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。对象的相等性  引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方…

    2022年5月18日
    43
  • vscode自动补全函数跳转

    vscode自动补全函数跳转vscode 目录下 c cpp properties json 文件 configuratio 里 includePath 设置 configuratio name Linux includePath workspaceFol defines com

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号