B树系列(详解)

目录

一、B-树

二、B+树

三、B*树

四、时间复杂度

五、Mysql与B树系列


一、B-树

        首先再说B树的性质以及其他的之前,先要说一声,好多人都把这个树叫B减树,其实不是,他就叫B树,至于原因我觉的没必要再这个名字上纠结吧!!

        其实简单点说B树就是多叉平衡树,为什么这么说呢?其实他就是在平衡二叉树原有的基础上,进行改进的。为什么要改进呢?其实也很简单,就像我们排序的时候一样,我们不可能一直在内存中进行排序,也有可能在内存外排序,也就是外排序,这个同样的道理,就是当我们的数据多到一定程度的时候,内存中也就存不下了,而且就算存的下,也不会存,先不说大型项目中的那些数据,如果一不小把程序给关了,那么这些数据就没了,所以我们选择存储在磁盘上。但是我们在磁盘上怎么找他呢?如果我们在代码中找他的时候,那么势必要把磁盘数据加载到内存中,而我们找数据讲究的是快,所以我们采用一定的数据结构来管理这些数据,以方便我们查找的时候,可以快速的找到。

        我们学习过的数据结构中,查找能排上号的就是哈希,AVL,红黑树等。但是此时要想到一个问题就是,用这些数据结构中的其中一个来保存这些数据,那么我们势必要进行IO,这个是无可避免的,因为我们要知道的是,这个是从磁盘上读取数据到内存中。所以我们每次进行比较的时候,都是一次IO,这样就大大的降低了我们查找的效率。

如上图中的二叉树,其实我们一般存储的是文件块的地址,来一个数据,因为这里是地址,所以我们每个节点都要进行IO,所以此时就效率就低了。

也有人说用哈希,哈希其实也是一个道理,它也要进行IO。我们查找数据的时候吗,总不能拿着地址访问把,且有的时候,哈希冲突严重的时候,每个桶下面挂链表还不如挂成红黑树,此时不就又绕回来了吗?所以,此时B树就闪亮登场了。

B树的规则:

规则如上,这里就不再详细说了。

好了,我们知道了B树的规则,那么我们为什么要用B树呢?其实B树是减少了IO次数。为什么呢?因为我们用B树的时候,B树的每个节点的所存储的关键字数量比AVL,红黑树等数据结构要多,所以他每次进行IO 的时候,就可以一次读取多个关键子和孩子所指向的文件数据块。这样,我们就变相的减少了IO次数。且B树的每个节点的m一般系统会设置成1024,至于为什么,深入了解过文件系统的伙伴大概知道(这里我自己也是看到过网上有人说,至于原因,个人了解的也不太清楚,好像是跟文件系统的什么大小有关来着,也是1024,知道的伙伴可以说一下),这样就大大减少了B树的高度,最差情况下,也是进行高度次IO,而此时的IO次数最多也就是4次。所以大大提高了效率。

二、B+树

B+树在原有的B树的基础上进行了改进,就是把每个节点的孩子数量改成和关键字数量相等了。然后是每个分支节点只有索引,没有映射的值。叶子结点改成了类似于链表的形式,且叶子结点包含映射的值,并且叶子结点中包含了所有节点的索引(关键字),并且是有序的。并且每个分支节点的第一个关键字是其对应的孩子节点的最小值。如下:

这样的改进就使得每次搜索必然是要到叶子结点,因为只有这样才可以拿到关键字所映射的内容。

而这样的话,其实是在一定程度上减少了IO次数,因为B树是每个节点都有关键字和其所映射的内容,而B+树都是关键字,所以每个节点的关键相对于B树是增加了的。也就是在相同空间下,B+树一次IO的节点数比B树一次IO的节点数要多。

其次,就是B+树的比那里遍历相对于B树来说是方便了很多。它直接可以遍历叶子结点,就可以得到所有内容。

三、B*树

其实B*树就是在B+树上做了一些相应的改进,它整体是提高了空间利用率,但是其他方面与B+树没有什么本质区别。且在运用的时候,B+树用的较多。而B*树不是没用,而是相对于B+树来说,运用的较少而已。

四、时间复杂度

其实怎么说,老师讲课的时候说的是logMN(m为底,n的对数),但是我感觉这样有点不太对劲。后来我在网上查了些资料,有的说是mlogmn、logm*logmn,logn。其实我个人认为logmn是不对的,我自己也想了很久,其实也不能说是不对,只是这个时间复杂度是是最好的情况下是logmn,我认为我刚刚说的以上的三个是比较正确的(logmn只是个人感觉不太对,不是错的,就是这个是最好的情况以下,才是logmn)。

1.m*logmn

