b 树和 b+树的理解

news2024/9/20 16:58:38

项目场景:

图灵奖获得者(Niklaus Wirth )说过: 程序 = 数据结构 + 算法, 也就说我们无时无刻 都在和数据结构打交道。 只是作为 Java 开发,由于技术体系的成熟度较高,使得大部分人认为:程序应该等于 框 架 + SQL ?


问题分析与描述:

从二方面方面来思考:

  • 了解二叉树、AVL 树、B 树的概念
  • B 树和 B+树的应用
  1. B 树是一种多路平衡查找树,为了更形象的理解,如下图所示。

        二叉树,每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。

        二叉查找树,在二叉树的基础上增加了一个规则,左子树的所有节点的值都小于它的根 节点,右子树的所有子节点都大于它的根节点。如下图所示。

        

        二叉查找树会出现斜树问题,导致时间复杂度增加,因此又引入了一种平衡二叉树,它具有二叉查找树的所有特点,同时增加了一个规则:”它的左右两个子树的高度差的绝对值不超过 1“。平衡二叉树会采用左旋、右旋的方式来实现平衡。如下图所示。

        而 B 树是一种多路平衡查找树,它满足平衡二叉树的规则,但是它可以有多个子树,子树的数量取决于关键字的数量,比如这个图中根节点有两个关键字 3 和 5, 那么它能够拥有的子路数量=关键字数+1。 如下图所示。 

        因此从这个特征来看,在存储同样数据量的情况下,平衡二叉树的高度要大于 B 树

B+树,其实是在 B 树的基础上做的增强,最大的区别有两个:

         a. B 树的数据存储在每个节点上,而 B+树中的数据是存储在叶子节点,并且通过链表的方               式把叶子节点中的数据进行连接。

        b. B+树的子路数量等于关键字数

---------------------------------------------------------------------------------------------------------------------------------

如下图所示,这个是 B 树的存储结构,从 B 树上可以看到每个节点会存储数据。

 如下图所示,这个是 B+树,B+树的所有数据是存储在叶子节点,并且叶子节点的数据是用双向链表关联的

        2. B 树和 B+树,一般都是应用在文件系统和数据库系统中,用来减少磁盘 IO 带来的性能损耗

         以 Mysql 中的 InnoDB 为例,当我们通过 select 语句去查询一条数据时,InnoDB 需要从磁盘上去读取数据,这个过程会涉及到磁盘 IO 以及磁盘的随机 IO(如图所示) 我们知道磁盘 IO 的性能是特别低的,特别是随机磁盘 IO。 因为,磁盘 IO 的工作原理是,首先系统会把数据逻辑地址传给磁盘,磁盘控制电路按照寻址逻辑把逻辑地址翻译成物理地址,也就是确定要读取的数据在哪个磁道,哪个扇区。

        为了读取这个扇区的数据,需要把磁头放在这个扇区的上面,为了实现这一个点,磁盘 会不断旋转,把目标扇区旋转到磁头下面,使得磁头找到对应的磁道,这里涉及到寻道事件以及旋转时间。

 

        很明显,磁盘 IO 这个过程的性能开销是非常大的,特别是查询的数据量比较多的情况下。 所以在 InnoDB 中,干脆对存储在磁盘块上的数据建立一个索引,然后把索引数据以及 索引列对应的磁盘地址,以 B+树的方式来存储。 如图所示,当我们需要查询目标数据的时候,根据索引从 B+树中查找目标数据即可, 由于 B+树分路较多,所以只需要较少次数的磁盘 IO 就能查找到。

 

        3. 为什么用 B 树或者 B+树来做索引结构?原因是 AVL 树的高度要比 B 树的高度要高,而高度就意味着磁盘 IO 的数量。所以为了减少磁盘 IO 的次数,文件系统或者数据库才会采用 B 树或者 B+树。

结尾

        数据结构在实际开发中非常常见,比如数组、链表、双向链表、红黑树、跳跃表、B 树、 B+树、队列等。 数据结构是编程中最重要的基本功之一。

        学了顺序表和链表,我们就能知道查询操作比较多的场景中应该用顺序表,修改操作比 较多的场景应该使用链表。

        学了队列之后,就知道对于 FIFO 的场景中,应该使用队列。

        学了树的结构后,会发现原来查找类的场景,还可以更进一步提升查询性能。

基本功决定大家在技术这个岗位上能够走到的高度。

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

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

相关文章

BugKu CTF(杂项篇MISC)—社工-进阶收集

