数据结构—B树、B+树

news2024/10/7 6:43:06

文章目录

  • B树
    • B树的特点
    • 为什么要有B树:
      • 红黑树和B树比较
  • B+树
    • B+树的特点
    • B+树构建过程
    • 查询时数据提供数据
      • 磁盘向cpu推送数据
    • B+树的优点
  • 总结
      • 为什么要有B树:
      • B树用途:
      • 为什么要有B+树:
      • B+树用途:

————————————————————————————————
在这里插入图片描述

B树

B树的特点

1、B树的数据存储是key-value类型

2、B树的分叉——并不确定,要看具体实现

3、M阶B树:分成n个叉就是n阶B树,每个节点上最多有n-1个值

 3.1)每个节点上最多有M-1个值,并且以升序排列(2-3-4树也可以叫4阶B树)
 
 3.2)从下向上构建

注:2-3-4树也可以叫4阶B树
例:5阶B树:
在这里插入图片描述
value可以是任意数据类型
5阶B树构建示意:
在这里插入图片描述

为什么要有B树:

红黑树和B树比较

1、从内存的角度来说,查找时红黑树和B树哪个更好?
——>内存的主要作用是向CPU供数据
理论上:红黑树和B树时间复杂度都是O(logn)
真实情况上:
根据数据对比次数来看:cpu进行数据的判断,告诉游标向左走还是向右走
因为红黑树和B树都是在内存当中,内存向CPU提供数据的时间是相等的;

  • 在B树,每一个节点都比较大,可能是十几阶,每一个节点比较的次数多;
  • 在红黑树,每次比较都能折半;

在节点对比上,B树的对比次数要多;因此红黑树对比次数相对较好,所以红黑树是内存最优二叉树
2、为什么要存在B树?
因为计算机存储还有磁盘,在磁盘中,B树更优。

原因: 在磁盘当中,数据寻址浪费时间。
(在磁盘中,数据存储在磁道当中,读取数据需要磁头;因此在磁盘中,读取数据的时间=磁头移动的物理时间+平均盘面旋转半圈;)

  • B树比较矮,数据寻址次数少,寻址时间较少,因此在磁盘中,B树比红黑树好
  • B树多用于磁盘,原因是数据如果分成多个查询,会降低树的高度,降低寻址次数和时间。

B+树

B+树是B树的一个分支,和传统的B树不太一样
B+树被拿出来进行改造,作为mysql的专用数据库,是mysql专用底层数据结构
优势在于寻址

B+树的特点

1、B+树非叶子节点仅具有索引功能,也就是说,非叶子节点只能存储key值(只能做索引),不能存储value值;

2、B+树的所有叶子节点会构成一个有序的链表,这样就可以根据key值遍历数据。

为什么要有以上两个特点??——>为数据库功能服务

B+树构建过程

以5阶B树为例:
在这里插入图片描述

查询时数据提供数据

真实的数据查询是发生在内存当中的,寻址是在磁盘当中(B+树优势在于寻址)
数据推送(提供)的顺序:磁盘——>内存——>CPU

1)没找到数据之前,选用B树查找数据(如果B树和红黑树都在磁盘中,B树找到数据的速度更快);

2)找到后,数据需要放到内存,再传输给CPU

磁盘向cpu推送数据

磁盘每次向CPU推送一页的数据(固定的大小:4KB,如果一次推送的数据不够4KB,那么剩下的空间也不能推送)
注:
1)页是数据存储的逻辑单元;

2)假如一个文件大小为2KB,一个文件大小为3KB因此磁盘推送数据要推送和两次,一次2KB、一次3KB

3)每次磁盘寻址时间和内存推送给CPU并对比的时间如下:
内存将数据传送给CPU、CPU进行运算大约需要20ns,而磁盘一次寻址需要5ms,因此要尽量保证多在内存进行对比。
在这里插入图片描述

B+树的优点

1、非叶子节点只能存储key值(只能做索引),这样每次就可以使磁盘向内存中传送更多的key值,减少总体查询的时间;
(在内存当中进行数据对比,在磁盘当中进行数据查询)
(value值大小是不可控的,因此磁盘向内存同样推送4KB的数据,在B+树中,能推送更多的节点,提供更多的key值来供内存CPU做对比,减少寻址次数)

