瑞_数据结构与算法_B树

文章目录

    • 1 什么是B树
      • 1.1 B树的背景
      • 1.2 B 的含义
      • 1.3 B-树的度和阶
      • 1.4 B-树的特性
      • 1.5 B-树演变过程示例
    • 2 B-树的Java实现
      • 2.1 B树节点类Node

🙊前言:本文章为瑞_系列专栏之《数据结构与算法》的B树篇。由于博主是从B站黑马程序员的《数据结构与算法》学习到的相关知识,所以本系列专栏主要针对该课程进行笔记总结和拓展,文中的部分原理及图解也是来源于黑马提供的资料。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

相关知识链接:二叉树
相关知识链接:二叉搜索树
相关知识链接:AVL树
相关知识链接:红黑树

在这里插入图片描述

1 什么是B树

1.1 B树的背景

  B树(B-Tree)结构是一种高效存储和查询数据的方法,它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database Systems》中的,题目为"Organization and Maintenance of Large Ordered Indexes"。

  这篇论文提出了一种能够高效地维护大型有序索引的方法,这种方法的主要思想是将每个节点扩展成多个子节点,以减少查找所需的次数。B树结构非常适合应用于磁盘等大型存储器的高效操作,被广泛应用于关系数据库和文件系统中。

  B树结构有很多变种和升级版,例如B+树,B*树和SB树等。这些变种和升级版本都基于B树的核心思想,通过调整B树的参数和结构,提高了B树在不同场景下的性能表现。

  总的来说,B树结构是一个非常重要的数据结构,为高效存储和查询大量数据提供了可靠的方法。它的历史可以追溯到上个世纪70年代,而且在今天仍然被广泛应用于各种场景。

  瑞:本系列介绍过的自平衡的树如AVL树、红黑树的增删改查效率在内存中能达到对数级别,属于高效率的,但是并不适合做磁盘(IO)上的增删改查,而B树就比较适合,如MySQL底层是使用的B树结构升级版B+树。

  对树进行增删改查操作的效率主要取决于树的高度,树的高度越低,比较次数越少,反之亦然。如果是100W的数据,用AVL树存储,树的高度会达到20,因为log2(1000000)约等于20。最糟糕的情况下,要比较到叶子节点即20次才能找到数据,那在磁盘上要做20次读写,这是非常耗时的操作,导致效率低下。但是同样的100W数据,存储在B-树中(最小度数是500),树的高度约为3,平均效率有显著提升,所以在对于磁盘上的增删改查操作,B树更为受到欢迎。

  所以B树大个特点就是:树的高度能降到非常的低,具体见下文分析

1.2 B 的含义

  B-树的名称是由其发明者Rudolf Bayer提出的。Bayer和McCreight从未解释B代表什么,人们提出了许多可能的解释,比如Boeing、balanced、between、broad、bushy和Bayer等。但McCreight表示,越是思考B-trees中的B代表什么,就越能更好地理解B-trees

瑞:本文中出现的B-树和B树是同一个概念的不同称呼,并没有实质性的区别。通常,当我们提到B树时,可能会看到它被写作B-tree、B tree或者B_tree,这些都是指同一种数据结构。B树的变种如B+树和B*树,这些才是不同的概念。BTree又叫多路平衡搜索树。

1.3 B-树的度和阶


  • 度(degree):指树中节点孩子数
  • 阶(order):指所有节点孩子数最大值

在这里插入图片描述

  如上图:度:节点4、2都是有两个孩子,所以度数为2;节点1、3、5、7、9 10都是没有孩子,所以度数为0;节点6 8有3个孩子,所以度数为3。而阶是指上图中树的所有节点中孩子最多的那个值,就是节点6 8有3个孩子,所以上图中树的阶数为3。

1.4 B-树的特性


一颗m叉的BTree特性如下 :

  1. 树中每个节点最多包含 m 个孩子,其中 m 称为B-树的阶。
  2. 除根节点与叶子节点外,其它每个节点至少有 ceil(m/2) 个孩子。
  3. 若根节点不是叶子节点,则至少有两个孩子。
  4. 所有的叶子节点都在同一层。
  5. 每个非叶子节点由 n 个关键字 key 与 n+1 个指针组成,其中 ceil(m/2)-1 <= n <= m-1 。
  6. 关键字按非降序排列,即节点中的第 i 个关键字大于等于第 i-1 个关键字。
  7. 指针 P[ i ] 指向关键字值位于第 i 个关键字和第 i+1 哥关键字之间的子树。

瑞:
  根据第2条,中间节点的孩子数目是有下限的(阶数除以2,向上取整)。
  第5点中的n+1个指针就是n+1个孩子即孩子数目比该节点key的数目多1,如节点2有两个孩子(节点1、节点3)、节点6 8有3个孩子(节点5、节点7、节点9 10)
  最小度数要大于等于2(小于2意味着孩子只有一个,违反了B树的规则)B树中有最小度数的限制是为了保证B树的平衡特性
  最小度数 * 2 = 可能拥有的最多孩子的个数

  在B树中,每个节点都可以有多个子节点,这使得B树可以存储大量的键值,但也带来了一些问题。如果节点的子节点数量太少,那么就可能导致B树的高度过高,从而降低了B树的效率。此外,如果节点的子节点数量太多,那么就可能导致节点的搜索、插入和删除操作变得复杂和低效。
  最小度数的限制通过限制节点的子节点数量,来平衡这些问题。在B树中,每个节点的子节点数量都必须在一定的范围内,即t到2t之间(其中t为最小度数)

