数据结构 B树 B+树 B*树 特性与规则说明 图解

news2024/11/24 6:54:12

文章目录

  • 前言
  • B树基本规则
  • B树的数据插入(文字描述+图解)
  • B树数据查找
  • B树效率分析
  • B树的作用
  • B+树基本规则
  • B+树 与 B树对比
  • B*树基本规则
  • B*树 与 B+树对比
  • 拓展

前言

B树基本规则

  1. 每个节点最多有m个子节点,其中m是一个正整数。根节点除外,其他节点至少有⌈m/2⌉个子节点。

  2. 每个节点中的键值按照非降序排列。对于节点中的键值k,如果有n个子节点,那么节点中的n-1个键值将把节点分为n个区间,第i个区间的键值小于k,第i+1个区间的键值大于等于k。

  3. 所有叶子节点位于同一层,且不包含任何键值信息,可以看作是外部存储的块。

  4. 每个非叶子节点中的键值个数比子节点个数少1。

  5. 每个节点中的键值个数满足:
    ⌈m/2⌉-1 <= 键值个数 <= m-1

![在这里插入图片描述](https://img-blog.csdnimg.cn/7608c2a7fa9a45efbafd86029ce6b7a1.png

B树的数据插入(文字描述+图解)

插入规则概览:

1.从根节点开始,按照节点中的键值进行比较,找到合适的叶子节点(比较结果类似于二叉搜索树)。

2.如果叶子节点中已经存在该键值,则更新相应的值。

3.如果叶子节点中不存在该键值,则将键值插入到叶子节点的合适位置,并保持节点中的键值有序。

4.如果插入键值后,叶子节点的键值个数超过了上限m-1,则进行分裂操作。

将叶子节点的键值分成两部分,左边部分包含⌈(m-1)/2⌉个键值,右边部分包含⌊(m-1)/2⌋个键值。

将右边部分的键值和对应的子节点分离出来,形成一个新的叶子节点。

将新的叶子节点插入到叶子节点的右边,并更新父节点的键值信息。

5.如果插入键值后,叶子节点的键值个数没有超过上限m-1,则直接插入。

6.如果父节点存在并且插入键值后超过了上限m-1,则进行分裂操作。

将父节点的键值分成两部分,左边部分包含⌈(m-1)/2⌉个键值,右边部分包含⌊(m-1)/2⌋个键值。

将右边部分的键值和对应的子节点分离出来,形成一个新的父节点。

将新的父节点插入到父节点的右边,并更新祖父节点的键值信息。

重复步骤6,直到根节点为止。

(图解)插入的情况归类为以下几种:

  1. 无父亲节点,不需要分裂;
    在这里插入图片描述

  2. 有父亲节点,不需要分裂;
    在这里插入图片描述

  3. 无父亲节点,需要分裂;
    在这里插入图片描述

    将叶子节点的键值分成两部分,左边部分包含⌈(m-1)/2⌉个键值,右边部分包含⌊(m-	1)/2⌋个键值。
    
    将右边部分的键值和对应的子节点分离出来,形成一个新的叶子节点。
    
  4. 有父亲节点,插入节点需要分裂,插入后父亲节点不需要分裂;
    在这里插入图片描述
    将叶子节点的键值分成两部分,左边部分包含⌈(m-1)/2⌉个键值,右边部分包含⌊(m-1)/2⌋个键值。
    将右边部分的键值和对应的子节点分离出来,形成一个新的叶子节点。

    将新的叶子节点插入到叶子节点的右边,并更新父节点的键值信息。

  5. 有父亲节点,插入节点需要分裂,插入后父亲节点需要分裂;

在这里插入图片描述

将父节点的键值分成两部分,左边部分包含⌈(m-1)/2⌉个键值,右边部分包含⌊(m-1)/2⌋个键值。

将右边部分的键值和对应的子节点分离出来,形成一个新的父节点。

将新的父节点插入到父节点的右边,并更新祖父节点的键值信息。

重复以上步骤,直到根节点

B树数据查找

由于数据数据排列的格式类似于搜索二叉树,所以查找也是。

B树效率分析

如果忽略内存中查找和外存中查找时间的巨大差异:
设 :
有效值个数 = N;
度 = M ;
则:一个节点的有效值个数 = M/2 ~ M-1 ;
故:树的高度为 = log{M/2} N ~ log{M-1}N ;
一个节点内查找的复杂度 = O(log{2}M/2 ) ~ O(log{2}M-1 ) ;
故:最终时间复杂度 = [ O(log{2}M/2 ) ~ O(log{2}M-1 ) ] * [ log{M/2} N ~ log{M-1}N ]

但,实际应用情况不是这样,实际时间主要消耗在,从上级节点访问下级节点的过程中,因为访问节点其实是访问外存;

关键理解点)B树查找过程中,IO操作即为进入节点的操作,当查找过程中需要访问到磁盘上的节点时,就需要进行IO操作将节点从磁盘读取到内存中。

