数据结构(AVL树、B-Tree、B+Tree)

AVL树

AVL树是一种自平衡的二叉搜索树,它的特点是每个节点的左子树和右子树的高度差(平衡因子)的绝对值不超过1。这种平衡性保证了AVL树在进行查找、插入和删除操作时都能保持较高的效率。

平衡因子

在AVL树中,每个节点都维护一个额外的信息,即平衡因子。平衡因子定义为该节点的左子树高度减去右子树高度(或右子树高度减去左子树高度,但通常以前者为准)。平衡因子的值只能为-1、0或+1。

旋转操作

当在AVL树上进行插入或删除操作时,可能会导致某些节点的平衡因子超出允许的范围(即绝对值大于1)。为了恢复平衡,AVL树采用旋转操作来调整节点的位置。旋转操作包括单旋转和双旋转两种类型:

  1. 单旋转
    • 右旋(LL旋转):当某个节点的左子节点的左子树上插入新节点,导致该节点的平衡因子变为+2时,进行右旋转操作。右旋转以该节点为根的子树,将其左子节点提升为新的根节点,该节点则成为新根节点的右子节点。
    • 左旋(RR旋转):与右旋类似,但方向相反。当某个节点的右子节点的右子树上插入新节点,导致该节点的平衡因子变为-2时,进行左旋操作。
  2. 双旋转
    • 先左后右旋转(LR旋转):当某个节点的左子节点的右子树上插入新节点,导致该节点的平衡因子变为+2,且其左子节点的平衡因子为+1时,先进行左旋操作调整左子树,再对根节点进行右旋操作。
    • 先右后左旋转(RL旋转):与LR旋转类似,但方向相反。当某个节点的右子节点的左子树上插入新节点,导致该节点的平衡因子变为-2,且其右子节点的平衡因子为-1时,先进行右旋操作调整右子树,再对根节点进行左旋操作。

AVL树操作

  1. 插入操作
    • 将新节点按照二叉搜索树的规则插入到AVL树中。
    • 从插入点开始,向上回溯到根节点,检查每个节点的平衡因子。
    • 若某节点的平衡因子超出范围,则根据具体情况进行旋转操作以恢复平衡。
  2. 删除操作
    • 找到要删除的节点,并将其向下旋转成一个叶子节点(若该节点不是叶子节点)。
    • 直接删除该叶子节点。
    • 从删除点开始,向上回溯到根节点,检查每个节点的平衡因子。
    • 若某节点的平衡因子超出范围,则根据具体情况进行旋转操作以恢复平衡。
  3. 查找操作
    • AVL树的查找操作与二叉搜索树相同,利用平衡性保证查找效率为O(log n)。

AVL树的优势与应用

AVL树的优势在于其严格的平衡性保证了所有基本操作(查找、插入、删除)的时间复杂度均为O(log n)。这使得AVL树在需要频繁进行这些操作的场景中表现出色,如数据库索引、内存管理等。然而,AVL树在插入和删除操作时需要频繁进行旋转操作以维持平衡性,这可能会增加一些额外的开销。尽管如此,AVL树仍然是一种高效且广泛应用的自平衡二叉搜索树。

B-Tree

B-Tree(Balanced Tree),即B树,是一种自平衡的树形数据结构,专为磁盘和其他直接访问的辅助存储设备而设计,广泛应用于数据库和文件系统中。以下是B-Tree原理的详细解释:

基本概念

  1. 多路搜索树:B树是一种多路搜索树,也被称为平衡多路查找树。与二叉搜索树不同,B树的每个节点可以拥有多个子节点和键值。
  2. 键值:节点中的键值按照升序排列,并作为子树的分隔键。
  3. 子节点指针:每个键值将节点分割成多个子树,每个子树由一个子节点指针指向。
  4. 叶子节点:叶子节点不包含键值对应的记录,但通常包含指向实际记录的指针。
  5. 阶(Order)或分支因子(Branch Factor):通常用字母m表示,它定义了节点可以拥有的最大子节点数(即m个子节点)。因此,一个节点最多可以有m-1个键值。非根节点至少需要有⌈m/2⌉个子节点,以保持树的平衡。

性质

  1. 高度平衡:B树是一种高度平衡的数据结构,所有叶子节点都位于同一层。这种平衡性确保了所有查找、插入和删除操作的时间复杂度都是O(log n),其中n是树中元素的数量。
  2. 有序性:节点中的键值按照从小到大的顺序排列,这有助于在查找过程中快速定位目标数据。

