什么是B+树?

news2024/11/16 9:43:41

B+树

B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点、内部节点和叶子节点。多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率。另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找。

B+树特点

  • B+树可以定义一个m值作为预定范围,即m路(阶)B+树。
  • 根节点可能是叶子节点,也可能是包含两个或两个以上子节点的节点。
  • 内部节点如果拥有k个关键字则有k+1个子节点。
  • 非叶子节点不保存数据,只保存关键字用作索引,所有数据都保存在叶子节点中。
  • 非叶子节点有若干子树指针,如果非叶子节点关键字为k1,k2,…kn,其中n=m-1,那么第一个子树关键字判断条件为小于k1,第二个为大于等于k1而小于k2,以此类推,最后一个为大于等于kn,总共可以划分出m个区间,即可以有m个分支。(判断条件其实没有严格的要求,只要能实现对B+树的数据进行定位划分即可,有些实现使用了m个关键字来划分区间,也是可以的)
  • 所有叶子节点通过指针链相连,且叶子节点本身按关键字的大小从小到大顺序排列。
  • 自然插入而不进行删除操作时,叶子节点项的个数范围为[floor(m/2),m-1],内部节点项的个数范围为[ceil(m/2)-1,m-1]。
  • 另外通常B+树有两个头指针,一个指向根节点一个指向关键字最小的叶子节点。
  • 在进行删除操作时,涉及到索引节点填充因子和叶子节点填充因子,一般可设叶子节点和索引节点的填充因子都不少于50%。

以下是一棵4阶B+树,
在这里插入图片描述

插入操作

假设现在构建一棵四阶B+树,开始插入“A”,直接作为根节点,

在这里插入图片描述
插入“B”,大于“A”,放右边,
在这里插入图片描述
插入“C”,按顺序排到最后,
在这里插入图片描述
继续插入“D”,直接添加的结果如下图,此时超过了节点可以存放容量,对于四阶B+树每个节点最多存放3个项,此时需要执行分裂操作,
在这里插入图片描述
分裂操作为,先选取待分裂节点中间位置的项,这里选“C”,然后将“C”项放到父节点中,因为这里还没有父节点,那么直接创建一个新的父节点存放“C”,而原来小于“C”的那些项作为左子树,原来大于等于“C”的那些项作为右子树。这里注意下非叶子节点存放的都是关键字,用作索引的,所以父节点存放的“C”项不包括数据,数据仍然存放在右子树。此外,还需要添加一个指针,由左子树指向右子树。
在这里插入图片描述
继续插入“M”,“M”大于“C”,往右子节点,
在这里插入图片描述
分别与“C”“D”比较,大于它们,放到最右边,
在这里插入图片描述
插入“L”,“L”大于“B”,往右子树,
在这里插入图片描述
“L”逐一与节点内项的值比较,根据大小放到指定位置,此时触发分裂操作,
在这里插入图片描述
选取待分裂节点中间位置的项“L”,然后将“L”项放到父节点中,按大小顺序将“L”放到指定位置,而原来小于“L”的那些项作为左子树,原来大于等于“L”的那些项作为右子树。父节点存放的“L”项不包括数据,数据仍然存放在右子树。此外,还需要在左子树中添加一个指向右子树的指针。

在这里插入图片描述
继续插入“K”,从根节点开始查找,逐一比较关键字,“K”大于“C”而小于“L”,往第二个分支,
在这里插入图片描述
在子节点中逐一比较,“K”最终落在最右边,
在这里插入图片描述
继续插入“J”,从根节点开始查找,逐一比较关键字,“J”大于“C”而小于“L”,往第二个分支,
在这里插入图片描述
在子节点中找到“J”的相应位置,此时超过了节点的容量,需要进行分裂操作,
在这里插入图片描述
选取待分裂节点中间位置的项“J”,然后将“J”项放到父节点中,按大小顺序将“J”放到指定位置,而原来小于“J”的那些项作为左子树,原来大于等于“J”的那些项作为右子树。父节点存放的“J”项不包括数据,数据仍然存放在右子树。此外,还需要在左子树中添加一个指向右子树的指针。

在这里插入图片描述
继续插入“I”,从根节点开始查找,逐一比较关键字,“I”大于“C”而小于“J”“L”,往第二个分支,
在这里插入图片描述
逐一比较找到“I”的插入位置,
在这里插入图片描述
继续插入“H”,从根节点开始查找,逐一比较关键字,“H”大于“C”而小于“J”“L”,往第二个分支,
在这里插入图片描述
“H”逐一与节点内的值比较,根据大小放到指定位置,此时触发分裂操作,
在这里插入图片描述
选取待分裂节点中间位置的项“H”,然后将“H”项放到父节点中,按大小顺序将“H”放到指定位置,而原来小于“H”的那些项作为左子树,原来大于等于“H”的那些项作为右子树。父节点存放的“H”项不包括数据,数据仍然存放在右子树。此外,还需要在左子树中添加一个指向右子树的指针。