所以主要的时间消耗为:[ log{M/2} N ~ log{M-1}N ] 次访问外存的次数 !!!!

对于N = 62*1000000000个节点,如果度M为1024,则 l o g M / 2 N log_{M/2}N logM/2N <=
4,即在620亿个元素中,如果这棵树的度为1024,则需要小于4次即可定位到该节点,然后利用二分查找可以快速定位到该元素,大大减少了读取磁盘的次数。

B树的作用

数据库索引:B树常被用作数据库的索引结构,能够高效地支持数据的查找和范围查询。

文件系统:B树被用于文件系统中的目录结构,可以高效地支持文件的查找和管理。

缓存系统:B树可以用于缓存系统中的索引结构,加速数据的访问和查询。

路由表:B树可以用于路由表的存储和查找,快速定位目标地址。

B+树基本规则

  1. 分支节点的子树指针与关键字个数相同
  2. 分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间
  3. 所有叶子节点增加一个链接指针链接在一起
    所有关键字及其映射数据都在叶子节点出现(所有的数据都在最底一层存储)
  4. 所有关键字都出现在叶子节点的链表中,且链表中的节点都是有序的。
  5. 不可能在分支节点中命中数据(所有的数据都在最底一层存储)
  6. 分支节点相当于是叶子节点的索引,叶子节点才是存储数据的数据层。
    在这里插入图片描述

B+树 与 B树对比

先说结论:
1.B树更适合随机查找,B+树更适合范围查找
2.B+树相对更省空间
3.对数据进行插入、删除的时候B+树更高
原因:

  1. B树的每个节点包含关键字和对应的指针,用于存储数据和构建索引。B树的节点可以直接存储数据,因此在查找时可以直接定位到数据所在的节点。
    B+树的每个节点只包含关键字,数据存储在叶子节点中。叶子节点之间通过指针连接形成一个有序链表,叶子节点上的关键字也构成一个有序序列。B+树的非叶子节点仅用于索引,不存储数据,这样可以减少非叶子节点的数量,提高内存利用率。
  2. B树的节点既存储数据又存储索引,因此每个节点可以存储更多的数据。这样可以减少树的高度,提高查询效率。但是,由于B树的节点包含数据,插入和删除操作需要进行数据的移动和调整,相对较慢。
    B+树的非叶子节点仅用于索引,不存储数据,因此每个节点可以存储更多的索引。叶子节点之间通过指针连接形成有序链表,可以高效地进行顺序访问。同时,由于B+树的数据只存储在叶子节点中,插入和删除操作只需要调整索引节点,相对较快。

B*树基本规则

B*树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。
在这里插入图片描述

B*树 与 B+树对比

结论: B*树空间利用率比B+树高

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结
点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。

拓展

B+树的插入操作规则如下:

查找插入位置:从根节点开始,按照B+树的搜索规则找到插入位置。如果插入的关键字已经存在于树中,则根据具体情况进行处理(如替换、忽略或合并等)。

