B树(BTree)与B+树(B+Tree)

news2025/1/11 15:51:23

B树是什么?

B树是一种多路平衡查找树
平衡,指的是子树高度相同(即所有叶子结点均在同一层),即每个结点的平衡因子均等于0
多路,就是它除了根结点外(之所以根结点的分叉数不限定,是因为当整棵树只有1个关键字,根结点只能有2个分叉),其余每个结点都至少有m/2向上取整 个分叉。(m是它的阶,同时m也是结点的最大分叉数,也可以理解为每个结点最多有m棵子树)

(1)所有结点中,拥有孩子个数最多的,也就是分叉数最大值,称为整棵B树的阶。
例如:结点最多有3个分叉,则称为3阶B树
(2)每个结点中包含的多个数据元素,称之为“关键字”,当某个结点有m棵子树的时候,则一定有m-1个关键字。
如下图中有3个分叉的结点,只能在缝隙中塞3-1=2个关键字
在这里插入图片描述
(3)若根结点不是终端结点(终端结点是叶子结点的再上一层结点,这里的叶子结点其实是不存在的,是代表查找失败的结点,不携带任何关键字信息,终端结点才是真实有关键字存放的“叶子结点”,但是它又称为终端结点),则它最少都有2棵子树(也就是最少都有一个关键字才能占一个结点,一个关键字左右又可以产生分叉,所以最少都有两棵子树)
(4)跟二叉排序树有点类似,B树也遵循左小右大原则,但是由于它一个结点里会有多个关键字,所以它也有多个范围。如下图:
在这里插入图片描述

B树的查找过程:

假设X=8
1:根据查找目标X从根结点12开始比较,比12小,往左子树,比12大,往右子树
2:到了左子树的根结点,顺序依次比较(也可以采用二分查找的方法)6,9,10;发现9<X<10;于是顺着这个分叉指针往下,但是发现为null,即不存在这个范围。这时候就知道B树中不包含对应关键字,返回查找失败。

(5)结点内的数据从左到右递增有序。

(6)除根结点外,所有非叶子结点至少有m/2(向上取整) 个分叉(棵子树),即至少含有 m/2(向上取整) -1 个关键字。
为什么非叶子结点至少有 m/2 (向上取整)个分叉(棵子树)呢?

B树的生成和插入:

假设某棵B树的阶设为m=5, 即每个结点至多有4个关键字,在插入关键字的时候,会首先通过上述的B树查找方式,定位新关键字应该存放在哪个位置,然后把关键字塞进去,但是这会有一个问题,假如对应的终端结点已经有4个关键字了,又要塞进来一个,导致不满足5阶B树的性质,就会引起“分裂”。(即当插入新的关键字后,对应终端结点的关键字数小于等于m-1,则插入成功,当某结点关键字数会大于m-1时,该结点就必须分裂),如下图所示:
在这里插入图片描述
所以,每个结点都是被分裂出来的,而发生分裂的时候,就保证了该结点一定是满了要溢出来了,分裂后的每个结点都一定一定会有m/2(向上取整)-1个关键字(根结点除外),那么肯定会有 m/2 (向上取整)个分叉(棵子树)。
⚠️:并不是每次分裂,树都会长高一层,必须是分裂引起了根结点的分裂,树才会长高一层,如果没影响到根结点分裂,那么不管怎么分裂,树都不会长高。

(7)B树中的结点中都包含了关键字对应记录的真实存储地址(一般B树中关键字都是ID,UserId之类的东西)。所以在查找中,某一层匹配了目标关键字,则马上拿着关键字的存储地址去磁盘中找。

(8)既然插入是新增,那么删除肯定对应着合并操作。但是删除后还要维持着B树的特性,所以要看针对删除的关键字的位置进行处理

B树的删除:

还是以上面的5阶B树为例,设要删除的关键字是X
类型1:X处于终端结点,且(删除前的)终端结点的关键字个数>= m/2(向上取整),则直接删除。
在这里插入图片描述

类型2:X处于终端结点,但终端结点的关键字个数刚好是= m/2(向上取整),删掉一个后不满足B树定义,这个时候就要考虑如何补上这个空缺。又分为父子换位大法和拉爹下水大法

父子换位大法:当某个结点删除后关键字不够支撑这棵树的定义,看看该结点左右兄弟有没有多余的可以借用的结点,如果有,就把借用的那个兄弟的关键字抬上去父结点,把父结点对应的关键字填补回不满足定义的那个结点。

在这里插入图片描述

拉爹下水大法:当左右兄弟家的关键字数也是勉强够自己支撑,匀不出来,这个时候只能拉爹下水,一起支撑这棵树

在这里插入图片描述

类型3:X处于非终端结点,则用X的前驱或者后继关键字顶替X的位置,然后把对应的前驱和后继关键字删掉,变成删除终端结点的情况。

优缺点