但此时父节点超出了容量,父节点需要继续分裂操作,
在这里插入图片描述
选取待分裂节点中间位置的项“J”,然后将“J”项放到父节点中,但还不存在父节点,需要创建一个作为父节点。原来小于“J”的那些项作为左子树,原来大于“J”的那些项作为右子树。这是非叶子节点的分裂,操作对象都是用作索引的关键字,不必考虑数据存放问题。
在这里插入图片描述
插入“G”,从根节点开始查找,“G”小于“J”,往第一个分支,
在这里插入图片描述
逐一比较节点内项的值,“G”大于“C”小于“H”,往第二个分支,
在这里插入图片描述
逐一比较节点内项的值,找到“G”的位置并插入,
在这里插入图片描述
插入“F”,从根节点开始查找,“F”小于“J”,往第一个分支,
在这里插入图片描述

逐一比较节点内项的值,“F”大于“C”小于“H”,往第二个分支,
在这里插入图片描述
逐一比较节点内项的值,找到“F”的位置并插入,此时触发分裂操作,
在这里插入图片描述
选取待分裂节点中间位置的项“F”,然后将“F”项放到父节点中,按大小顺序将“F”放到指定位置,而原来小于“F”的那些项作为左子树,原来大于等于“F”的那些项作为右子树。父节点存放的“F”项不包括数据,数据仍然存放在右子树。此外,还需要在左子树中添加一个指向右子树的指针。
在这里插入图片描述
最后插入“E”,从根节点开始查找,“E”小于“J”,往第一个分支,
在这里插入图片描述
逐一比较节点内项的值,“E”大于“C”小于“F”,往第二个分支,
在这里插入图片描述
逐一比较节点内项的值,找打“E”适当的位置并插入。
在这里插入图片描述
从上面插入操作可以总结,插入主要就是涉及到分裂操作,而且要注意到非节点只保存了关键字作为索引,而数据都保存在叶子节点上,此外还需要使用指针将叶子节点连接起来。最终我们可以看到叶子节点的项按从小到大排列,因为有了指针使得可以很方便遍历数据。

查找操作

对B+树的查找与B树的查找差不多,从根节点开始查找,通过比较项的值找到对应的分支,然后继续往子树上查找。

比如查找“H”,“H”小于“J”,往第一个分支,
在这里插入图片描述
逐一比较节点中的项,发现应该往第四个分支,
在这里插入图片描述
逐一比较,找到“H”。
在这里插入图片描述

遍历操作

遍历操作首先是要先找到树最左边的叶子节点,然后就可以通过指针完成整棵树的遍历了。

从根节点开始,一直往第一个分支走,
在这里插入图片描述
继续往第一个分支走,
在这里插入图片描述
第一个叶子节点有两个项,接着根据指针跳到第二个叶子节点,
在这里插入图片描述
第二个节点有三个项,根据指针继续往下一个节点,
在这里插入图片描述
该节点有两个项,根据指针继续往下一个节点,
在这里插入图片描述
不断根据指针往下,
在这里插入图片描述
往下,
在这里插入图片描述

完成整棵树的遍历。
在这里插入图片描述
 

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

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

相关文章

【学会动态规划】等差数列划分(22)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

基于Kubernetes云原生技术的低代码PaaS平台,快速构建企业级应用程序

低代码PaaS平台 低代码PaaS平台可以在云端开发、部署、运行低代码应用程序。使用独立数据库模型,基于Kubernetes云原生技术,每个租户均可拥有一套独立的存储、数据库、代码和命名空间,实现了100%的租户数据隔离,并可以随时迁移到…

在本地搭建WAMP服务器并通过端口实现局域网访问(无需公网IP)

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 前言 软件技术的发展日新月异,各种能方便我们生活、工作和娱乐的新软件层出不穷&a…

iPhone 15受益:骁龙8 Gen 3可能缺席部分安卓旗舰机

明年一批领先的安卓手机的性能可能与今年的机型非常相似。硅成本的上涨可能是原因。 你可以想象,2024年许多最好的手机都会在Snapdragon 8 Gen 3上运行,这是高通公司针对移动设备的顶级芯片系统的更新,尚未宣布。然而,来自中国的…

Python Web开发 Django 简介

今天来为大家介绍 Python 另一个 Web 开发框架 Django,它是一个基于 Python 定制的开源 Web 应用框架,最早源于一个在线新闻 Web 网站,后于2005年开源。Django 的功能大而全,它提供的一站式解决的思路,能让开发者不用在…