一棵 B-树具有以下性质:

  特性1️⃣:每个节点 x 具有

    1️⃣➖1️⃣ 属性 n,表示节点 x 中 key 的个数
    1️⃣➖2️⃣ 属性 leaf,表示节点是否是叶子节点
    1️⃣➖3️⃣ 节点 key 可以有多个,以升序存储


  特性2️⃣:每个非叶子节点中的孩子数是 n + 1、叶子节点没有孩子


  特性3️⃣:最小度数t(节点的孩子数称为度)和节点中键数量的关系如下:

Column 1Column 2
最小度数t键数量范围
21 ~ 3
32 ~ 5
43 ~ 7
n(n-1) ~ (2n-1)

  其中,当节点中键数量达到其最大值时,即 3、5、7 … 2n-1,需要分裂


  特性4️⃣:叶子节点的深度都相同

瑞:即所有的叶子节点都在同一层

  B-树与 2-3 树、2-3-4 树的关系

  它们之间的关系:

  1. 2-3树是最小度数为2的B树,其中每个节点可以包含2个或3个子节点。
  2. 2-3-4树是最小度数为2的B树的一种特殊情况,其中每个节点可以包含2个、3个或4个子节点。
  3. B树是一种更加一般化的平衡树,可以适应不同的应用场景,其节点可以包含任意数量的键值,节点的度数取决于最小度数t的设定。

1.5 B-树演变过程示例

  以5叉BTree为例(度为5)为例,演示B树的演变过程

  key的数量:可以根据公式推导ceil(m/2)-1<=n<=m-1。因为m为5,所以得2<=n<=4,即当n>4时,中间节点分裂到父节点,两边节点分裂

  BTree可视化网站,点击进入https://www.cs.usfca.edu/~galles/visualization/BTree.html

  瑞:该网站是一个旧金山大学计算机科学系的可视化项目网站,专门用于展示和解释B树(B-tree)数据结构及其操作的可视化模型。

  下面就通过使用该网站对插入CNGAHEKQMFWLTZDPRXYS数据进行演示

  演变过程如下:

  进入网页后,选择Max. Degree = 5选项。本例模拟的是度数为5的情况下插入CNGAHEKQMFWLTZDPRXYS数据,后续网址和下半部分的配置不会再进行截取(均不会更改)

在这里插入图片描述
  1️⃣ 依次插入前4个字母CNGA后,B树演变为下图,此时B树为 4 个关键字 key(ACGN) 与 n+1 = 5 个指针组成

在这里插入图片描述
  2️⃣ 插入H,此时 n>4,中间元素G字母向上分裂到新的节点,分裂动图如下所示(后续分裂均是同理,过程可以到网站内自己感受,后续不再放置动图)

在这里插入图片描述
  此时B树各个key和指针的关系如下图所示(每一个节点指针比key的数量多1,后续不再展示带指针图)

在这里插入图片描述

  3️⃣ 插入E、K、Q不需要分裂

在这里插入图片描述

  4️⃣ 插入M,中间元素M字母向上分裂到父节点G

在这里插入图片描述

  5️⃣ 插入F、W、L、T不需要分裂

在这里插入图片描述

  6️⃣ 插入Z,中间元素T向上分裂到父节点中

在这里插入图片描述

  7️⃣ 插入D,中间元素D向上分裂到父节点中,然后插入P、R、X、Y不需要分裂

在这里插入图片描述

  8️⃣ 最后插入S,NPQR节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间节点M向上分裂

在这里插入图片描述

在这里插入图片描述

  最终如下B树演化结果如下:

在这里插入图片描述




2 B-树的Java实现


1️⃣➖1️⃣ 内部节点类Node中含有属性:

  • 关键字
  • 孩子们
  • 有效关键字个数
  • 是否是叶子节点
  • 最小度数 (最小孩子数)

瑞:由于本例关键字使用基本数组int[]存储,所以需要有效关键字个数属性对关键字个数进行记录,如果关键字使用集合(如List)则可以通过size方法获取到有效关键字个数

1️⃣➖2️⃣ 内部节点类Node中含有方法:

  • 多路查找get(int key)
  • 向指定索引处插入key(int key, int index)
  • 向指定索引处插入child(Node child, int index)
  • (后续更新)

