算法基础 -- AVL树初识

AVL树初识

一、AVL树简介

AVL树是一种自平衡二叉搜索树(Binary Search Tree, BST),于1962年由Georgy Adelson-Velsky和Evgenii Landis提出,名字也来自他们两位的姓氏首字母组合。它通过在插入、删除节点后维持平衡性,确保在查找、插入、删除操作上保持 O ( log ⁡ n ) O(\log n) O(logn) 的平均和最坏时间复杂度。


二、AVL树的平衡条件

在普通的二叉搜索树中,树的高度可能因为插入或删除导致严重失衡,从而退化成链表。而AVL树通过维护**平衡因子(Balance Factor)**来保持平衡。

平衡因子的定义:

平衡因子 = 左子树的高度 − 右子树的高度 \text{平衡因子} = \text{左子树的高度} - \text{右子树的高度} 平衡因子=左子树的高度右子树的高度

  • 平衡因子的绝对值不超过1(即 − 1 -1 1、0、1),则该节点视为平衡
  • AVL树要求所有节点的平衡因子绝对值 ≤ 1 \leq 1 1

通过对节点的平衡因子进行检查和旋转操作,AVL树能始终维持其平衡性。


三、AVL树的基本操作

1. 查找(Search)

AVL树本质上是二叉搜索树,查找过程与普通二叉搜索树相同,时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

2. 插入(Insert)

插入新节点的过程包括以下步骤:

  1. 常规插入: 按照二叉搜索树的规则插入新节点。
  2. 更新平衡因子: 从插入位置向上回溯,更新祖先节点的高度或平衡因子。
  3. 检测并恢复平衡: 如果某节点的平衡因子绝对值超过1,根据具体情况执行旋转操作。
插入导致的失衡类型
类型条件解决方法
LL失衡节点的平衡因子为 +2,且左子节点的平衡因子 ≥ 0 \geq 0 0单右旋
LR失衡节点的平衡因子为 +2,且左子节点的平衡因子 < 0 < 0 <0先左旋后右旋
RR失衡节点的平衡因子为 -2,且右子节点的平衡因子 ≤ 0 \leq 0 0单左旋
RL失衡节点的平衡因子为 -2,且右子节点的平衡因子 > 0 > 0 >0先右旋后左旋

3. 删除(Delete)

删除操作分以下几种情况:

  1. 删除叶子节点或单子节点:

    • 直接删除节点或用子节点替换。
  2. 删除有两个子节点的节点:

    • 找出该节点的前驱后继节点,用其值覆盖当前节点,并递归删除前驱/后继节点。
  3. 更新并恢复平衡:

    • 从被删除节点的位置向上回溯,更新祖先节点的平衡因子,若失衡则执行旋转操作。

四、旋转操作

AVL树通过旋转操作调整树的结构,从而恢复平衡。旋转分为以下四种:

1. 单右旋(LL失衡)

  • 触发条件:节点的平衡因子为 +2,且左子节点的平衡因子 ≥ 0 \geq 0 0
  • 示例:
        A                          B/ \                        / \B   α     => 右旋         C   A/ \                        /   / \C   β                      γ   β   α

2. 先左旋后右旋(LR失衡)

  • 触发条件:节点的平衡因子为 +2,且左子节点的平衡因子 < 0 < 0 <0
  • 示例:
        A                          A                          C/ \        => 左旋         / \        => 右旋         / \B   α       B   α          C   A\          / \               / \C        B   γ             β   α/ \       / \  β   γ     β   γ  

3. 单左旋(RR失衡)

  • 触发条件:节点的平衡因子为 -2,且右子节点的平衡因子 ≤ 0 \leq 0 0
  • 示例:
        A                          B/ \                        / \α   B     => 左旋         A   C/ \                    / \β   C                  α   β

4. 先右旋后左旋(RL失衡)

  • 触发条件:节点的平衡因子为 -2,且右子节点的平衡因子 > 0 > 0 >0
  • 示例:
        A                          A                          C/ \        => 右旋         / \        => 左旋         / \α   B       α   C          A   B/ \         \            / \C   γ         B          α   β/ \          / \β   γ        β   γ