在思科(Cisco)路由器中使用 SNMP

什么是SNMP SNMP,称为简单网络管理协议,被发现可以解决具有复杂网络设备的复杂网络环境,SNMP 使用标准化协议来查询网络上的设备,为网络管理员提供保持网络环境稳定和远离停机所需的重要信息。 为什么要在思科设备中启用SNMP S…

如何在出差期间远程访问企业ERP系统?内网穿透解决您的难题!

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻,不管是财务、生产、销售还是采购,都需要用到ERP系统来协助。…

【hive】简单介绍hive的几种join

文章目录 前言1. Common Join2. Map Join介绍:使用方法:限制: 3. Bucket Map Join介绍:好处:使用条件:使用方法: 4. Sort Merge Bucket Map Join介绍:如何使用: 5. Skew …

银河麒麟服务器v10 sp1 .Net6.0 Serilog 运行时不创建日志文件

上一篇:银河麒麟服务器v10 sp1 .Net Core 上传文件错误_csdn_aspnet的博客-CSDN博客 在代码中常用的日志记录相关重要或错误日志等,如Serilog、Log4net等,本文使用Serilog,在Program.cs的main方法中,代码如下图&#…

【GitLab私有仓库】如何在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透?

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具&#xf…

K8S核心组件etcd详解(下)

1 k8s如何使用etcd 在k8s中所有对象的manifest都需要保存到某个地方,这样他们的manifest在api server重启和失败的时候才不会丢失。 只有api server能访问etcd,其它组件只能间接访问etcd的好处是 增强乐观锁系统及验证系统的健壮性 方便后续存储的替换…

pyqt5 窗口居中、退出按钮、状态栏、窗口标题、水平布局、程序图标、

import sys# QT的基类 from PyQt5.QtWidgets import QApplication# 说明创建的是主窗体 QMainWindow from PyQt5.QtWidgets import QMainWindow# 添加控件:按钮、主控件(窗口) from PyQt5.QtWidgets import QPushButton, QWidget# 添加布局&a…

ssm单位人事管理系统源码和文档

ssm单位人事管理系统源码和文档033 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳…

进程|详解~什么是进程 以及 进程创建原理和过程

1.什么是进程 进程是正在运行的程序。 UNIX标准将进程定义为:其中运行着一个或者多个线程的地址空间和这些线程所需要的系统资源(分配给线程线程共享系统资源)。 组成:进程由程序代码、数据、变量(占用着系统内存)、打开的文件(文件描述符)、环境组成…

经典文献阅读之--LIW-OAM(LiDAR-IMU-编码器融合SLAM)

0. 简介 我们之前经常接触的是使用激光雷达和惯性测量单元(IMU)的互补信息,但是实际使用的过程中IMU如果发生剧烈的颠簸,有可能会导致IMU失效。在广泛使用的迭代最近点(ICP)算法只能为姿态提供约束,而速度只能由IMU预…

Linux系统的历史记录添加时间和IP信息

1 系统history记录优化 默认情况下,系统是不会记录我们执行命令的时间等相关信息的。 1.1 HISTCONTROL 介绍 使用HISTCONTROL变量,您可以控制 bash 如何存储您的命令历史记录。您可以告诉它忽略重复的命令和/或忽略具有前导空格的命令。 在命令行工作…

亚马逊新品如何快速上首页

将亚马逊新品快速上首页是许多卖家的目标,但要注意,这涉及到多种因素,包括产品质量、市场竞争、营销策略等。以下是一些可能帮助您的亚马逊新品快速上首页的方法: 1、优化产品信息:确保您的产品标题、描述和关键词字段…

Scratch 之 如何制作鼠标框(1)—— 绘制鼠标框

hello,大家好,今天给大家带来如何绘制鼠标框 我们正式开始 首先,让我们绘制一个空角色 然后让我们来编代码 1、准备工作 (1)拓展 画笔 添加这个拓展↑ (2)变量 实际上,你只需…

Systemverilog 接口 interface modport使用说明

一、接口的定义   SystemVerilog在Verilog语言基础上扩展了“接口”(interface)结构,SystemVerilog增加了新的端口类型—接口,接口允许许多信号合成一组由一个端口表示,只需在一个地方对组成接口的信号进行声明&am…

4G无线网络草坪音箱,4G石头音箱

SV-7042UG 4G无线网络草坪音箱,4G石头音箱 一、描述 SV-7042UG是深圳锐科达电子有限公司的一款壁挂式4G无线网络草坪音箱,通过4G无线卡联网,可将网络音源通过自带的功放和喇叭输出播放,其采用防水设计,功率40W。SV-70…