BugKu CTF(杂项篇MISC)—社工-进阶收集 提 示: flag{小美小区名字拼音} 描 述: 小明当年为了追求小美想尽办法获得小美的地址。直到有一天小美发了一条说说,小明觉得希望来了。(实战改编题,难度降低了。) [外链图片转存失败,源站可能有防盗链机制,建议…

CAS 机制

问题分析与思考: CAS 是 Java 中 Unsafe 类里面的方法,它的全称是 CompareAndSwap,比较并交换 的意思。 它的主要功能是能够保证在多线程环境下,对于共享变量的修改的原子性。 举个例子,比如说有这样一个场景&#xff…

手机上怎么pdf转word?教你这样操作

手机上怎么pdf转word?在现代社会,PDF和Word文档是我们工作和学习中经常用到的文档格式。有时候,我们需要将PDF文档转换为Word文档,以便更好地编辑和修改。那么,我们该如何在手机上实现PDF转Word呢?今天就给…

从小白到大神之路之学习运维第71天-------Docker容器引擎操作(创建私有仓库、docker资源限制、数据持久化、volume的基本使用)

第四阶段 时 间:2023年8月1日 参加人:全班人员 内 容: Docker容器引擎操作 目录 一、Docker 容器操作 1、创建容器与运行容器 2、容器的启动与停止 3、容器的运行与终止 4、容器的进入 5、容器的导出与导入 6、容器的删除 7、文…

【C语言】关键字static——static修饰局部变量、全局变量和函数详解!

在C语言中,static是修饰变量和函数的。static修饰局部变量称为静态局部变量,static修饰全局变量称为静态全局变量,static修饰函数称为静态函数。 文章目录 静态变量在静态区分配内存static修饰全局变量static修饰局部变量static修饰函数 静态…

2023Q2纯电汽车销量统计,特斯拉遥遥领先,比亚迪和大众横向对比

根据8月1日的消息,国际科技媒体insideevs最近针对2023年第2季度特斯拉、比亚迪和大众三家电动汽车制造商的纯电动汽车销量做了横向比较。 根据媒体报道,2023年第2季度,三家汽车制造企业的销量都有不同程度的增长,较去年同期和今年…

千云探探监测到7月25日法国巴黎Facebook网络恢复正常

前情回顾:针对法国近期出现的骚乱,法国总统马克龙7月4日表示,如果事态失控,法国政府可能需要监管或关闭社交网络。北京时间2023年7月4日17时45分,埃文科技的千云探探发现法国巴黎地区访问Facebook社交网络的网络时延从…

iPhone 8 Plus透明屏应用范围详解

iPhone 8 Plus是苹果公司于2017年推出的一款智能手机,它采用了全新的玻璃机身设计,支持无线充电,并且搭载了更强大的A11仿生芯片。 而透明屏则是一种新型的屏幕技术,可以使手机屏幕呈现出透明的效果。 透明屏是一种将屏幕背后的元…

网络层:IP协议/Mac协议

IP协议 主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统 称; IP 目标网络(前半部分) 目标主机(后半部分) IP层的核心:IP地址定位主机(定…

MySQL篇

文章目录 一、MySQL-优化1、在MySQL中,如何定位慢查询?2、SQL语句执行很慢, 如何分析呢?3、了解过索引吗?(什么是索引)4、索引的底层数据结构了解过嘛 ?5、什么是聚簇索引什么是非聚簇索引 ?6、知道什么是回表查询嘛…

安达发|APS智能排程软件推动企业智能转型

随着智能化技术的飞速发展,企业在构建智能计划排产规划方面有了新的可能性。APS排程软件(Advanced Planning and Scheduling)作为一种强大的工具,为企业提供了实现智能计划排产规划的新模式,主要是利用计算机运算速度快…

面向对象程序三大特性一:封装(超详细)

目录 目录 封装 1.1访问限定符 1.2封装介绍 1.3封装的实现步骤 (三步) 总结 封装 1.1访问限定符 Java 中主要通过类和访问权限来实现封装: 类可以将数据以及封装数据的方法结合在一起,,而访问权限用来控制方法或者字段能否直接在类…

linux驱动定时器实现按键按下打印字符

#include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h>struct device_node *dev; unsigned int irqno; //中断处理函数 irqreturn_t myirq_handler(int irq,void *…

后端整理(集合框架、IO流、多线程)

1. 集合框架 Java集合类主要有两个根接口Collection和Map派生出来 Collection派生两个子接口 List List代表了有序可重复集合&#xff0c;可以直接根据元素的索引进行访问Set Set代表无序不可重复集合&#xff0c;只能根据元素本身进行访问 Map接口派生 Map代表的是存储key…

Vue2面试题

1. Vue 的基本原理 当 一 个 Vue 实 例 创 建 时 &#xff0c; Vue 会 遍 历 data 中 的 属 性 &#xff0c; 用 Object.defineProperty &#xff08; vue3.0 使 用 proxy&#xff09; 将 它 们 转 为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访…

linux系统中详细分析MMU的具体实现

先来看一张图 ​第一&#xff1a;MMU内存管理 MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;是一种硬件模块&#xff0c;用于在CPU和内存之间实现虚拟内存管理。 其主要功能是将虚拟地址转换为物理地址&#xff0c;同时提供访问权限的控制和缓存…

控制反转ioc理解,配置说明

先写个例子吧 配置文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?

开门见山 请说下单片机&#xff08;Arm&#xff09;在运行到 main() 函数前&#xff0c;都做了哪些工作&#xff1f; 常见问题 系统初始化工作&#xff0c;太泛泛硬件初始化&#xff0c;比较不具体 答题思路 这道题应该从两方面回答&#xff0c;一个是比较表面的硬件的初始化…

leetcode(力扣) 剑指 Offer 12. 矩阵中的路径(回溯 DFS)

文章目录 题目描述思路分析完整代码 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff…

不用这些网站,你哪来的时间摸鱼?

Postcat - 在线API 开发测试工具 postcat.com/ API 开发测试工具 Postcat 是一个强大的开源、免费的、跨平台&#xff08;Windows、Mac、Linux、Browsers...&#xff09;的 API 开发测试工具&#xff0c;支持 REST、Websocket 等协议&#xff08;即将支持 GraphQL、gRPC、TCP…