五、时间复杂度与特性

  • 高度: AVL树的高度保持在 O ( log ⁡ n ) O(\log n) O(logn) 量级,最坏情况下的高度为 log ⁡ ϕ ( n ) \log_{\phi}(n) logϕ(n) ϕ \phi ϕ 为黄金比例,约为1.618)。
  • 查找: 时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)
  • 插入/删除: 时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)
  • 额外空间: 需要维护每个节点的高度或平衡因子信息。

六、AVL树优缺点

优点:

  1. 查找性能优秀,适用于查找频繁的场景。
  2. 平衡性好,树的高度始终接近最优。

缺点:

  1. 插入和删除操作需要额外的旋转和更新,性能开销相对红黑树更高。
  2. 实现复杂,逻辑较为繁琐。

七、示例

以下为插入数据的过程示例:

插入数据:10, 20, 5, 15, 25, 30

  1. 插入10
   10
  1. 插入20
   10\20
  1. 插入5
     10/  \5    20
  1. 插入15
     10/  \5    20/15
  1. 插入25
     10/  \5    20/  \15   25
  1. 插入30,触发RR失衡,左旋后结果:
        20/  \10    25/  \      \5   15      30

八、总结

AVL树是一种高效的自平衡二叉搜索树,适用于对查找效率要求较高的场景,但在插入删除频繁的情况下,其复杂度和性能可能略逊于红黑树。

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

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

相关文章

MySQL数值型函数详解

简介 本文主要讲解MySQL数值型函数&#xff0c;包括&#xff1a;ROUND、RAND、ABS、MOD、TRUNCATE、CEIL、CEILING、FLOOR、POW、POWER、SQRT、LOG、LOG2、LOG10、SIGN、PI。 本文所有示例中&#xff0c;双横杠左边为执行的SQL语句&#xff0c;右边为执行语句的返回值。 ROU…

自动化01

测试用例的万能公式&#xff1a;功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能)&#xff0c;将产品的整体进行测试&#xff0c;人工创造一个自动化测试用例&#xff0c;在n个版本的时候…

Spring中的事务管理器TransactionManager

目录 一、主要功能 二、使用场景说明 在Spring框架中&#xff0c;事务管理器&#xff08;TransactionManager&#xff09;是用于管理事务的重要接口。它提供了对事务的全面控制&#xff0c;包括事务的状态管理和资源管理等功能。本文将详细介绍TransactionManager的主要功能、…

c语言(转义字符)

前言&#xff1a; 内容&#xff1a; 然后记一下转义字符 \? 在书写连续多个问号时使用&#xff0c;防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠&#xff0c;防止他被解析为一个转义序列符 \n 换行 \r …

Vue3 30天精进之旅:Day02 - 环境搭建

引言 在前一天的学习中&#xff0c;我们了解了Vue.js的基本概念和优势。今天&#xff0c;我们将进入实际开发的第一步——环境搭建。良好的开发环境是顺利开展项目的基础&#xff0c;本文将指导你在本地设置Vue开发环境&#xff0c;并快速上手第一个Vue项目。 1. 环境准备 在…

代码随想录 栈与队列 test 7

347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 首先想到哈希&#xff0c;用key来存元素&#xff0c;value来存出现次数&#xff0c;最后进行排序&#xff0c;时间复杂度约为o(nlogn)。由于只需求前k个&#xff0c;因此可以进行优化&#xff0c;利用堆来维护这…

汇编实验·子程序设计

一、实验目的: 1.掌握汇编中子程序编写方法 2.掌握程序传递参数的基本方法,返回值的方法。 3.掌握理解子程序(函数)调用的过程 二、实验内容 1.编写汇编语言子程序,实现C表达式SUM=X+Y的功能,具体要求: 1)函数的参数传递采用寄存器实现 2)函数的参数传递采用堆栈…

jmeter中对接口进行循环请求后获取相应数据

1、工作中遇到一个场景就是对某个单一接口进行循环请求&#xff0c;并需要获取每次请求后返回的相应数据&#xff1b; 2、首先就在jmeter对接口相关组件进行配置&#xff0c;需要组件有&#xff1a;循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…