插入到叶子节点:将新的关键字插入到叶子节点中的适当位置。如果插入后导致叶子节点的关键字数量超过了阶数的上限,则进行分裂操作。

叶子节点分裂:将超过阶数上限的叶子节点分裂成两个节点。将一半的关键字移动到新的节点中,并调整指针连接。同时,将新节点的最小关键字插入到父节点中。

父节点调整:如果叶子节点的分裂导致父节点关键字数量超过了阶数的上限,则进行递归的分裂操作。将超过阶数上限的父节点分裂成两个节点,并将新节点的最小关键字插入到父节点的父节点中。

递归调整:如果父节点的分裂导致祖先节点关键字数量超过了阶数的上限,则继续进行递归的分裂操作,直到根节点。

根节点分裂:如果根节点的分裂导致树的高度增加,则创建一个新的根节点,并将原来的根节点分裂成两个节点。将新的根节点的最小关键字插入到新的根节点中,并调整指针连接。

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

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

相关文章

ESP32设备驱动-OLED-SSD1306(I2C)显示屏驱动

OLED-SSD1306(I2C)显示屏驱动 1、OLED介绍 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一…

【LeetCode热题100】--543.二叉树的直径

543.二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 首先我们知道一条路径的长度为该路径经过的节…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

[C++随想录] 优先级队列

优先级队列 基本使用题目训练 基本使用 priority_queue, 优先级队列, 又叫做双端队列, 头文件也是 <queue> 别看它叫做队列, 其实它是一个 堆 补充一下概念: 大根堆 — — 每一棵树的父节点比它的孩子都大小跟堆 — — 每一棵树的父节点比它的孩子都小 &#x1f447;&…

二极管的直流等效电路和微变等效电路

二级管的主要参数 1.IF&#xff08;最大整流的电流&#xff09; 二极管长期工作做能够通过电流的平均最大值&#xff1a;物理意义&#xff1a;功率电流值。 2.UR 二极管最高反向工作电压 需要留有裕度&#xff0c;通常能达到一半的裕度&#xff1b;UR不能等于UBR。 3.IR 未击穿…

【python海洋专题九】Cartopy画地形等深线图

【python海洋专题九】Cartopy画地形等深线图 水深图基础差不多了&#xff0c;可以换成温度、盐度等 本期加上等深线 本期内容 1&#xff1a;地形等深线 cf ax.contour(lon, lat, ele[:, :], levelsnp.linspace(-9000,-100,10),colorsgray, linestyles-,linewidths0.25, t…

C++标准模板(STL)- 类型支持 (std::size_t,std::ptrdiff_t,std::nullptr_t)

对象、引用、函数&#xff08;包括函数模板特化&#xff09;和表达式具有称为类型的性质&#xff0c;它限制了对这些实体所容许的操作&#xff0c;并给原本寻常的位序列提供了语义含义。 附加性基本类型及宏 sizeof 运算符返回的无符号整数类型 std::size_t 定义于头文件 <…

Ubuntu20配置Mysql常用操作

文章目录 版权声明ubuntu更换软件源Ubuntu设置静态ipUbuntu防火墙ubuntu安装ssh服务Ubuntu安装vmtoolsUbuntu安装mysql5.7Ubuntu安装mysql8.0Ubuntu卸载mysql 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程…

设计模式10、外观模式Facade

解释说明&#xff1a;外观模式&#xff08;Facade Pattern&#xff09;又称为门面模式&#xff0c;属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口&#xff0c;该接口使得子系统更加容易使用 外观&#xff08;Facade)角色&#xff1a;为多个子系统对外提供…

WorldPop2000年至2020年的全中国的人口统计数据

简介 WorldPop于2013年10月启动&#xff0c;将AfriPop&#xff0c;AsiaPop和AmeriPop人口绘图项目结合在一起。它旨在为中美洲和南美洲&#xff0c;非洲和亚洲提供一个开放的空间人口统计数据集存档&#xff0c;以支持发展&#xff0c;灾害应对和卫生应用。 平台中的WorldPop数…

