瑞_数据结构与算法_B树

news2024/12/29 9:40:26

文章目录

    • 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,为了方便调试和测试,非必须
         */
        @Override
        public String toString() {
            return Arrays.toString(Arrays.copyOfRange(keys, 0, keyNumber));
        }
  }

(后续内容明天更新)




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

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


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

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

相关文章

vue学习91-105

vue的基本认知p91 创建一个空仓库p93 vue 路由 vuex版本 2 3 3 3 4 4 npm的vuex装包npm install vuex --save vuex里有仓库,仓库放vuex核心代码&#xff0c;所有组件都能访问到 const store new Vuex.Store()//访问stored this.$store如何提供$访问vuex的数据p94 核心概念-…

SQL Server之DML触发器

一、如何创建一个触发器呢 触发器的定义语言如下&#xff1a; CREATE [ OR ALTER ] TRIGGER trigger_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]assql_statement从这个定义语言我们可以知道如下信息&#xff1a; trigger_name&…

Java 获取操作时区 ZonedDateTime

Java 获取操作时区 ZonedDateTime package com.zhong.timeaddress;import java.time.Clock; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Set;public class TimeAddress {public static void main(String[] args) {// 获取系统默认时区ZoneId…

OIS1 OIS1N OSSR OSSI用途

自记&#xff1a; 还是没有理解了 互补通道与刹车 互补通道与刹车功能是高级寄存器特有的功能。 在使用互补通道时&#xff0c;往往还需要考虑死区等特殊功能。而本文为了简单起见&#xff0c;不再考虑死区区间。通过配置TIMx_CCER寄存器&#xff0c;来使能互补通道&#x…

Spring IOC 之深入分析 Aware 接口

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ &#xfeff;AbstractAutowireCapableBeanFacto…

Leetcode—33. 搜索旋转排序数组【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—33. 搜索旋转排序数组 实现代码 class Solution { public:int search(vector<int>& nums, int target) {int n nums.size();int l 0, r n - 1;while(l < r) {int m l (r - l) / 2;if(nums[m] target) …

1 月 30 日算法练习-数论

唯一分解定理 唯一分解定理指的是&#xff1a;对于任意一个>1的正整数&#xff0c;都可以以唯一的一种方式分解为若干质因数的乘积。 x p 1 k 1 ⋅ p 2 k 2 ⋅ … ⋅ p m k m x p_1^{k_1} \cdot p_2^{k_2} \cdot \ldots \cdot p_m^{k_m} xp1k1​​⋅p2k2​​⋅…⋅pmkm​…

推荐系统(Recommender Systems)

一、问题形式化 在接下来的内容中&#xff0c;我将开始讲解推荐系统的一些理论知识。我们从一个例子开始定义推荐系统&#xff0c;假使我们是一个电影供应商&#xff0c;我们有 5 部电影和 4 个用户&#xff0c;我们要求用户为电影打分 前三部电影是爱情片&#xff0c;后两部是…

整理:汉诺塔简析

大体上&#xff0c;要解决一个汉诺塔问题&#xff0c;就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C&#xff0c;就要&#xff1a; 将两个盘子从 A 移动到 B&#xff08;子问题 1&#xff09; 为了解决子问题 1&#xff0c;就…

图论练习4

内容&#xff1a;染色划分&#xff0c;带权并查集&#xff0c;扩展并查集 Arpa’s overnight party and Mehrdad’s silent entering 题目链接 题目大意 个点围成一圈&#xff0c;分为对&#xff0c;对内两点不同染色同时&#xff0c;相邻3个点之间必须有两个点不同染色问构…

高端酒店宴会包间桌位预定小程序h5开源版开发

高端酒店宴会包间桌位预定小程序h5开源版开发 餐厅预定桌位系统&#xff0c;支持多店切换预约&#xff0c;提供全部前后台无加密源代码和数据库 功能特性 为你介绍餐厅预订系统的功能特性 多端适配 采用uniapp,目前适配小程序和微信H5 多店铺 支持多店铺预定 付费和免费预定 支…

数据结构中的时间复杂度和空间复杂度基础

目录 数据结构 数据结构中的基本名词 数据 数据对象 数据元素 数据项 数据类型 数据对象、数据元素和数据项之间的关系 数据结构及分类 逻辑结构 物理结构 算法 算法的特点 算法设计上的要求 算法效率的衡量 时间复杂度 大O渐进表示法 最坏情况和平均情况 常…

【Simulink系列】——动态系统仿真 之 离散系统线性离散系统

一、离散系统定义 离散系统是指系统的输入与输出仅在离散的时间上取值&#xff0c;而且离散的时间具有相同的时间间隔。满足下列条件&#xff1a; ①系统&#xff08;的输入输出&#xff09;每隔固定时间间隔才更新一次。固定时间间隔称为采样时间。 ②系统的输出依赖当前的…

【Spring】Spring 启示录

一、OCP 开闭原则 核⼼&#xff1a;在扩展系统功能时不需要修改原先写好的代码&#xff0c;就是符合OCP原则的&#xff0c;反之修改了原先写好的代码&#xff0c;则违背了OCP原则的 若在扩展系统功能时修改原先稳定运⾏程序&#xff0c;原先的所有程序都需要进⾏重新测试&…

景区导览系统|智能导览|景区电子导览|智慧景区导览|AI智能导览

景区/园区导览系统是必不可少的服务内容&#xff0c;可提供提供指引导航&#xff0c;讲解景点、VR游览、预约购票等服务。随着元宇宙、VR、AR等数字科技的不断发展&#xff0c;导览系统的形式也从传统的纸质地图、指示牌等形式&#xff0c;发展为如今的VR/AR智慧导览。 作为国…

【OpenCV人脸检测】写了个智能锁屏小工具!人离开电脑自动锁屏

文章目录 1. 写在前面2. 设计思路3. 人脸检测4. 程序实现 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

MacOS Mojavev10.14.6

MacOS Mojave v10.14.6系统安装包是一款专为Mac用户设计的操作系统软件包。Mojave是苹果公司为Mac设备开发的一个操作系统版本&#xff0c;它提供了许多新功能和改进&#xff0c;旨在提高Mac用户的使用体验和工作效率。 安装MacOS Mojave v10.14.6系统后&#xff0c;用户可以享…

从0到1入门C++编程——07 基于多态的职工管理系统

文章目录 一、创建管理类及菜单功能实现二、创建职工抽象类三、退出管理程序四、增加职工信息五、读写文件操作六、显示职工信息七、删除职工信息八、修改职工信息九、查找职工信息十、对职工信息排序十一、清空文件内容十二、工程文件构成 本案例中利用C实现一个基于多态的职工…

flask_django_python五金电商网络营销的可视化分析研究

前面部分完成了系统需求分析&#xff0c;了解到新闻数据业务方面的需求&#xff0c;系统主要分为用户管理、五金信息管理、在线留言、系统管理等功能。销的可视化研究&#xff0c;并对这些数据进行处理&#xff0c; 然后对这些数据进行可视化分析和统计。 Python 爬虫技术目前来…

职言圈:华为4年员工,小金库存到100万,但却在事业上升期决定回老家县城考公务员。

“华为4年员工&#xff0c;小金库存到100万&#xff0c;但却在事业上升期决定回老家县城考公务员。只因不想现在赚的钱将来都花在了医院&#xff01;” 互联网大厂员工的薪资高&#xff0c;这是人尽皆知的事了&#xff0c;特别是像华为、百度、绿厂、阿里、鹅厂等这些知名公司…