因为我们都知道的是,B树的每个节点都是有M-1个关键字,这里1影响不大,所以直接省略。那么最坏的情况下是每个节点都比较得到最后一个节点,比较B树的高度次,所以就应该是m*logmn。有些伙伴说这里可以把m给省略了,就是logmn,但是我想说的是,这里不可以省略。因为将近十亿个数据的高度是将近3-4层,也就是3<=logmn<=4,而系统默认给的B树的每个节点m=1024,所以这里m的影响还是很大的,所以我认为是不可以省略的。而其实这里的时间复杂度也是跟m的取值有关。如果m取值相对于logmn的影响较小,此时才可以省略。如果就用系统默认给的m,这里我认为是不可以省略的。

2.logm*logmn

这个就很好理解了,因为每个节点的关键字都是有序的,所以我们在查找每个节点的关键字的时候,不要遍历,只需要直接用二分查找就好,所以是logm*logmn。

后面的一个是logn其实就是二分查找这个方法的时间复杂度化简得到的。这里简单说一下,就是用换底公式就可以化简出来。

五、Mysql与B树系列

其实学习过数据库的都知道,数据库本质是管理文件中的数据,而数据结构是管理内存中的数据。那么,我们B树系列的数据结构与数据库有什么关系呢?其实也很容易就也可以想到。因为B树系列的诞生使得我们可以进行在磁盘上进行查找数据时大大提高了效率。但是,特闷到底是什么关系呢?

其实Mysql本质就是cs模型,这里就不详细说明。建立数据库其实本质上就是在存储引擎的这里建立B+树。然后存储引擎下面就是文件系统。而其实缓存就是把磁盘数据加载到缓存中。就是类似于LRU这种缓存。而这里主要说一下两种搜索引擎

1.MyISAM

其建立的B+树是索引文件与数据文件分开的。索引在我理解来说就是B+树种的关键字。再用SQL语句建立表的时候,一般都会有个主键,主键是唯一的。(这里是数据库的知识),而B+树建立的时候,其key就是这个主键,叶子结点是会挂一个val的值来对应映射。如果想用其他搜索,只需建立索引就可以。建立索引数据库重新建立一个B+树,然后把这个索引当成key。

2.InnoDB

其建立的B+树是索引文件与数据文件不分离的,也就是在一起的。注意的是,这个搜索引擎建立索引的B+树的时候,其叶子结点的val是主键值。

Mysql这里讲的比较浅,如果有伙伴想了解的,也可以私信,可以互相探讨一下。过几天会发B树系列的代码实现,到时候也会详细说数据库与B树系列的关系。有了代码就好理解了。

最后,希望大家支持一下,谢谢!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS证书怎么申请?多少钱?

HTTPS证书的申请费用会因多种因素而异&#xff0c;主要包括以下几点&#xff1a; 1. 证书类型&#xff1a; - 域名验证型证书(DV SSL)&#xff1a;这种证书仅验证域名的所有权&#xff0c;申请速度较快&#xff0c;通常用于个人网站或小型项目&#xff0c;价格相对较低&…

Java对象大小计算

概述 在实际应用中&#xff0c;尤其是在进行JVM调优时&#xff0c;理解并正确估计对象大小是非常重要的&#xff0c;因为这直接影响到内存分配、垃圾回收效率以及应用程序的整体性能。 对象的组成 在Java中&#xff0c;计算一个对象的大小是为了了解它在内存中占用的确切空间…

vue2后台管理系统demo,包含增删查改、模糊搜索、分页

因一直敲小程序&#xff0c;vue不熟练&#xff0c;自己练手项目&#xff0c;就包含增删查改以及模糊搜索分页 一、页面简单但功能齐全 二、数据是mock模拟 三、启动步骤 1、 json-server --watch data.json 启动mock数据 2、npm i 下载依赖 3、npm run serve 四、github地址…

【机器学习:推荐系统】什么是推荐系统?

【机器学习&#xff1a;推荐系统】什么是推荐系统&#xff1f; 推荐系统如何工作&#xff1f;推荐系统生命周期推荐系统算法使用推荐系统的好处推荐系统的类型协同过滤基于内容的过滤混合过滤 现实生活中的推荐系统示例亚马逊Spotify脸书/元数据Netflix谷歌和 YouTube 关于推荐…

BUUCTF---另外一个世界1

1.这是一道杂项题&#xff0c;也是我觉得最值得记录的一道题。 2.话不多说&#xff0c;题目描述&#xff08;真的是另一个世界&#xff09; 3.下载附件&#xff0c;是一张图片 4.尝试了查看属性&#xff0c;以及在记事本中打开看看有没有什么有用的信息&#xff0c;发现没什么…

基于单片机的节能窗控制系统设计

摘 要:本文以单片机为基础,对节能窗控制系统进行了科学设计,在满足日常生活需求的同时更好地实现节能减排目标。此设计中的节能窗控制系统,实际操作要灵活,具备可靠且稳定的性能,同时具备节能功效。 关键词:单片机;节能窗控制系统;系统设计 在节能窗等概念推广的背景…