【LeetCode热题100】--102.二叉树的层序遍历

102.二叉树的层序遍历 广度优先搜索&#xff1a; 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态&#xff0c;它表示某个节点和它所在的层数&#xff0c;每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类&…

通信原理框图总结

第一章 绪论 模拟通信系统模型 数字通信系统模型 第二章 调制信道和编码信道的划分 第三章 相移法产生SSB信号 有噪声的相干解调器 倍频法产生WBFM 第四章 非均匀量化PCM系统框图 增量调制波形及其编码 第五章 第一类部分响应系统组成的框图 眼图模型 第六章 2ASK信号的解…

用友U8 crm客户关系管理存在任意文件上传漏洞

用友U8 crm客户关系管理存在任意文件上传漏洞 一、 用友U8 crm客户关系管理简介二、漏洞描述三、影响版本三、fofa查询语句五、漏洞复现六、POC&EXP1.发送文件md5的1234内容2.发送请求包如果有md5就表示成功小龙POC检测 七、修复建议 免责声明&#xff1a;请勿利用文章内的…

【Seata】深入解读分布式事务解决方案

文章目录 1. 事务概述1.1 本地事务1.2 分布式事务 2. 分布式事务解决方案2.1 两阶段提交型&#xff08;2PC&#xff09;2.2 三阶段提交型&#xff08;3PC&#xff09;2.3 TCC补偿型2.4 最终一致性型2.5 最大努力通知型事务 3. Seata概述3.1 AT事务模式3.2 XA模式3.3 TCC模式3.4…

WSL2安装历程

WLS2安装 1、系统检查 安装WSL2必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11。 查看 Windows 版本及内部版本号&#xff0c;选择 Win R&#xff0c;然后键入winver。 2、家庭版升级企业版 下载HEU_KMS_Activ…

UGUI交互组件Button

一.初识Button对象 从菜单中创建Button对象&#xff0c;Button的文本由子节点Text对象显示&#xff0c;Button对象的组件除了基础组件外&#xff0c;还有Image用来显示Button常规态的图片&#xff0c;还有Button组件用来控制点击过渡效果和点击事件的响应。 二.Button组件的属…

QGIS文章二——DEM高程裁剪和3D地形图

经常看到别人基于高程文件制作出精美的3D地图&#xff0c;笔者按照互联网几种制作方式进行尝试后&#xff0c;写的DEM高程裁剪和3D地形图教程&#xff0c;或许其中有一些错误的&#xff0c;也请指出。 本文基于海南省的shp文件和海南省DEM高程文件&#xff0c;制作海口地区的3D…

软件工程与计算总结(一)软件工程基础

国庆快乐&#xff0c;今天开始更新《软件工程与计算&#xff08;卷二&#xff09;》的重要知识点内容~ 一.软件 1.软件独立于硬件 早期的软件是为了计算机硬件在研究型项目中而开发制造的&#xff0c;人们使用专门针对于硬件的指令码和汇编语言编写&#xff0c;这也是最早软件…

CentOS安装OpenNebula(二)

被控端部署&#xff1a; 先要配置好yum源&#xff1a; [rootmaster yum.repos.d]# vim opennebula.repo[rootmaster yum.repos.d]# cat opennebula.repo [opennebula] nameopennebula baseurlhttps://downloads.opennebula.org/repo/5.6/CentOS/7/x86_64 enabled1 gpgkeyhttps…

【2023年11月第四版教材】第17章《干系人管理》(第二部分)

第17章《干系人管理》&#xff08;第二部分&#xff09; 4 过程1-识别干系人4.1 数据收集★★★4.3数据分析4.4 权力利益方格4.5 数据表现&#xff1a;干系人映射分析和表现★★★ 5 过程2-规划干系人参与5.1 数据分析5.2 数据表现★★★5.2.1 干系人参与度评估矩阵★★★ 5.3 …