操作

  1. 搜索:搜索操作从根节点开始,通过比较要查找的键与节点中的键,决定是继续在左子树还是右子树中搜索。如果键等于节点中的某个键,则搜索成功;如果键小于节点中的所有键,则搜索左子树;如果键大于节点中的所有键,则搜索右子树。这个过程一直持续到找到目标键或到达叶子节点为止。
  2. 插入:插入操作首先找到合适的叶子节点,然后将新键插入该节点。如果插入后节点中的键的数量超过了m-1,则节点会分裂成两个节点,并将中间的键提升到父节点。如果父节点也满了,则继续向上分裂,直到根节点。如果根节点也分裂,则创建一个新的根节点,并包含分裂出的中间键。
  3. 删除:删除操作首先找到包含要删除键的节点,并从节点中移除该键。如果删除后节点中的键的数量少于要求的最小数量(⌈m/2⌉ - 1),则需要重新分配或合并节点。重新分配通常是从兄弟节点借键,合并则是将当前节点与兄弟节点合并,并可能将父节点中的键下移。如果删除操作导致根节点中只有一个键,且没有子节点,则树的高度会减一。

应用

  1. 数据库索引:B树通过减少磁盘访问次数,显著提高了数据库查询的效率。在数据库中,索引是帮助快速查找数据的数据结构。B树作为索引结构,能够支持高效的查找、插入和删除操作。
  2. 文件系统:B树也常用于文件系统中,用于快速定位文件的存储位置。通过B树,文件系统可以高效地管理元数据(如文件名、文件大小、创建时间等),并快速访问文件数据。
  3. 外部排序:在外部排序中,由于数据量太大,无法一次性装入内存,因此需要使用磁盘等外部存储设备。B树可以作为外部排序过程中的一个关键数据结构,帮助实现多路归并排序,提高排序的效率。

B+Tree

B+Tree的原理主要基于其数据结构和查找、插入、删除等操作的特点。以下是对B+Tree原理的详细解释:

数据结构

B+Tree是B树(Balanced Tree)的一种变形,是一种多路平衡查找树。在B+Tree中,数据被存储在叶子节点,而非叶子节点仅用于索引,不存储实际数据。这种结构使得B+Tree在查找、插入和删除操作时具有更高的效率。

  1. 节点类型

    • 根节点:B+Tree的起始节点,用于引导查找过程。
    • 内部节点(非叶子节点):仅包含索引信息和指向子节点的指针,不存储实际数据。
    • 叶子节点:存储实际数据和指向下一个叶子节点的指针,形成有序链表结构。
  2. 节点结构

    • 每个节点包含一定数量的关键字(key)和指针(pointer)。
    • 关键字按升序排列,指针指向包含相应关键字的子节点或叶子节点。
  3. 节点容量

    • 每个节点有一个最大容量,当节点中的关键字数量达到最大容量时,会发生节点分裂。

查找操作

  1. 过程

    • 从根节点开始,根据关键字进行二分查找。
    • 找到匹配的关键字所在的指针,递归地进入子节点进行查找。
    • 最终到达叶子节点,在叶子节点上进行二分查找或顺序遍历找到目标数据。
  2. 特点

    • B+Tree的查找过程稳定且高效,因为所有叶子节点都在同一层,树的高度较低。
    • 叶子节点之间的有序链表结构使得范围查询和顺序遍历更加高效。

插入操作

  1. 过程

    • 找到应插入叶子节点的位置。
    • 将新关键字插入叶子节点。
    • 如果叶子节点已满,则进行节点分裂,将部分关键字和指针移动到新的节点,并更新父节点的索引信息。
  2. 特点

    • 插入操作可能会触发节点分裂,以保持B+Tree的平衡性。
    • 节点分裂会导致树的高度增加(在极端情况下),但B+Tree通过平衡操作来保持树的高度较低。

删除操作

  1. 过程

    • 找到应删除关键字所在的叶子节点。
    • 从叶子节点中删除该关键字。
    • 如果删除后叶子节点中的关键字数量少于最小容量,则进行节点合并或借用操作,以保持B+Tree的平衡性。
  2. 特点

    • 删除操作可能会触发节点合并或借用操作,以保持B+Tree的平衡性。
    • 节点合并和借用操作可能会涉及多个节点和层级的调整。

优势与应用

  1. 优势

    • B+Tree具有更高的查询效率,因为所有叶子节点都在同一层,减少了查找过程中的磁盘I/O操作。
    • B+Tree的范围查询和顺序遍历更加高效,因为叶子节点之间形成了有序链表结构。
  2. 应用

    • B+Tree广泛应用于数据库索引和文件系统等领域。
    • 在数据库索引中,B+Tree用于加速数据检索和范围查询。

综上所述,B+Tree的原理基于其特殊的数据结构和高效的查找、插入、删除操作。这些特点使得B+Tree成为数据库索引和文件系统等领域的理想选择。

