数据结构——B树、B+树、哈夫曼树

目录

  • 一、B树概念
    • 1.B树的构造
    • 2 .B树的特点
  • 二、B+树概念
    • 1.B+树构造
    • 2.B+树的特点
  • 三、B树和B+树的区别
  • 四、哈夫曼树
    • 1.哈夫曼树的基本概念
    • 2.哈夫曼树的构建

一、B树概念

B树的出现是为了弥合不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O。平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构。
B树常用于磁盘当中,红黑树用于内存当中,由于磁盘的读取速度很慢,红黑树是二叉树,即使查找速率很快,但是会执行很多的I/O操作,必然会拖延速度
B树在磁盘中的操作优,红黑树在内存中优。
在这里插入图片描述

1.B树的构造

在B树的构造前需要明白M阶B树的概念
M阶B树:是指可以分出M个叉,拥有M-1个节点。
其中的每一个节点都包括keyvalue key:对每一个文件的标号 。 value:页
在这里插入图片描述
B树的构造和2-3-4树的构造方式相似,从底开始构造,一层一层的向上送。
1.构造5阶B树的过程,以下列数据为参考构造5阶B树。
在这里插入图片描述
2.将每一个节点按照顺序排列直到4个节点为一组的情况。
在这里插入图片描述
3.当一组的节点超过4个的情况下,将中间的节点提到上一层,并且原本一组分成两份。
在这里插入图片描述
4.重复进行上述操作,得到最后的结果。
+

2 .B树的特点

节点的子树数量:B树的每个节点可以有多个子树,具体数量由树的阶数决定。对于一棵m阶B树,每个节点最多可以有m个子树
关键字数量:每个非根节点包含的关键字数量满足:⌈m/2⌉ - 1 <= j <= m - 1。根节点至少有2个子女
子树数量:除根节点外的所有节点(不包括叶子节点)的度数正好是关键字总数加1,子树数量k满足:⌈m/2⌉ <= k <= m
叶子节点:所有的叶子节点都位于同一层
节点结构:非叶子节点的指针P[1], P[2], …, P[M],其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树

二、B+树概念

1、B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。
2、B+树的非叶子节点具有索引值,在内存相同的情况下,能够存放更多的key,树的高度就会越低。
3、B+树的所有叶子节点都相连、有序链表、对整棵树的遍历只需要线性遍历一遍叶子节点。
4、B+树常用于数据库底层。
在这里插入图片描述

1.B+树构造

B+树的构造类似于B树的构造但是在 **3.当一组的节点超过4个的情况下,将中间的节点提到上一层,并且原本一组分成两份。**时,并不将其value指提到上面,只需要将key值放到上一层,并且在叶子节点的那一层中创建有序链表

2.B+树的特点

1、所有数据都存储在叶子节点:B+树的非叶子节点仅存储索引信息,而所有实际数据都存储在叶子节点中。这使得B+树的查询效率更加稳定,因为每次查询都必须从根节点走到叶子节点,路径长度相同
2、叶子节点形成有序链表:B+树的叶子节点通过指针连接,形成一个有序链表。这使得范围查询和排序操作更加高效,只需遍历叶子节点即可
3、磁盘I/O次数更少:由于非叶子节点不存储数据,B+树的每个节点可以存储更多的关键字,从而减少了磁盘I/O操作的次数
4、支持高效的范围查询:B+树的叶子节点形成有序链表,支持高效的范围查询。只需在叶子节点上遍历即可,不需要像B树那样进行中序遍历
5、更适合文件索引和数据库索引:B+树的结构特点使其在文件索引和数据库索引中具有优势。它能够有效减少查找时间,提高存储的空间局部性,从而减少I/O操作
6、查询性能稳定:由于所有数据都存储在叶子节点,B+树的查询性能更加稳定。每次查询都必须从根节点走到叶子节点,路径长度相同
处理随机I/O和大跨度插入时性能下降:B+树在处理随机I/O和大跨度插入时可能会导致性能下降。随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离得很远。

