B树系列(详解)

news2024/12/25 1:22:26

目录

一、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树系列的关系。有了代码就好理解了。

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

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

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

相关文章

LED制造企业元亨光电牵手盘古信息,开启数字化转型新篇章

在多媒体时代&#xff0c;LED产品已经融入我们生活的方方面面&#xff0c;无论是在商场、超市、机场&#xff0c;还是在公交站、马路边、隧道内&#xff0c;它们的身影无处不在。 坐落在深圳宝安区福永&#xff0c;拥有40000㎡ 研发生产LED产品基地的深圳市元亨光电股份有限公…

哪个有名的工具可以安全记事 私密记事本笔记推荐

在这个数字化的时代&#xff0c;我们的生活已经离不开各种记事工具。它们帮助我们记录生活中的点点滴滴&#xff0c;无论是工作上的重要事项&#xff0c;还是个人的私密心情。然而&#xff0c;当我在寻找一个能够安心记录私密事情的工具时&#xff0c;安全性成为了我最关心的因…

Tomcat相关基础以及安装运行

目录 一、web概念 二、常见的web服务器 三、Tomcat 安装 下载&#xff1a; 安装&#xff1a; 四、Tomcat 目录结构 五、Tomcat 启动停止 一、web概念 软件架构&#xff1a; B/S&#xff1a; 浏览器/服务器端 ‐‐‐‐‐‐‐‐‐‐‐‐> 京东&#xff0c;网易&#xff0c…

buuctf_reverse_新年快乐+内涵的软件

新年快乐 题目&#xff1a;新年快乐.exe 这玩意有壳&#xff01;我去down了upx脱壳 开始放exeinfope的图片没截&#xff0c;我记得下载完upx后exeinfoPE显示还不一样。留了一张脱壳的实验图片&#xff1a; 然后放IDA 我是笔记本键盘&#xff0c;shiftFnF12转字符串 诶呦&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力&#xff1a; 从API…

判断子序列[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定字符串s和t&#xff0c;判断s是否为t的子序列。字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如ace是abcde的一个子序列&#xff0c…

html样式排版

<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…

C++菱形继承_多态

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/362T6⏪   &#x1f69a;代码仓库:要相信光/C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言…

容联云入选IDC生成式AI图谱,多个案例被评典型应用

随着生成式AI进入商业化初期&#xff0c;国际数据公司&#xff08;IDC&#xff09;于近日发布了《IDC Market Glance: 中国生成式AI市场概览》报告&#xff0c;报告分析了当前市场的整体情况以及市场格局&#xff0c;通过中国生成式AI市场生态图谱V1.0和代表厂商分析&#xff0…

BUUCTF---另外一个世界1

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

C# WPF如何自定义控件ComboBox

在WPF开发中&#xff0c;经常遇到需要修改原生ComboBox的控件样式。 对于新手来说&#xff0c;修改控件样式比较麻烦。 修改的最终样式如下&#xff1a; 你可以利用如下代码模板&#xff0c;修改为你自己想要的样式。 <Style TargetType"{x:Type ComboBox}"&…

CSP-202112-3-登机牌条码

CSP-202112-3-登机牌条码 解题思路 一、.处理大小写和数字 初始化变量&#xff1a;flag: 用来标识当前处理的字符类型&#xff0c;0代表大写字母&#xff0c;1代表小写字母&#xff0c;2代表数字。 大小写字母和数字的处理&#xff1a; 小写字母(a < it && it &l…

新一代湖仓集存储,多模型统一架构,高效挖掘数据价值

星环科技TDH一直致力于给用户带来高性能、高可靠的一站式大数据基础平台&#xff0c;满足对海量数据的存储和复杂业务的处理需求。 同时在易用性方面持续深耕&#xff0c;降低用户开发和运维成本&#xff0c;让数据处理平民化&#xff0c;助力用户以更便捷、高效的方式去挖掘数…

基带信号处理设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

基于6U VPX的双TMS320C6678Xilinx FPGA K7 XC7K420T的图像信号处理板 综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理…

anaconda简介以及安装(Windows)

介绍 Anaconda是一个开源的Python发行版本&#xff0c;它是一个打包的集合&#xff0c;里面预装了conda、Python、众多packages、科学计算工具等。Anaconda的目的是方便使用Python进行数据科学研究&#xff0c;它涵盖了数据科学领域常见的Python库&#xff0c;并且自带了专门用…

Linux之gcc和makefile的使用详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.gcc/g安装 二.gcc运行代码 三.gcc是如何完成的 3.1预处…

matlab图像仿射变换

在Matlab中进行图像的仿射变换通常使用imwarp函数。下面是一个简单的示例代码&#xff0c;以及对应的说明&#xff1a; % 读取图像 image imread(lena.png);% 设置仿射变换矩阵 theta 30; % 旋转角度 scale_factor 1.5; % 缩放因子 shear_factor 0.5; % 剪切因子% 构造仿射…

Ps:海绵工具

海绵工具 Sponge Tool可用于调整图像中特定区域的饱和度&#xff0c;常用于增加或减少颜色的饱和度。 快捷键&#xff1a;O 在特别的灰度图像上&#xff0c;则可用于调整对比度&#xff0c;这可以开发出更多的创意技巧。 ◆ ◆ ◆ 常用操作方法与技巧 1、海绵工具主要用于调整…

二百二十五、海豚调度器——用DolphinScheduler调度执行Flume数据采集任务

一、目的 数仓的数据源是Kafka&#xff0c;因此离线数仓需要用Flume采集Kafka中的数据到HDFS中 在实际项目中&#xff0c;不可能一直在Xshell中启动Flume任务&#xff0c;一是项目的Flume任务很多&#xff0c;二是一旦Xshell页面关闭Flume任务就会停止&#xff0c;这样非常不…

【数据结构与算法】动态规划法解题20240302

这里写目录标题 一、198. 打家劫舍1、动态规划五部曲 二、213. 打家劫舍 II 一、198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间…