算法基礎 -- 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.pswp.cn/web/66850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66850.shtml
英文地址,請注明出處:http://en.pswp.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;能幫你快速完成這件事…