B+Tree与B-Tree的区别

B+Tree是B-Tree的一种变种,主要区别在于数据存储方式。在B+Tree中,所有的数据值都存储在叶子节点上,而内部节点只存储关键字信息。这种结构使得B+Tree在进行范围查询时更加高效。B+Tree的叶子节点通过指针相互连接,形成一个链表结构。这使得范围查询能够通过一次遍历叶子节点链表完成,避免了在B-Tree中可能出现的多次遍历操作。

综上所述,B-Tree是一种高效的数据结构,通过保持树的平衡性和有序性,支持高效的查找、插入和删除操作。它在数据库、文件系统和外部排序等领域具有广泛的应用前景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

10分钟快速上手DeepSeek!

DeepSeek 是一款基于命令行和配置文件的数据处理工具,支持多种数据格式(如 CSV、JSON、SQL 等)和多种数据源(如本地文件、数据库、API 等)。 它的核心功能包括: 数据导入与导出:支持从多种数据…

【现代深度学习技术】深度学习计算 | 延后初始化自定义层

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

下面是我们的秒杀流程: 对于正常的秒杀处理,我们需要多次查询数据库,会给数据库造成相当大的压力,这个时候我们需要加入缓存,进而缓解数据库压力。 在上面的图示中,我们可以将一条流水线的任务拆成两条流水…

Rust HashMap :当储物袋遇上物品清单

开场白:哈希映射的魔法本质 在Rust的奇幻世界里,HashMap就像魔法师的储物袋: 键值对存储 → 每个物品都有专属咒语(键)和实体(值)快速查找 → 念咒瞬间召唤物品动态扩容 → 自动伸展的魔法空间…

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域,电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作,存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网(IIoT)技术,实现电源设备…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

尝试把clang-tidy集成到AWTK项目

前言 项目经过一段时间的耕耘终于进入了团队开发阶段,期间出现了很多问题,其中一个就是开会讨论团队的代码风格规范,目前项目代码风格比较混乱,有的模块是驼峰,有的模块是匈牙利,后面经过讨论,…

Docker技术相关学习三

一、Docker镜像仓库管理 1.docker仓库:用于存储和分发docker镜像的集中式存储库,开发者可以将自己创建的镜像推送到仓库中也可以从仓库中拉取所需要的镜像。 2.docker仓库: 公有仓库(docker hub):任何人都可…

挑战项目 --- 微服务编程测评系统(在线OJ系统)

一、前言 1.为什么要做项目 面试官要问项目,考察你到底是理论派还是实战派? 1.希望从你的项目中看到你的真实能力和对知识的灵活运用。 2.展示你在面对问题和需求时的思考方式及解决问题的能力。 3.面试官会就你项目提出一些问题,或扩展需求…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的…

计算机从何而来?计算技术将向何处发展?

计算机的前生:机械计算工具的演进 算盘是计算机的起点,它其实是一台“机械式半自动化运算器”。打算盘的“口诀”其实就是它的编程语言,算盘珠就是它的存储器。 第二阶段是可以做四则运算的加法器、乘法器。1642年,法国数学家帕斯…

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University,然后实际内容不完全基于它,因为它的例子还是基于.NET Core 3.1做的,距离现在很遥远了。 截至本文撰写的时间,2025年,最新的.NET是.NET9了都,可能1…

MapReduce分区

目录 1. MapReduce分区1.1 哈希分区1.2 自定义分区 2. 成绩分组2.1 Map2.2 Partition2.3 Reduce 3. 代码和结果3.1 pom.xml中依赖配置3.2 工具类util3.3 GroupScores3.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0,详情请参阅 Apache许可证2.0。…

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文(1)内置数…

deep generative model stanford lecture note3 --- latent variable

1 Introduction 自回归模型随着gpt的出现取得很大的成功,还是有很多工程上的问题并不是很适合使用自回归模型: 1)自回归需要的算力太大,满足不了实时性要求:例如在自动驾驶的轨迹预测任务中,如果要用纯自回…

STM32_SD卡的SDIO通信_DMA读写

本篇,将使用CubeMXKeil,创建一个SD卡的DMA读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果,如下图: 一、简述 上篇已简单介绍了SD、SDIO,本篇不再啰嗦,…

互联网行业常用12个数据分析指标和八大模型

本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网:www.acvra.org 简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次…

【Unity踩坑】Unity项目管理员权限问题(Unity is running as administrator )

问题描述: 使用Unity Hub打开或新建项目时会有下面的提示。 解决方法: 打开“本地安全策略”: 在Windows搜索栏中输入secpol.msc并回车,或者从“运行”对话框(Win R,然后输入secpol.msc)启…