B树(B-树) [数据结构与算法][Java]

news2024/11/20 11:22:09

B树

B树又称为多路平衡树查找树, 是一种组织和维护外存文件系统非常有效的数据结构

因为我们的二分搜索树构建的时候很可能会出现不平衡的情况, 所以我们提出了自平衡二分搜索树(AVL树)对我们的普通的二分搜索树进行了一个优化, 而自平衡二分搜索树中当元素很多的时候树的高度也会很高, 当我们的二分搜索树用于数据库检索的时候效率也会很低, 因为树的高度就决定了我们用于数据库检索的时候要发生的I/O次数, 所以我们用于数据库检索的树一定是要高度比较低的, 因为我们的和磁盘IO是很费时间的, 也就是对效率影响是很大的 —> 所以我们又提出了多路平衡查找树, 能很好的解决这一问题
  • 所以我们的B树就是用来减少磁盘IO次数的, 因为当我们的数据特别多的时候, 当数据量达到亿级别之后, 我们的主存中可能就存放不下了, 这个时候我们要将数据以块的形式存储到磁盘中, 这个时候我们要去磁盘上查找数据就会涉及到和磁盘之间的IO, 而我们知道和磁盘之间的IO不像直接访问主存(内存)中的数据, 如果是内存中的数据我们很快就可以访问到, 但是如果是外存(磁盘)中的数据, 我们要访问的时候就会涉及内存和磁盘的IO, 因为我们要先将数据从磁盘(外存)中读取到内存中来, 这个过程是很耗费时间的
    • 如果我们使用二分搜索树作为检索磁盘数据的底层结构, 那么我们需要检索的平均IO次数就在O(log n) 到O(n)之间
      • 如果是一个满二叉树的时候, 这个时候树的高度就是以2为底n的对数(n就是结点个数), 而树的高度其实就是决定了我们查找的效率, 而如果是一个满二叉树的时候查找的效率是最高的, 也就是O(n), 但是如果这个数是完全倾斜的, 这个时候最终就会严重不平衡, 类似于一个链表, 这个时候查找的时间复杂度就是O(n)
    • 如果我们使用自平衡二叉树作为检索磁盘数据的底层结构, 那么我们需要检索的平均IO次数为O(log n)
    • 如果我们使用的是多路平衡搜索树作为检索磁盘数据的底层结构, 那么我们需要检索的平均IO次数会低于O(log n), 我们可以通过设置多路平衡搜索树的阶数来控制IO次数, 甚至1024阶的多路平衡搜索树在600亿数据中检索只需要四次磁盘IO(也就是树高为4)
      • 因为我们的检索磁盘数据的IO次数就和底层树结构的高度有关, 我们的二分搜索树的树高为O(log n) - O(n), 自平衡二叉树的树高度为O(log n) , 多路平衡搜索树的树高度可以通过设置不同的阶数来改变, 但是肯定是低于O(log n)的

B树就是一个多路平衡搜索树

  • B树中要求任何一个节点的BF都要等于0
    • BF : 平衡因子

这里我们以一个实例来了解B树(如下图就是一个三阶B树):

在这里插入图片描述

一颗m阶B树要么是一颗空树, 要么是满足下列要求的m叉树:

  1. 树中每个结点至多有m个孩子结点
    • 至多有m个孩子结点, 那么也就是至多有m-1个关键字
  2. 处根节点外, 其他非叶子结点至少有Math.celi(m / 2)个孩子结点
    • 除根节点以外, 所有结点(包括非叶子结点和叶子结点), 每个结点至少有Math.celi(m / 2) - 1个关键字
对于B树而言: 一个节点的关键字数总是被限制在某个范围之内:
  • 根节点: 1个关键字到m个关键字
  • 非根节点: Math.celi(m / 2) - 1个关键字到m-1个关键字