优:在查询中,外存也就是磁盘IO是最低效率的,而树的结构在数据量比较大的时候,一般都选择链式存储,链式存储就会使得数据分散在磁盘的各个角落,要不停进行寻道读取的磁盘IO,而使用B树,由于每一个结点放多个关键字数据,很大程度上压缩了树的深度,每一个结点采用连续存储的数组形式,读入内存后查询速度大大提升,同时能够减少IO次数,进而提升查询速度。
缺:部分关键字在非终端结点中,部分关键字在终端结点,所以没办法进行范围查询,同时又因为每个结点包含了关键字的存储信息,占用了一部分的空间,注定会影响每个结点的的关键字个数,进而没有把磁盘IO优化到最优。

B+树

B+树是B树的变形,而且它是数据库底层很重要的一种数据结构。
(1)非叶子结点不包含关键字的存储地址。
(2)一个关键字对应一棵子树,即一个关键字屁股后面连着一个分叉。所以n个关键字的结点包含n棵子树。

B树中的分叉是夹在关键字中间的,这是判断题目中的树是B还是B+最突出的区别,看分叉的位置

(3)⚠️根结点至少要有两棵子树(两个分叉),分支结点至少要有 m/2(向上取整)棵子树。

B树允许根结点仅有1个关键字,B+树要有2个

(4)所有关键字(包括出现在非叶子结点上的),都会出现在叶子结点中,并且叶子结点中按照关键字大小排序,且用链表形式把相邻的叶子结点互相连接。因此B+树支持顺序范围查找。同时B+Tree有两个头指针,一个是指向根结点,另外一个指向最小关键字的叶子结点。
在这里插入图片描述
(5)由于B+树的记录全部在叶子结点中才能找到,所以在搜索时候一定会找到最底层,而B树在中间结点找到目标关键字后就会返回。
(6)由于B+树非叶子结点都不含有关键字对应记录的存储信息,所以可以使一个连续的磁盘空间存储更多的关键字,从而使得阶数更大,树更矮,进一步减少磁盘IO次数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java】多线程

文章目录进程和线程继承Thread类的方式实现多线程设置和获取线程的名称线程优先级 线程调度控制线程线程的生命周期多线程的实现方式案例--卖票同步方法解决数据安全问题线程安全的类Lock锁生产者消费者模式概述案例进程和线程 继承Thread类的方式实现多线程 MyThread.java pa…

懵了,阿里一面就被虐了,幸获内推华为技术四面,成功拿到offer

上个月&#xff0c;哥们从某小厂离职&#xff0c;转投阿里云&#xff0c;简历优秀&#xff0c;很顺利地拿到了面试通知&#xff0c;但之后的进展却让哥们怀疑人生了&#xff0c;或者说让哥们懵逼的是&#xff0c;面试阿里云居然第一面就被吊打&#xff1f;让哥们开始怀疑自己&a…

【OpenCV-Python】教程:3-12 模板匹配

OpenCV Python 模板匹配 【目标】 利用模板匹配的方法寻找目标cv2.matchTemplate(), cv2.minMaxLoc() 【理论】 模板匹配是一个寻找大图像中目标位置的方法。OpenCV提供了函数 cv2.matchTemplate() 函数&#xff0c;通过在输入图像上滑动模板&#xff0c;将目标与滑动处的图…

[附源码]计算机毕业设计JAVA校园淘宝节系统

[附源码]计算机毕业设计JAVA校园淘宝节系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis …

【c++】STL--string

前言 最开始我们学习c语言的时候&#xff0c;我们发现刷题或者写代码都是比较麻烦的&#xff0c;如果说用c语言造一辆车&#xff0c;那么我需要用c语言先把轮子造好--各个零件&#xff0c;当我们造好之后再组装。那么c则是造好了轮子&#xff0c;只需要我们组装就好了。这里的的…

岩藻多糖-聚乙二醇-过氧化氢酶,Catalase-PEG-Fucoidan,过氧化氢酶-PEG-岩藻多糖

岩藻多糖-聚乙二醇-过氧化氢酶&#xff0c;Catalase-PEG-Fucoidan&#xff0c;过氧化氢酶-PEG-岩藻多糖 中文名称&#xff1a;岩藻多糖-过氧化氢酶 英文名称&#xff1a;Fucoidan-Catalase 别称&#xff1a;过氧化氢酶修饰岩藻多糖&#xff0c;过氧化氢酶-岩藻多糖 过氧化氢…

LiteFlow v2.9.4发布!一款能让你系统支持热更新,编排,脚本编写逻辑的国产规则引擎框架

前言 上海的天气降温让人猝不及防&#xff0c;但是我们的迭代速度却井然有序。 今天我们带来了LiteFlow v2.9.4版本。 我们每次的发布的issue有很大一部分依托于我们的使用者社区&#xff0c;社区人越来越多。我看到了使用者在使用过程中遇到的问题&#xff0c;也收集了很多…