2.1 B树节点类Node

  实际 keys 应当改为 entries 以便同时保存 key 和 value,本文主要是为了学习B树的思想,所以做简化实现

    static class Node {/*** 关键字*/int[] keys;/*** 孩子们*/Node[] children;/*** 有效关键字个数*/int keyNumber;/*** 是否是叶子节点*/boolean leaf = true;/*** 最小度数 (最小孩子数),它决定了节点中key 的最小、最大数目,分别是 t-1 和 2t-1*/int t;/*** 构造方法(给最小度数赋值** @param t 最小度数(t>=2)*/public Node(int t) {this.t = t;this.children = new Node[2 * t];this.keys = new int[2 * t - 1];}public Node(int[] keys) {this.keys = keys;}/*** 打印有效Key,为了方便调试和测试,非必须*/@Overridepublic String toString() {return Arrays.toString(Arrays.copyOfRange(keys, 0, keyNumber));}}

(后续内容明天更新)




本文是博主的粗浅理解,可能存在一些错误或不完善之处,如有遗漏或错误欢迎各位补充,谢谢

  如果觉得这篇文章对您有所帮助的话,请动动小手点波关注💗,你的点赞👍收藏⭐️转发🔗评论📝都是对博主最好的支持~


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高质量精品】2024美赛A题22页word版成品论文+数据+多版本前三问代码及代码讲解+前四问思路模型等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;即可获取完整资料后续参考论文!! 整体分析:这个题目是一个典型的生态系统建模问题&#xff0c;涉及到动物种群的性比例变化、资源可用性、环境因素、生态系统相互作用等多个方面。这个题目的难点在于如何建立一个合理的数学…

ppt形状导入draw.io

draw.io里面的形状还是有点少&#xff0c;我有时想找一个形状&#xff0c;发现PPT里有&#xff0c;但draw.io里有&#xff0c;比如 也就是这个形状 最简单的想法就是我直接把这个形状在PPT里存成图片&#xff08;png)&#xff0c;然后再导入到draw.io里&#xff0c;但是结果是…

linux下 Make 和 Makefile构建你的项目

Make 和 Makefile构建你的项目 介绍 在软件开发中&#xff0c;构建项目是一个必不可少的步骤。make 是一个强大的自动化构建工具&#xff0c;而 Makefile 是 make 工具使用的配置文件&#xff0c;用于描述项目的构建规则和依赖关系。本篇博客将介绍 make 和 Makefile 的基本概…

VS Code+Live Server插件开发游戏并结合内网穿透分享好友异地访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通过cpolar内网穿透发布到公网&#xff0c;分…

《MySQL》超详细笔记

目录 基本知识 主流数据库 数据库基本概念 MySQL启动 数据库基本命令 数据库 启动数据库 显示数据库 创建数据库 删除数据库 使用数据库 查询当前数据库信息 显示数据库中的表 导入数据库脚本 表 查看表的结构 查看创建某个表的SQL语句 数据库的查询命令 查询…

Linux截图快捷键以及修改快捷键方式

1. 截图快捷键 初始快捷键如下 全屏截图并保存&#xff1a;AltPrint 选区截图并保存&#xff1a;ShiftPrint 全屏截图并复制到剪贴板&#xff1a;AltCtrlPrint 选区截图并复制到剪贴板&#xff1a;ShiftCtrlPrint 会保存到Pictures文件夹下面 2. 修改快捷键 打开Settings界面…

k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(二)

三、简配版集群&#xff0c;适用于demo环境 1.集群架构设计 主机名角色配置(核数&#xff0c;内存&#xff0c;磁盘)MasterRKE,controlplane,etcd,worker,rancher-master2C 8G 40GSlaver1controlplane,worker,rancher-master2C 8G 40GSlaver2controlplane,worker,rancher-mas…

电机控制系列模块解析(第五篇)—— FOC需要调节哪些参数

最近有上传一些入门的免积分的资料&#xff0c;方便大家上手进行仿真分析。注意查收。 继续回到咱们的电机控制系列模块解析&#xff08;第五篇&#xff09;—— FOC需要调节哪些参数&#xff0c;这些参数都是可以理论计算的&#xff0c;后续章节将介绍其如何计算。 一、快速…

[Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例

什么是无监督学习&#xff1f; 无监督学习是机器学习中的一种方法&#xff0c;其主要目的是从无标签的数据集中发现隐藏的模式、结构或者规律。在无监督学习中&#xff0c;算法不依赖于任何先验的标签信息&#xff0c;而是根据数据本身的特征和规律进行学习和推断。无监督学习…

python_蓝桥杯刷题记录_笔记_全AC代码_入门3

前言 记录我的解法以及笔记思路&#xff0c;谢谢观看。 题单目录 1.P2141 [NOIP2014 普及组] 珠心算测验 2.P1567 统计天数 3.P1055 [NOIP2008 普及组] ISBN 号码 4.P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here 5.P1308 [NOIP2011 普及组] 统计单词数 6.P1047 […

不负书香,传承有我

随着科技的飞速发展&#xff0c;电子书、网络资源日益丰富&#xff0c;但实体书仍以其独特的魅力和不可替代性在每个人的生活中占据一席之地。为确保每一本书都能被正确、有序地摆放&#xff0c;为每一个读者提供便利&#xff0c;在2024年1月24日&#xff0c;曲阜师范大学计算机…

【数据分享】1929-2023年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…