trimesh 旋转

trimesh.transformations.rotation_matrix(np.radians(rot_angle), rot_axis) np.radians(rot_angle)&#xff1a;将角度 rot_angle 转换为弧度。trimesh 和大多数 3D 库通常使用弧度来表示旋转角度&#xff0c;而不是角度。 rot_axis&#xff1a;表示旋转轴的向量。例如&…

Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南

本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子&#xff1b;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…

Ansible fetch模块详解:轻松从远程主机抓取文件

在自动化运维的过程中&#xff0c;我们经常需要从远程主机下载文件到本地&#xff0c;以便进行分析或备份。Ansible的fetch模块正是为了满足这一需求而设计的&#xff0c;它可以帮助我们轻松地从远程主机获取文件&#xff0c;并将其保存到本地指定的位置。在这篇文章中&#xf…

【AI论文】生成式视频模型是否通过观看视频学习物理原理?

摘要&#xff1a;AI视频生成领域正经历一场革命&#xff0c;其质量和真实感在迅速提升。这些进步引发了一场激烈的科学辩论&#xff1a;视频模型是否学习了能够发现物理定律的“世界模型”&#xff0c;或者&#xff0c;它们仅仅是复杂的像素预测器&#xff0c;能够在不理解现实…

论文速读|Matrix-SSL:Matrix Information Theory for Self-Supervised Learning.ICML24

论文地址&#xff1a;Matrix Information Theory for Self-Supervised Learning 代码地址&#xff1a;https://github.com/yifanzhang-pro/matrix-ssl bib引用&#xff1a; article{zhang2023matrix,title{Matrix Information Theory for Self-Supervised Learning},author{Zh…

视觉语言模型 (VLMs):跨模态智能的探索

文章目录 一. VLMs 的重要性与挑战&#xff1a;连接视觉与语言的桥梁 &#x1f309;二. VLMs 的核心训练范式&#xff1a;四种主流策略 &#x1f5fa;️1. 对比训练 (Contrastive Training)&#xff1a;拉近正例&#xff0c;推远负例 ⚖️2. 掩码方法 (Masking)&#xff1a;重构…

数据结构——堆(介绍,堆的基本操作、堆排序)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

c++迷宫问题(migong)

今天的题目叫“迷宫问题(migong&#xff09;”&#xff0c;是“DFS深度优先搜索 递归”一类的。 题目描述 设有一个N*N(2<N<10)方格的迷宫&#xff0c;入口和出口分别在左上角和右上角。迷宫格子中 分别放0和1&#xff0c;0表示可通&#xff0c;1表示不能&#xff0c;入…

机器学习-线性回归(简单回归、多元回归)

这一篇文章&#xff0c;我们主要来理解一下&#xff0c;什么是线性回归中的简单回归和多元回归&#xff0c;顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式&#xff0c;它用于研究**一个自变量&#xff08;输入&#xff09;与一个因变量&…

Git知识分享

一、理解git首先要理清楚下面五个概念&#xff1a; 1、工作区(git add 命令之前的样子) 2、stash 暂存(暂存工作区和暂存区的更改) 3、暂存区(git add 命令之后的存储区, 4、本地仓库(git commit提交的位置) 5、远程仓库(git push提交的位置) 二、git常用命令&#xff1a; 1、g…

2024年度技术总结——MCU与MEMS和TOF应用实践

引言 2024年对我来说是技术成长与突破的一年。在这一年里&#xff0c;我不仅在技术领域拓展了深度和广度&#xff0c;还通过与客户合作的实际项目&#xff0c;成功实现了从单一MCU到MCU、MEMS与TOF技术融合的跨越。这一过程中&#xff0c;我深刻认识到&#xff0c;技术的进步不…

一句话,我让 AI 帮我做了个 P 图网站!

每到过节&#xff0c;不少小伙伴都会给自己的头像 P 个图&#xff0c;加点儿装饰。 比如圣诞节给自己头上 P 个圣诞帽&#xff0c;国庆节 P 个小红旗等等。这是一类比较简单、需求量却很大的 P 图场景&#xff0c;也有很多现成的网站和小程序&#xff0c;能帮你快速完成这件事…