【Java实战】这样写SQL语句性能嘎嘎好

目录 一、前言 二、SQL语句 1.【强制】不要使用 count(列名) 或 count(常量) 来替代 count(*)&#xff0c;count(*) 是 SQL92 定义的标准统计行数的语法&#xff0c;跟数据库无关&#xff0c;跟 NULL 和非 NULL 无关。 2.【强制】count(distinct col) 计算该列除 NULL 之外的…

如何实现网站首页变为黑白色?

某些时候&#xff0c;网站会根据要求将页面调成黑白色&#xff0c;一开始我还以为是将连夜把图片和文字都搞成黑白色&#xff0c;但是转念一想&#xff0c;像推送产品的京东、淘宝&#xff0c;以及展示up内容的B站、CSDN等&#xff0c;刷新之后可能展示的内容均不同&#xff0c…

从上帝视角认识SpringMVC预览

前言 SpringMVC提供了很多可拓展的组件&#xff0c;例如&#xff1a;参数解析器、拦截器、异常处理器等等。但是如果想要理解/找到这些组件工作的位置/时机&#xff0c;很多时候总是容易迷失在其层层调用的源码之中。因此才想从上帝视角来剖析它。而所谓上帝视角&#xff0c;就…

[附源码]Python计算机毕业设计Django海南琼旅旅游网

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

22.12.1打卡 漫步校园 记忆化搜索

题目里很显然只走最短路, 直接用bfs从终点到起点搜一遍将每一步到终点所需要的最短的时间存在一个dis数组中, 然后你就会发现原来的地图变成了这样 上面是地图下面是dis数组, 再看看经典记忆化搜索模板题滑雪的地图 对的, 非常地相似, 接下来的操作和滑雪基本一样, 只不过起点是…

SQL创建新的输出字段

SQL创建新的输出字段1、准备数据2、对单个字段或者多个字段进行数值计算3、数值计算4、字段拼接5、字段使用别名6、 CASE WHEN逻辑转换case when 语法一case when 语法二case when 注意点查询的值可以为任何值&#xff08;例如可以&#xff1a; select *&#xff09;可以重命名…

Docker 快速安装Jenkins完美教程 (亲测采坑后详细步骤)(转)

转载至&#xff1a;https://www.cnblogs.com/fuzongle/p/12834080.html Docker 快速安装Jenkins完美教程 &#xff08;亲测采坑后详细步骤&#xff09; Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0…

组织:阿米巴-事业部-成员公司

昨天有朋友讲到阿米巴-内部交易的成本与效率、讲到乌合之众山头团伙合并财报。昨天也都谈到方向大致正确品质大致不错极低规模成本、方向老钻错牛角尖品质精密高成本。我这篇文章就是&#xff1a;群中单句交流-朋友圈提炼段落-公众号整理成文章&#xff0c;这么来的。阿米巴&am…

从零开始带你实现一套自己的CI/CD(一)Jenkins

目录一、简介二、环境准备2.1 安装Docker和Docker-compose2.2 远程仓库Github/Gitee/GitLab2.3 部署Jenkins三、配置Jenkins3.1 Jenkins配置源码拉取地址3.2 Jenkins配置Maven构建代码3.2.1 准备jdk3.2.2 配置Maven3.2.3 Jenkins配置JDK&Maven并保存3.3 配置Jenkins任务构建…

【日常折腾】重新安装Windows7,做好ghost备份,迁移主目录,日常软件office,chrome,搜狗输入法,电脑管家,一键ghost进行备份。

目录前言1&#xff0c;关于Windows2&#xff0c;电脑起码分两个盘c、d盘3&#xff0c;因为主目录切换了&#xff0c;相关的其他人软件的数据都会迁移过去4&#xff0c;安装office软件3件套&#xff0c;不要全家桶5&#xff0c;安装电脑管家&#xff0c;还是选择腾讯吧6&#xf…

17条卢松松近期言论汇总

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 本文汇集了前段时间卢松松写的段子&#xff0c;有心情感悟、工作感悟、做直播带货、创业的感悟。关注互联网、草根创业者的朋友可以看看&#xff01; (1) 人最舒服的是什么时候呢?我认为&#xff…

RabbitMQ的工作模式

一.RabbitMQ的一些知识 1.消息属性 RabbitMQ是基于AMQP消息传输协议来实现的消息中间件&#xff1b;类似HTTP有header和body两部分数据&#xff0c;Message是RabbitMQ中的消息体概念。 Message由Properties和Body组成&#xff0c;前者是一些元信息&#xff0c;如消息的优先级…

【LeetCode】1769.移动所有球到每个盒子所需的最小操作数

题目描述 有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes &#xff0c;其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的&#xff0c;而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。 在一步操作中&#xff0c;你可以将 一个 小球从某个盒子移动到一个与之相邻的…