三、B树和B+树的区别

1.B树常用于磁盘当中读取数据的操作,B+树用于数据库的底层。
2.B树非叶子节点包括key和value,但是B+树只包括key值,因此相同内存下B+树的高度会比B树低
3.B+树叶子节点间构成了有序的链表,非常方便进行区间查找操作,因此用于数据库
4.B+扫库、表能力更强。
5.B+的磁盘读写能力更强。
6.B+Tree 的节点上是不保存数据的,那么它保存的关键字就更多,这样一次 IO 操作,加载的关键字就更多,所以它的磁盘读写能力更强。
7.B+的叶子节点天然就是顺序存放的 。 B+树叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
8.B+ 的查询效率更加稳定。

四、哈夫曼树

1.哈夫曼树的基本概念

路径:从树中的一个节点到叶子节点的路径。
树的路径长度:从根节点到每一个叶子节点的路径长度之和
:该节点的值
节点的带权路径长度:从根节点到该节点的路径长度与节点的权值的乘积
树的带权路径长度
哈夫曼树:*树的带权路径长度最小的树(WPL)

2.哈夫曼树的构建

1.提供一组数,将该组数按大小顺序排序完成
在这里插入图片描述

在这里插入图片描述

2.从小到大,依次取两个数据,获得两个数之和,赋值给父节点
在这里插入图片描述
3.将两个值的和重新和原来的数据排序
在这里插入图片描述
4.重复上述的步骤直到哈夫曼树构造完成
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

电子签的法律效力、业务合规与监管难点

撰稿 | 区长 来源 | 贝多财经 据2025年央视“3.15”晚会报道&#xff0c;借贷宝、人人信等平台上存在高利贷的情形。放贷人与借款人在平台签署借款合同&#xff0c;但是实际借款金额低于合同金额&#xff0c;从而绕开平台对利率的限制。这引发了人们对电子签法律效力、业务合…

资金管理策略思路

详细描述了完整交易策略的实现细节&#xff0c;主要包括输入参数、变量定义、趋势判断、入场与出场条件、止损与止盈设置等多个方面。 输入参数&#xff08;Input&#xff09;&#xff1a; EntryFrL (.6)&#xff1a;多头入场的前一日波动范围的倍数。 EntryFrS (.3)&#xff1…

体育直播视频源格式解析:M3U8 vs FLV

在体育直播领域&#xff0c;视频源的格式选择直接影响着直播的流畅度、画质以及兼容性。目前&#xff0c;M3U8 和 FLV 是两种最为常见的视频流格式&#xff0c;它们各有优劣&#xff0c;适用于不同的场景。本文将从技术原理、优缺点以及应用场景等方面对 M3U8 和 FLV 进行详细解…

【动态规划】下降路径最小和

跟之前不同由于可能取到最右上角值&#xff0c;则左右各加一列&#xff0c;并且由于求最小值&#xff0c;则加的列须设置为正无穷大&#xff1b; class Solution { public:int minFallingPathSum(vector<vector<int>>& matrix) {int nmatrix.size();vector<…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

VScode

由于centos停止了维护 ,后面使用ubuntu 在Ubuntu中用vscode 充当记事本的作用 替代了centos中vim的作用 后面使用vscode编辑 vscode中继续使用makefile , xshell中的cgdb进行debug (半图形写 ,半命令行debug&&运行) 官网下载地址&#xff1a;https://code.visuals…

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

异步编程与流水线架构:从理论到高并发