而确定了关键字个数之后对应节点的子节点个数就更加好确定了, 我们的子节点个数要么为0, 要么为当前节点的关键字个数 + 1
  1. 若根节点不是叶子结点, 则根节点至少有两个孩子结点

  2. 每个结点的结构如下(结点中按关键字(数据项)的大小顺序排列):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMEpUByG-1671859765528)(E:\非凡英才\数据结构(java)]\数据结构图解\B树中每个结点的结构.png)

  • 我们可以发现指针总是比关键字多一个, 因为我们的关键字的两边都要是指针, 这也就是为什么我们的结点中的子节点个数总是比关键字个数多一个了
    • 因为我们的指针(索引)也就是指向我们的子节点的
  • 我们的指针(索引)是从P0开始的, 而关键字则是从K1开始的, 最终是通过Kn后面一个Pn结束的
  1. 所有外部结点都在同一层中(也就是所有的叶子结点都在同一层)
  2. B树是所有结点的平衡因子均等于0的多路平衡树

注意: 在计算B树高度时, 需要计入最底层的外部结点

说明: 在B树中, 外部结点就是失败结点, 指向它的指针为空, 不含有任何信息, 外部结点是虚设的

一颗B树中有n个关键字, 则外部结点的个数为n + 1

2 - 3树是最简单的B树, 2 - 3树就是三阶B树

补充:

没有B-树, 所谓的B-树就是B树, 只有B树, B+(加)树, B*(星)树

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

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

相关文章

Axure绘制密码输入框

当我们在绘制登录页面时,如果登录方式包含账号密码登录,那么我们就会使用到密 码输入框,而常见的密码输入框,通常会使用到小眼睛控制密码的明文和密文显示。 大家知道axure中的输入框,当你设置成密码类型时&#xff…

结构体内存对齐问题