Java 下载excel文件

一、背景 微信小程序需要导出excel文件&#xff0c;后端技术Java&#xff0c;前端使用uniapp框架&#xff0c;使用excel模板。 二、excel 报表模板 需要补充的内容是以下标记问号的&#xff0c;其中有个表格&#xff0c;内容是动态添加的 三、Java端代码实现 关键步骤&…

LabVIEW流量控制系统

LabVIEW流量控制系统 为响应水下航行体操纵舵翼环量控制技术的试验研究需求&#xff0c;通过LabVIEW开发了一套小量程流量控制系统。该系统能够满足特定流量控制范围及精度要求&#xff0c;展现了其在实验研究中的经济性、可靠性和实用性&#xff0c;具有良好的推广价值。 项…

【OpenCV】绘制桌面锁屏时钟

OpenCV 是一个开源的计算机视觉&#xff08;Computer Vision&#xff09;与机器学习软件库&#xff0c;提供了多种图像处理算法与接口&#xff0c;用于解决计算机视觉相关问题。OpenCV 支持多平台与多语言&#xff0c;本文主要记录如何使用 OpenCV-Python 绘制桌面锁屏时钟。 目…

NX二次开发:ListingWindow窗口的应用

一、概述 在NX二次开发的学习中&#xff0c;浏览博客时发现看到[社恐猫]和[王牌飞行员_里海]这两篇博客中写道有关信息窗口内容的打印和将窗口内容保存为txt,个人人为在二次开发项目很有必要&#xff0c;因此做以下记录。 ListingWindow信息窗口发送信息四种位置类型 设置Listi…

【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台

VPX637是一款基于6U VPX总线架构的通用实时信号处理平台&#xff0c;该平台采用一片Xilinx的高性能Kintex UltraScale系列FPGA&#xff08;XCKU115-2FLVF1924I&#xff09;作为预处理单元&#xff0c;外挂2个FMC扩展接口&#xff0c;来完成数据采集、数据回放以及实时信号处理算…

NLP Seq2Seq模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mi…

wireshark抓取localhost(127.0.0.1)数据包

打开wireshark中&#xff0c;在"capture"菜单中&#xff0c;选择"interfaces"子菜单&#xff0c;在列出的接口中选中"Adapter for loopback traffic capture"即可。 必须安装了Npcap才有此选项&#xff0c;否则需要重新安装wireshark。 抓包截图…

Vue+SpringBoot打造城市桥梁道路管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统&#xff0c;支持…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的数字化时代扮演着越来越重要的角色&#xff0c;它们通过人工智能技术&#xff0c;可以自动批量生成各种类型的文章&#xff0c;为用户提供了便利和效率。本文将介绍5款不同的GPT批量工具&#xff0c;并介绍一款知名的147GPT生成工具&#xff0c;以及另外一款…

beets,一个有趣的 Python 音乐信息管理工具!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Beet库&#xff1f; 安装Beet库 使用Beet库 Beet库的功能特性 1. 多种音乐格式支持 2. 自动标签识…

ECMAScript-262 @2023版本中的关键字和保留字

1、什么是标识符&#xff1f; 所谓标识符&#xff0c;就是javascript里的变量、函数、属性或函数参数的名称&#xff0c;可由一个或多个字符组成&#xff0c;当然标识符有命名规范 标识符第一个字符必须是 一个字母、下划线&#xff08;_&#xff09;或美元符号&#xff08;$…

在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁

内核-用户空间鸿沟 构建自己的 TCP栈是一项极具挑战的任务。通常&#xff0c;当用户空间应用程序需要互联网连接时&#xff0c;它们会调用操作系统内核提供的高级 API。这些 API 帮助应用程序 连接网络创建、发送和接收数据&#xff0c;从而消除了直接处理原始数据包的复杂性。…

烧脑问题解决办法:如何选择一款合适自己的手机流量卡

现在社会人们越来越离不开手机了&#xff0c;手机给我们生活带来了翻天覆地的变化&#xff0c;手机需要最多的就是流量了&#xff0c;所以选择一款合适自己的手机流量卡就显得尤为重要了&#xff0c;今天小编就给大家来分享一下我的经验&#xff0c;希望对大家能有帮助&#xf…

STM32合并烧录IAP+APP

STM32合并烧录IAPAPP 通过查找相关资料 有以下几种合并方法 第一种直接将二进制文件用记事本合并 而要合并的就是就将IAP最后的一行删除&#xff0c;然后将APP程序追加在后面。 &#xff08;修改前&#xff09; 把APP的.hex 全部内容拷贝复制到 刚才删掉结束语句的 IAP的.…