数据结构(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是一种高效的数据结构,通过保持树的平衡性和有序性,支持高效的查找、插入和删除操作。它在数据库、文件系统和外部排序等领域具有广泛的应用前景。

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

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

相关文章

保姆级教程Docker部署Zookeeper官方镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…

【数据结构】栈与队列

栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈&…

安全实验作业

一 拓扑图 二 要求 1、R4为ISP,其上只能配置IP地址;R4与其他所有直连设备间均使用共有IP 2、R3-R5-R6-R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分; 4、所有设备均可访问R4的环回&#x…

e2studio开发RA4M2(6)----GPIO外部中断(IRQ)配置

e2studio开发RA4M2.6--GPIO外部中断(IRQ)配置 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置GPIO口配置按键中断配置中断回调函数主程序 概述 GPIO(通用输入/输出&a…

排序算法--快速排序

快速排序是高效的排序算法,平均时间复杂度为 O(nlog⁡n),适合大规模数据排序。 1.挖坑法 2左右指针法 3.前后指针法 // 交换两个元素的值 void swap(int* a, int* b) {int temp *a;*a *b;*b temp; }// 分区函数,返回分区点的索引 int par…

分享|LLM通过D-E-P-S完成长时间与多步骤的任务

《Describe, Explain, Plan and Select: Interactive Planning with Large Language Models Enables Open-World Multi-Task Agents? 描述、解释、计划和选择:使用大型语言模型进行交互式规划,实现开放世界的多任务代理 问题背景:…

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新,可以去下载最新的chromedriver使用,自动化中使用新的chromedr…

swagger使用指引

1.swagger介绍 在前后端分离开发中通常由后端程序员设计接口,完成后需要编写接口文档,最后将文档交给前端工程师,前端工程师参考文档进行开发。 可以通过一些工具快速生成接口文档 ,本项目通过Swagger生成接口在线文档 。 什么…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1:如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」,deepseek便爆火 爆火以后便应了“人红是非多”那句话,不但遭受各种大规模攻击,即便…

低通滤波算法的数学原理和C语言实现

目录 概述 1 原理介绍 1. 1 基本概念 1.2 一阶RC低通滤波器模型 2 C语言完整实现 2.1 滤波器结构体定义 2.2 初始化函数 2.3 滤波计算函数 3 应用示例 3.1 噪声信号滤波 3.2 输出效果对比 3.3 关键参数选择指南 4 性能优化技巧 4.1 定点数优化 4.2 抗溢出处理 …

自研有限元软件与ANSYS精度对比-Bar3D2Node三维杆单元模型-央视大裤衩实例

目录 1、“央视大裤衩”自研有限元软件求解 1.1、选择单元类型 1.2、导入“央视大裤衩”工程 1.3、节点坐标定义 1.4、单元连接关系、材料定义 1.5、约束定义 1.6、外载定义 1.7、矩阵求解 1.8、变形云图展示 1.9、节点位移 1.10、单元应力 1.11、节点支反力 2、“…

Hot100之堆

我们的PriorityQueue默认为最小堆,堆顶总是为最小 215数组中的第K个最大元素 题目 思路解析 暴力解法(不符合时间复杂度) 题目要求我们找到「数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素」。「数组排序后的第 k …

FinRobot:一个使用大型语言模型的金融应用开源AI代理平台

“FinRobot: An Open-Source AI Agent Platform for Financial Applications using Large Language Models” 论文地址:https://arxiv.org/pdf/2405.14767 Github地址:https://github.com/AI4Finance-Foundation/FinRobot 摘要 在金融领域与AI社区间&a…

算法题(57):找出字符串中第一个匹配项的下标

审题: 需要我们根据原串与模式串相比较并找到完全匹配时子串的第一个元素索引,若没有则返回-1 思路: 方法一:BF暴力算法 思路很简单,我们用p1表示原串的索引,p2表示模式串索引。遍历原串,每次遍历都匹配一次…

「全网最细 + 实战源码案例」设计模式——策略模式

核心思想 策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列算法或策略,将它们封装成独立的类,并使它们可以相互替换,而不影响客户端的代码,提高代码的可维护性和扩展性。 结构 …

linux 进程补充

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 里,但是照样可以链接成功&#…

排序算法--选择排序

选择排序虽然简单&#xff0c;但时间复杂度较高&#xff0c;适合小规模数据或教学演示。 // 选择排序函数 void selectionSort(int arr[], int n) {for (int i 0; i < n - 1; i) { // 外层循环控制当前最小值的存放位置int minIndex i; // 假设当前位置是最小值的索引// 内…

java求职学习day27

数据库连接池 &DBUtils 1.数据库连接池 1.1 连接池介绍 1) 什么是连接池 实际开发中 “ 获得连接 ” 或 “ 释放资源 ” 是非常消耗系统资源的两个过程&#xff0c;为了解决此类性能问题&#xff0c;通常情况我们 采用连接池技术&#xff0c;来共享连接 Connection 。…

接入DeepSeek大模型

接入DeepSeek 下载并安装Ollamachatbox 软件配置大模型 下载并安装Ollama 下载并安装Ollama&#xff0c; 使用参数ollama -v查看是否安装成功。 输入命令ollama list&#xff0c; 可以看到已经存在4个目录了。 输入命令ollama pull deepseek-r1:1.5b&#xff0c; 下载deepse…

AI大模型(二)基于Deepseek搭建本地可视化交互UI

AI大模型&#xff08;二&#xff09;基于Deepseek搭建本地可视化交互UI DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测&#xff0c;其社区热度指数暴涨、一跃成为近期内影响力最高的话题&#xff0c;这个来自中国团队的模型向世界证明&#xff1a;让每个普通人都能拥有媲…