目录 一、异步编程核心机制解析 1.1 同步与异步的本质区别 1.1.1 控制流模型 1.1.2 资源利用对比 1.2 阻塞与非阻塞的技术实现 1.2.1 阻塞I/O模型 1.2.2 非阻塞I/O模型 1.3 异步编程关键技术 1.3.1 事件循环机制 1.3.2 Future/Promise模式 1.3.3 协程&#xff08;Cor…

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动&#xff08;不容易遇到版本或者兼容性的问题&#xff09; 驱动下载网址&#xff1a;链接: link 1、实战1 &#xff08;1&#xff09;安装 selenium 库 pip install selenium&#…

前端OOM内存泄漏如何排查?

前言 现代前端开发中&#xff0c;随着应用的复杂性和交互性的增加&#xff0c;OOM&#xff08;Out Of Memory&#xff0c;内存不足&#xff09;问题和内存泄漏逐渐成为影响用户体验和应用性能的关键挑战。排查和解决这些问题需要开发人员具备良好的调试技巧和优化策略。 造成…

C++20:玩转 string 的 starts_with 和 ends_with

文章目录 一、背景与动机二、string::starts_with 和 string::ends_with&#xff08;一&#xff09;语法与功能&#xff08;二&#xff09;使用示例1\. 判断字符串开头2\. 判断字符串结尾 &#xff08;三&#xff09;优势 三、string_view::starts_with 和 string_view::ends_w…

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

【MySQL】日志

目录 基本概念错误日志二进制日志查询日记慢查询日志 基本概念 日志&#xff08;Log&#xff09;是系统、软件或设备在运行过程中对发生的事件、操作或状态变化所做的记录。这些记录通常包含时间戳、事件类型、相关数据等信息&#xff0c;用于跟踪运行过程、排查故障、审计操作…

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…

Word限定仅搜索中文或英文引号

在Word中&#xff0c;按下CtrlF键&#xff0c;左侧会弹出导航搜索栏&#xff1b; 点击放大镜旁边的下拉栏&#xff0c;选择高级查找 在查找内容处输入英文状态下的"&#xff0c;然后选择更多->使用通配符&#xff0c;就可以仅查找英文状态下的" 同理&#xff…

智能飞鸟监测 守护高压线安全

飞鸟检测新纪元&#xff1a;视觉分析技术的革新应用 在现代化社会中&#xff0c;飞鸟检测成为了多个领域不可忽视的重要环节。无论是高压线下的安全监测、工厂内的生产秩序维护&#xff0c;还是农业区的作物保护&#xff0c;飞鸟检测都扮演着至关重要的角色。传统的人工检测方…

React初学分享 事件绑定 组价通信 useState useEffect

React初学 React介绍快速搭建React项目JSXJSX的本质优势&#xff1a;JSX中使用JS表达式JSX中的列表渲染JSX实现简单条件渲染JSX实现复杂条件渲染 React中的事件绑定React基础事件绑定传递自定义参数同时传递事件对象和自定义参数 React中的组件useState修改状态的规则状态不可变…

【实战】deepseek数据分类用户评论数据

在平时的工作中&#xff0c;我们会遇到数据分类的情况&#xff0c;比如将一些文本划分为各个标签。如果人工分类这块的工作量将是非常大&#xff0c;而且分类数据的准确性也不高。我们需要用到一些工具来实现。提高效率的同时也提高准确率。 1.示例数据 用户ID 时间戳 评论场…

git tag以及git

git tag 以及git 一、先说收获吧 1. git bash 在windows上 类似于linux的bash提供的shell命令行窗口&#xff0c;可以执行很多linux命令&#xff0c;cd pwd ls vim cat touch mkdir&#xff0c;还可以用正则匹配查看标签。相当于在windows上装了一个小的linux。git init myproj…

[动手学习深度学习]28. 批量归一化

当前所有的深度学习网络&#xff0c;或多或少都用了批归一化操作 批归一化的思想不新&#xff0c;但是这个特定的层是16年左右出现的&#xff0c;在这之后&#xff0c;发现他对深度学习算法性能的提升非常有效 概念理解 这是一个网络的结构&#xff1a; 当数据很深的时候&am…