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

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

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

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

相关文章

docker 转为docker-compose(composerize 命令)

可以使用Composerize将Docker命令转换为Docker Compose文件。 例如&#xff1a;将docker run命令转换为Docker Compose格式&#xff0c;只需用Composerize运行它&#xff0c;如下所示&#xff1a; composerize docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/…

【JavaSE】异常

异常概述 异常指的是程序在执行的过程中&#xff0c;出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 在Java中&#xff0c;使用不同的类来表示不同的异常&#xff08;正所谓万物皆对象&#xff0c;因此异常也使用类来表示&#xff09;。一旦程序出现某种…

【HTML】HTML基础5(特殊字符)

目录 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 当我在两个文字间打出空格时 <p>“银河护卫队”系列 在漫威电影宇宙中一直是异数般的存在&#xff0c;不仅因为影片主角是一群反英雄&#xff0c;<strong>与超级英雄相比显得格格不入<…

LeetCode 刷题 [C++] 第347题.前 K 个高频元素

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 题目分析 据题意可知&#xff0c;我们需要先遍历整个数组&#xff0c;并统计每个数字出现的次数&#xff0c;保存在哈希表中&#xff1b;对元素…

synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

文章目录 &#x1f490;synchrosized的可重入特性关于死锁&#xff1a;哲学家就餐问题&#x1f4a1;如何避免/解决死锁 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;当一个线程针对一个对象同时加锁多次&#xff0c;不会构成死锁&#xff0c;这样的特性称为…

前端学习第一天-html基础

达标要求 网页的形成过程 常用的浏览器及常见的浏览器内核 web 标准三层组成 什么是HTML 熟练掌握HTML文档结构 熟练掌握HTML常用标签 1. 初识web前端 Web前端是创建Web页面或App等前端界面呈现给用户的过程。 Web前端开发是从网页制作演变而来&#xff0c;早期网站主…

sklearn.preprocessing.RobustScaler(解释和原理,分位数,四分位差)

提示&#xff1a;sklearn.preprocessing.RobustScaler&#xff08;解释和原理&#xff0c;分位数&#xff0c;四分位差&#xff09; 文章目录 [TOC](文章目录) 一、RobustScaler 是什么&#xff1f;二、代码1.代码2.输出结果 总结 提示&#xff1a;以下是本篇文章正文内容&…

ELK学习

ELK 一、ELK介绍 &#x1f604; “ELK”是三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0…

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程&#xff1f; 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程&#xff1f; 网络编程是可以让设…

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理&#xff1a;在评论的时候提交可以提交到管理员列表去&#xff0c;管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做&#xff0c;看看后台吧 那…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法&#xff1a;点击查看WebStorm安装 下载地址&#xff1a;点击查看 二、环境准备 镜像准备 1.查看代理&#xff1a;npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

【电机仿真】空间矢量脉宽调制(SVPWM)算法与实现

前言 文章【电机仿真】永磁同步电机模型中所提及了PMSM数学模型&#xff0c;模型算法是电机控制的理论基础&#xff0c;但在实际控制中&#xff0c;需要将这两部分具象化。实际电机所需要的总是三相电流或者电压&#xff0c;控制对象为逆变器中的开关器件&#xff0c;我们需要将…

springboot基于web的音乐网站论文

音乐网站 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c…

114.龙芯2k1000-pmon(13)- 串口如何用

本文是讲原理图的部分&#xff0c;跟pmon的关系不大&#xff01;&#xff01; 参考手册&#xff1a;《龙芯2K1000处理器用户手册.pdf》 刚刚看数据手册&#xff0c;让我是有点惊讶&#xff0c;但是也让我迷惑。&#xff08;一个串口复用为4个是啥意思&#xff1f;&#xff09;…

Java项目:32 基于springboot的课程作业管理系统(含源码数据库+文档免费送)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员&#xff1a;首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理…

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本&#xff08;谨慎更新&#xff09; 如果升级驱动出现问题&#xff0c;重启驱动软件后会默认让你恢复的。 …

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月&#xff0c;我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…

程序项目打包发布方法,采用InstallShield软件

重点&#xff1a; 1.程序项目做出来了&#xff0c;需要打包发布给用户。如何打包是关键。 2.采用InstallShield软件进行发布。 步骤一&#xff1a;创建一个依赖三方库配置环境的bat文件的项目。 &#xff08;主要测试三方库打包 和如果有bat文件&#xff0c;需要先创建环境&…

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…

Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的商业辅助决策系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的商业辅助决策系统的设计与实现&#xff0c;采…