2、叶子节点是链接在一起的,有利于区间查询

例:select * from user where key >10 and key < 18
在B树需要多次查询及寻址,而由于B+树叶子节点是链表,可以在对比之后直接顺着链表查找

总结

为什么要有B树:

在磁盘中,数据存储在磁道当中,在磁盘当中,数据寻址浪费时间;B树每一层数据较多,层数比较少,数据寻址次数少,因此寻址时间较少

B树用途:

在磁盘中使用,减少寻址时间,从而减少数据查询时间。
如何使用B树:
在磁盘中使用减少寻址次数。

为什么要有B+树:

1)非叶子节点只能存储key值(只能做索引),这样每次就可以使磁盘向内存中传送更多的key值,减少总体查询的时间;
(减少磁盘寻址的时间;在查询数据时,需要从磁盘中推送数据到内存,内存再将数据传送到CPU进行判断,判断好后再根据判断的结果在磁盘寻址;)
2)虽然红黑树是内存最优结构,但是磁盘寻址耗费时间更长,因此要减少寻址次数,尽量多让内存CPU来判断。
3)叶子节点是链接在一起的,有利于mysql数据库区间查询

B+树用途:

mysql专用底层数据结构

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

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

相关文章

WorkTool企微机器人APP分享自定义小程序

移动端应用怎么分享自定义小程序到企业微信 前言 什么是自定义小程序&#xff0c;就是我们可以通过业务逻辑或代码来动态修改每次发出的小程序所附带的路径(path)和参数(params)&#xff0c;以此来控制每次发出的小程序都是有不同含义的&#xff0c;但企业微信并不让我们这样…

[附源码]Python计算机毕业设计Django体育器材及场地管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Spring】事务管理

目录项目目录spring-dao.xml测试项目目录 UserMapper.xml写sql语句UserMapperImpl继承sqlSessionDaoSupport然后在里面做一个addUser和一个delete我们delete语句故意写错 但是我们想把add和delete当成一个事务delete错了&#xff0c;add也不应该成功所以我们需要进行事务管理配…

FLStudio2023水果中文版本使用操作心得与技巧

FL Studio2023是一款强大的音乐创作编辑软件&#xff0c;因软件LOGO为水果标志&#xff0c;故我们国人都习惯称之为水果。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。因此它又有"水…

手撕ThreadLocal源码

首先&#xff0c;创建MyThreadLocal类&#xff0c;区分开java.lang.ThreadLocal package com.huhu.threadlocal;import java.util.HashMap; import java.util.Map;public class MyThreadLocal<T> {/*** 所有需要和当前线程绑定的数据要放到这个容器当中*/private Map<…

WIFI的传输距离介绍

WIFI的传输距离介绍 WiFi模块在智能家居&#xff0c;智能驾舱等各行业各领域应用极广&#xff0c; 但有多少人了解他的传输距离是多少呢&#xff1f;是受什么影响呢&#xff1f; 一&#xff1a;WiFi模块的传输距离 WiFi模块的传输距离普遍在100-200米之间&#xff0c;其中也有支…

乐观锁思想在JAVA中的实现——CAS

前言 生活中我们看待一个事物总有不同的态度&#xff0c;比如半瓶水&#xff0c;悲观的人会觉得只有半瓶水了&#xff0c;而乐观的人则会认为还有半瓶水呢。很多技术思想往往源于生活&#xff0c;因此在多个线程并发访问数据的时候&#xff0c;有了悲观锁和乐观锁。 悲观锁认…

React+ts学习文档

1.项目中遇到的困难解决以及方案 1.顶部的查询按钮 点击查询如果在该组件去进行axios请求&#xff0c;这样再该组件下获得返回的列表还需要传回父组件&#xff0c;父组件再把列表发给下面的table组件&#xff0c;不太方便。 解决方案&#xff1a;将用户的选择项传给顶级组件i…

Kubernetes v1.25 搭建一个单节点集群用于Debug K8S源码