结构体重点😃 1.结构体内存对齐问题,是在计算结构体的大小时,对结构体成员在内存中的位置进行研究的问题。 废话不多说,先看两个例子: 例题1: struct S1 {char c1;int age;char c2; };int main() {struc…

Spring Cloud Alibaba 2022.0.0.0 版本发布啦!

01新版本预览Aliware本次发布的 Spring Cloud Alibaba 2022.0.0.0-RC1 版本,是基于社区 2022.x 主干分支进行构建发布第一个 Release Candidate(RC)版本,考虑到本次版本升级属于重大版本变更,因此暂时先以 RC 版本形式…

如何不改一行代码,让Hippy启动速度提升50%?

导读|Hippy使用JS引擎进行异步渲染,在用户从点击到打开首屏可交互过程中会有一定的耗时,影响用户体验。如何优化这段耗时?腾讯客户端开发工程师李鹏,将介绍QQ浏览器通过切换JS引擎来优化耗时的探索过程和效果收益。在分…

雷神科技在北交所上市首日破发:上半年业绩下滑,路凯林为董事长

12月23日,青岛雷神科技股份有限公司(下称“雷神科技”,BJ:872190)在北京证券交易所(即北交所)上市。本次上市,雷神科技的发行价为25.00元/股,发行数量为1250万股,发行后总…

2023春季招聘面试集锦:MYSQL数据库高频面试题

mysql索引的数据结构,各自优劣 索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B树索引等, InnoDB存储引擎的默认索引实现为:B树索引。对于哈希索引来说,底层的数据结构就是…

Dubbo(尚硅谷)学习笔记1

我们的dubbo需要一个注册中心也就是我们的zookeeper。 我们先把zookeeper搭建起来: 我这里是用的zookeeper3.3.4当然想用其它版本的也可以去官网去找。 我们运行这个文件: 第一次是会运行失败,所以我们还是找到这个文件 把下面的文件复制一…

小学生要学python开发游戏吗

小学生要学python开发游戏吗    小学生要学python开发游戏吗?为什么 而学, 到底需要如何做到, 又该如何学习. 就我个人来说, 小学生要学python开发游戏吗很有意义, 不能不说非常重大.    一般来讲, 我们都必须务必慎重的考虑考虑. 莎士比亚在不经意间这样说过&a…

qt plaintextedit使用_qt获取lineedit的内容

QLineEdit和QTextEdit都是文本框类,QLineEdit类是单行文本框控件,可以输入单行字符串。QTextEdit类是多行文本框控件,可以显示多行文本内容,当文本内容超出控件显示范围时,可以显示水平个垂直滚动条。QTextEdit不仅可以…

【工作流Activiti7】3、Activiti7 回退与会签

1. 回退(驳回) 回退的思路就是动态更改节点的流向。先遇水搭桥,最后再过河拆桥。 具体操作如下: 取得当前节点的信息取得当前节点的上一个节点的信息保存当前节点的流向新建流向,由当前节点指向上一个节点将当前节…

2022 年全球重大经济事件盘点( I )

2022 年,全球经济正面临百年未有之大变局,接踵而至的大事件造成今年行情剧烈波动,以往的投资逻辑不断遭遇修改。 正所谓阳光之下没有新鲜事。通过对于重大事件的复盘,分析了解过往历史脉络,投资者方能温故知新&#…

计算机视觉与图形学-神经渲染专题-

《Removing Objects From Neural Radiance Fields》链接:https://arxiv.org/pdf/2212.11966.pdf摘要神经辐射场 (NeRFs) 正逐步应用到场景表征的各个方向,来实现新颖视图的合成。NeRF 将越来越多内容与其他人共享。不过,在共享 NeRF 之前&…

深入理解 Linux 零拷贝以及 Linux 中 I/O 的底层原理,在kafka、nginx、golang等等各种文件传输场景中不同的优化手段和实际应用

深入理解 Linux 零拷贝以及 Linux 中 I/O 的底层原理,在kafka、nginx、golang等等各种文件传输场景中不同的优化手段和实际应用。从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。 前言 存储器是计算机的核心部件之一,在完全理想的状态下,存…

搞定 Redis 数据存储原理,别只会 set、get 了

我的核心模块如图 1-10。 图 1-10 Client 客户端,官方提供了 C 语言开发的客户端,可以发送命令,性能分析和测试等。 网络层事件驱动模型,基于 I/O 多路复用,封装了一个短小精悍的高性能 ae 库,全称是 a si…

TIP2022|领域迁移Adaboost,让模型“选择”学哪些数据

论文下载:https://zdzheng.xyz/files/TIP_Adaboost.pdf 备份:https://arxiv.org/pdf/2103.15685.pdf 作者:Zhedong Zheng,Yi Yang 代码链接: GitHub - layumi/AdaBoost_Seg: TIP2022 Adaptive Boosting (AdaBoost) …

rescue-prime:基于Goldilocks域的Rescue-Prime 哈希函数加速

1. 引言 前序博客: Goldilocks域 所谓计算友好的哈希函数,是指: 基于素数域元素,而不是 通常的如SHA3-256/SHA256/BLAKE3中的raw bits/bytes/N-bit words。原因是,在STARK证明系统中,基于素数域的计算电…

三极管 vs MOS管 | PMOS与NMOS

三极管 与 MOS管 MOS管等效模型:电压控制(输入端G是电容);负载端D-S是小电阻,大电流时损耗小。 三级管等效模型:电流控制(输入端G是电阻);负载端是二极管,大…

活动星投票“2023年度台历宝宝”网络评选投票图文投票怎么做

近些年来,第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放,更多人选择微信投票小程序平台,因为它有非常大的优势。1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

我国户用光伏行业现状:装机规模创新高 国补退去对产业影响如何?

区别于大型光伏电站的大功率、占地广,户用光伏发电是指将光伏电池板置于家庭住宅顶层或者院落内,用小功率或者微逆变器进行换流过程,并直接利用该新能源,亦可将多余的电能并入电网,户用光伏属于分布式光伏范畴。目前&a…

【源码共读】将值转换为数组《arrify》

使用 根据库的作者提供的readme,使用方式很简单: 1.安装 npm install arrify 2.使用 import arrify from arrify;arrify(🦄); //> [🦄]arrify([🦄]); //> [🦄]arrify(new Set([🦄]));…