算法基础 -- 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,一经查实,立即删除!

相关文章

自动化01

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

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

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

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…

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

这一篇文章&#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;能帮你快速完成这件事…

如何打造一个高并发系统?

今天和大家聊聊作为一个后端开发&#xff0c;在实际工作中&#xff0c;我们如何打造一个高并发的系统&#xff1f; 如下图所示&#xff0c;大概有六个层面&#xff0c;我们结合具体的场景直播间签到去一一细说。 一、前端 1、打散请求&#xff1a;即把用户的接口分散一点去请求…

996引擎 - 前期准备-配置开发环境

996引擎 - 前期准备 官网搭建服务端、客户端单机搭建 开发环境配置后端开发环境配置环境 前端开发环境配置环境 后端简介前端简介GUILayoutGUIExport 官网 996传奇引擎官网 所有资料从官网首页开始&#xff0c;多探索。 文档&#xff1a; 996M2-服务端Lua 996M2-客户端Lua 搭…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译

编译内核时将该 HDF 驱动编译到镜像中&#xff0c;接下来编写驱动编译脚本 Makefile&#xff0c;代码如下所示&#xff1a; 加入编译体系&#xff0c;填加模块目录到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多内容可以关注&#xff1a;迅为RK3568开发板篇OpenHa…

生信软件管家——conda vs pip

pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…

ubuntu 布暑python项目

在Ubuntu上部署Python项目通常包括以下几个步骤&#xff1a; 1 安装必要的软件&#xff1a; 确保系统已经安装了Python、pip&#xff08;Python包管理工具&#xff09;以及virtualenv&#xff08;可选&#xff0c;用于创建独立的Python环境&#xff09;。如果还没有安装&#…

RV1126画面质量一:视频基础

在聊视频画面调节之前&#xff0c;先来认识一下视频画面的有一些基础问题 如今我们所处的时代&#xff0c;是移动互联网时代&#xff0c;也可以说是 视频时代 。 从快播到抖音&#xff0c;从“ 三生三世 ” 到 “ 三十而已 ” &#xff0c;我们的生活&#xff0c;被越来越多的 …

准备知识——波纹度和粗糙度区别与联系

在开始齿轮齿面波纹度开始前&#xff0c;先来学习一下基本概念——波纹度和粗糙度&#xff0c;废话不多说&#xff0c;直接开始&#xff1a; 什么是表面粗糙度&#xff1f; 表面粗糙度定义为实际表面相对于波谷的较短频率。如果去观察加工零件&#xff0c;会注意到它们的表面…

五、华为 RSTP

RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树协议&#xff09;是 STP 的优化版本&#xff0c;能实现网络拓扑的快速收敛。 一、RSTP 原理 快速收敛机制&#xff1a;RSTP 通过引入边缘端口、P/A&#xff08;Proposal/Agreement&#xff09;机制等&…