参考说明 参考自&#xff1a;v1.25.0-CentOS-binary-install-IPv6-IPv4-Three-Masters-Two-Slaves.md&#xff0c;按照自己的理解修改了下。 搭建好的单节点v1.25.4版本集群 1. 集群环境准备 1.1. 主机规划 IP主机名主机角色操作系统安装组件192.168.11.71k8s-master1maste…

在Python中使用LSTM和PyTorch进行时间序列预测

顾名思义&#xff0c;时间序列数据是一种随时间变化的数据类型。例如&#xff0c;24小时内的温度&#xff0c;一个月内各种产品的价格&#xff0c;一年中特定公司的股票价格。 去年&#xff0c;我们为一位客户进行了短暂的咨询工作&#xff0c;他正在构建一个主要基于时间序列…

【✨十五天搞定电工基础】正弦交流电路的分析

本章要求 1. 理解正弦量的特征及其各种表示方法&#xff1b; 2. 理解电路基本定律的相量形式及阻抗&#xff1b;熟练掌握计算正弦交流电路的相量分析法&#xff0c; 会画相量图&#xff1b; 3. 掌握有功功率和功率因数的计算,了解瞬时功率、无功功率和视在功率的概…

项目管理(如何进行团队管理)

团队构建与管理6步走 各项工作概述: 获取团队成员需要考虑的因素: 可用性。确认资源能否在项目所需时段内为项目所用。 成本。确认增加资源的成本是否在规定的预算内。 能力。确认团队成员是否提供了项目所需的能力。 有些选择标准对团队资源来说是独特的,包括: 经验。…

HTML人物介绍、个人设计web前端大作业、贝聿铭人物介绍(带报告3000字)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Allegro如何使用快捷键快速切换走线线宽操作指导

Allegro如何使用快捷键快速切换走线线宽操作指导 Allegro可以用快捷键快速切换走线线宽,比如在command下方输入数字5,可以切换到5mil的线宽 具体操作如下 打开系统属性,选择环境变量 找到home的环境变量的路径是哪里 找到路径下的pcbenv文件夹 找到env文件 用记事本打…

Android NDK初识

Android NDK是Android软件开发包(SDK)的相关工具集&#xff0c;用来扩展Android SDK的功能&#xff0c;从而使开发人员能够使用机器代码生成的编程语言(如C、C和汇编语言)实现一些对代码性能要求较高的模块&#xff0c;并将这些模块嵌入到Android应用程序中使用。 什么是Andro…

工业物联网案例:智能工厂设备无人值守系统方案

智能工厂又称“黑灯工厂”&#xff0c;具备智能化、自动化、无人化等特点&#xff0c;可以实现全天候高效的生产工作&#xff0c;是制造业的先进典范。通过工厂设备无人值守系统&#xff0c;可以集中采集、传输、处理、显示各类工业设备数据&#xff0c;可以对空压机、变电站、…

Gitee配置静态页面

辛辛苦苦写好了一个静态网页&#xff0c;想让大家都可以通过网络访问看到这个网页。比如&#xff0c;个人简历&#xff0c;个人静态页面作品展示等。 但是不想买服务器&#xff0c;配置域名&#xff0c;备案&#xff0c;什么的。 可以使用 Gitee Pages 服务&#xff0c;将静态…

Qt-FFmpeg开发-打开本地摄像头录制视频(7)

Qt-FFmpeg开发-打开本地摄像头录制视频【软解码 OpenGL显示YUV】 文章目录Qt-FFmpeg开发-打开本地摄像头录制视频【软解码 OpenGL显示YUV】1、概述2、实现效果3、FFmpeg录制视频编码流程4、主要代码5、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&…

【车辆动力】基于matlab模拟停车动力学【含Matlab源码 2258期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【车辆动力】基于matlab模拟停车动力学【含Matlab源码 2258期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏物理应用(Matlab) 备注: 点击上面蓝色字体付费专栏物理应用(Matlab),扫…

【教学类-20-02】20221203《世界杯16强国旗-定量版》(大班)

展示效果&#xff1a; &#xff08;1个国家2张&#xff0c;16国旗&#xff0c;共32张&#xff09; 打印效果&#xff1a; 背景需求&#xff1a; 上一份代码打印后发现&#xff1a; 1.打印时发现随机抽取的图案不稳定&#xff0c;30张”澳大利亚”“波兰”的图片特别多。因为…