集合系列(二十五) -二叉樹、平衡二叉樹、紅黑樹性能總結

一、摘要

二叉樹,作為一種數據結構,在實際開發中,有著非常廣泛的應用,尤其是以平衡二叉樹、紅黑樹為代表,在前幾篇文章中,我們詳細的介紹了BST、AVL、RBT的算法以及代碼實踐,下面簡要概括描述一下這三種樹,以及它們之間的優劣。

二、BST

二叉查找樹(英文全稱:Binary Search Tree,簡稱:BST)是計算機科學中最早投入實際使用的一種樹形結構,特性定義比較粗放(一個節點,最多2個分支),因此在樹形形態結構上,有著多樣,例如下圖:

很明顯,不同的形狀,所需查找的次數是不一樣的!

BST 的操作過程:

  • 查找操作:任何一個數據的查找過程都需要從根結點出發,沿某一個路徑朝葉子結點前進,因此查找中數據比較次數與樹的形態密切相關。

當樹中每個結點左、右子樹高度大致相同時,樹高為logN,則平均查找長度與logN成正比,查找的平均時間復雜度在O(logN)數量級上。

當樹形結構為一個單子樹時,此時樹高n,則平均查找長度為(n+1)/2,查找的平均時間復雜度在O(N)數量級上。

  • 插入操作:先通過查找方法找到合適的位置,然后將新結點插入到樹的葉子上,完全不需要改變樹中原有結點的組織結構。

插入一個節點的時間與查找一個插入合適的位置的時間完全相同。

  • 刪除代價:當刪除一個節點A,首先需要定位到這個節點A,這個過程需要一個查找的時間。然后根據樹的形態分析,如果被刪除結點的左、右子樹只有一個存在,則改變形態的代價僅為O(1)。如果被刪除結點的左、右子樹均存在,只需要將A節點的左孩子的最末端的右子樹或者A節點的右孩子的最末端的左子樹結點與A互換,最后刪除該節點即可。

刪除操作的時間復雜度最大不會超過O(logN)。

BST效率總結:

  • 查找最好時間復雜度O(logN),最壞時間復雜度O(N)。
  • 插入、刪除操作算法簡單,時間復雜度與查找差不多。

三、AVL

二叉查找樹在最差情況下和順序查找效率相當,這點是無法忍受的。

平衡二叉查找樹的出現,主要是為了解決當二叉樹查找樹形態結構變成一個鏈條結構的時候,查找效率變低的問題,算法由Adel'son-Vel'skiiLandis兩位大神發明,同時也俗稱AVL樹,特性如下:

  • 它的左子樹和右子樹都是平衡二叉樹;
  • 且它的左子樹和右子樹的深度之差的絕對值(平衡因子 ) 不超過1;

簡單的說,就是為了保證平衡,當前節點的左子樹、右子樹的高度差不超過1!

當樹的左、右子樹高度超過差超過1時,核心就是通過左旋轉、右旋轉實現樹再次高度平衡。

AVL 的操作過程:

  • 查找操作:AVL是嚴格平衡的BST(平衡因子不超過1)。查找過程與BST一樣,只是AVL不會出現最差情況的BST(單支樹)。因此查找效率最好,最壞情況都是O(logN)數量級的。

  • 插入操作:AVL插入與BST思路一樣,不同的是AVL必須要保證嚴格平衡(height<=1),每一次插入數據使得AVL中某些結點的平衡因子超過1就必須進行旋轉操作。事實上,AVL的每一次插入結點操作最多只需要旋轉1次(單旋轉或雙旋轉)。因此,總體上插入操作的代價仍然在O(logN)級別上(插入結點需要首先查找插入的位置)。

  • 刪除操作:AVL刪除結點的算法與BST思路一樣,但是刪除之后必須檢查從刪除結點開始到根結點路徑上的所有結點的平衡因子。因此刪除的代價稍微要大一些。每一次刪除操作最多需要O(logN)次旋轉。因此,刪除操作的時間復雜度為O(logN)+O(logN)=O(2logN)。

AVL 效率總結:

  • 查找的時間復雜度維持在O(logN),不會出現最差情況。
  • AVL樹在執行每個插入操作時最多需要1次旋轉(單旋轉或雙旋轉),其時間復雜度在O(logN)左右。
  • AVL樹在執行刪除時代價稍大,執行每個刪除操作的時間復雜度需要O(2logN)。

四、RBT

平衡二叉查找樹通過嚴格平衡策略以犧牲建立查找結構的代價,換來了穩定的查找時間復雜度。但是相對來說,在刪除方面,時間復雜度稍大。

于是就出現了平衡二叉B樹,后來,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改為如今的紅黑樹。

紅黑樹(英文全稱:red-black-tree,簡稱:RBT),特性如下:

  • 1.每個節點要么是黑色要么是紅色;
  • 2.根節點是黑色;
  • 3.每個葉子節點是黑色;(注意:這里葉子節點,是指為空的葉子節點)
  • 4.如果一個節點是紅色的,則它的子節點必須是黑色的;(說明父子節點之間不能出現兩個連續的紅節點)
  • 5.從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點;

特性5確保沒有一條路徑會比其他路徑長出倆倍,因而,紅黑樹是相對的接近平衡的二叉樹,但是相比平衡二叉樹而言,尤其是刪除的時間復雜度,有所降低。

RBT 的操作過程:

  • 查找操作:由于紅黑樹的性質(最長路徑長度不超過最短路徑長度的2倍),可以說明紅黑樹雖然不像AVL一樣是嚴格平衡的,但平衡性能還是要比BST要好。其查找代價基本維持在O(logN)左右,但在最差情況下(最長路徑是最短路徑的2倍少1),比AVL要略遜色一點。

  • 插入操作:RBT插入結點時,需要旋轉操作和變色操作。但由于只需要保證RBT基本平衡就可以了。因此插入結點最多只需要2次旋轉,這一點和AVL的插入操作一樣。雖然變色操作需要O(logN),但是變色操作十分簡單,代價很小。

  • 刪除代價:RBT的刪除操作代價要比AVL要好的多,刪除一個結點最多只需要3次旋轉操作。

RBT 效率總結:

  • 查找效率最好情況下時間復雜度為O(logN),但在最壞情況下比AVL要差一些,但也遠遠好于BST。
  • 插入和刪除操作改變樹的平衡性的概率要遠遠小于AVL(RBT不是高度平衡的)。因此需要的旋轉操作的可能性要小,而且一旦需要旋轉,插入一個結點最多只需要旋轉2次,刪除最多只需要旋轉3次(小于AVL的刪除操作所需要的旋轉次數)。雖然變色操作的時間復雜度在O(logN),但是實際上,這種操作由于簡單所需要的代價很小。

五、總結

平衡二叉查找樹、紅黑樹,在查詢、插入、刪除操作方面都是基于二叉查找樹的算法思路,不同點是:插入、刪除之后的調整過程,平衡二叉查找樹主要是通過左旋轉、右旋轉實現樹高度再次平衡,而紅黑樹因為引進了顏色,相比平衡二叉查找樹,多了一個顏色轉換操作。

三者整體比較,紅黑樹要優于平衡二叉查找樹,遠優于二叉查找樹!

六、寫到最后

最近無意間獲得一份阿里大佬寫的技術筆記,內容涵蓋 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多線程、JPA、MyBatis、MySQL 等技術知識。需要的小伙伴可以點擊如下鏈接獲取,資源地址:技術資料筆記。

不會有人刷到這里還想白嫖吧?點贊對我真的非常重要!在線求贊。加個關注我會非常感激!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11793.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

deveco studio 打開官方案例,不顯示運行按鈕。

就拿官方的search舉例好了 git 地址 https://gitee.com/harmonyos/samples/tree/master/ETSUI/Search 使用deveco studio打開Search項目&#xff0c;打開Tools->Device-Manager中的Local Emulator本地模擬器&#xff0c; 此時會發現&#xff0c;運行按鈕是灰色的&#xff0…

水利行業工程設計資質如何去申請

申請水利行業工程設計資質通常需要按照以下步驟進行&#xff1a; 事前準備&#xff1a; 制定材料清單&#xff0c;羅列出所需準備的文件。下載相關的申請表和模板。準備企業資料和人員資料等附件材料。人員要求&#xff1a; 確保企業擁有符合水利行業工程設計資質標準要求的注…

源碼 axios 的創建過程模擬實現

1、在實例對象上添加兩個屬性&#xff1a;default(默認配置) 與 interscptors // //構造函數function Axios(config) {//初始化this.defaults config;//為了創建 default 默認屬性this.interceptors {request: {},response: {}}} 2、在原型對象上添加方法 //原型添加相關的…

從零學算法994

994. 腐爛的橘子 在給定的 m x n 網格 grid 中&#xff0c;每個單元格可以有以下三個值之一&#xff1a; 值 0 代表空單元格&#xff1b; 值 1 代表新鮮橘子&#xff1b; 值 2 代表腐爛的橘子。 每分鐘&#xff0c;腐爛的橘子 周圍 4 個方向上相鄰 的新鮮橘子都會腐爛。 返回 直…

微信小程序中的數據可視化組件封裝藝術【附代碼】

微信小程序中的數據可視化組件封裝藝術 一、數據可視化的魅力與重要性數據可視化簡述為什么要在小程序中封裝數據可視化組件 二、微信小程序數據可視化基礎小程序中的繪圖工具&#xff1a;Canvas 三、實戰&#xff1a;封裝一個簡易折線圖組件設計思路組件結構&#xff08;line-…

java mybatis配置

MyBatis是一種支持自定義SQL、存儲過程和高級映射的持久層框架。下面是一個簡單的Java MyBatis配置示例&#xff1a; 首先&#xff0c;需要添加MyBatis的依賴到項目的pom.xml文件中&#xff1a; <dependency><groupId>org.mybatis</groupId><artifactId…

Python3 筆記:順序結構

三種程序執行結構&#xff1a;順序結構、選擇結構和循環結構。 這三種結構對應的是&#xff1a;順序執行所有的語句、選擇執行部分語句和循環執行部分語句。 順序結構是程序最基本的結構。就是程序按照語句順序&#xff0c;從上到下依次執行各條語句。 例如&#xff1a; nu…

【運維實踐項目|003】:Nginx集群化運維升級項目

項目名稱 項目簡稱或代號&#xff1a;SUN項目&#xff08;這個可以自己隨便編一個&#xff0c;每個公司的每個項目簡稱或代號都是內部任意起名的&#xff0c;顯得專業一點&#xff0c;一般是項目關鍵詞的首拼&#xff0c;比如這個CSUN是&#xff1a;ScaleUp Nginx&#xff09;…

一道dp錯題

dis(a,b)就是兩點之間的距離公式 那么這道題該怎么解呢,.先看數據范圍x,y<1e4,so,18個點兩點之間距離最大18*1e4*sqrt(2)<2^18,所以如果跳過的點大于18個點,那么顯然一個區間內最多不會跳躍超過17個點 現在我們想知道前i個點跳躍幾次在哪跳躍能夠達到最小花費,不妨設跳…

【OceanBase診斷調優】—— 轉儲錯誤(錯誤代碼 4138/ORA-01555)

當讀事務很長時&#xff0c;租戶進行轉儲會報 4138/ORA-01555 錯誤。本文介紹該錯誤的處理方法。 適用版本 OceanBase 數據庫 V2.X 及以后的版本 問題現象 當讀事務很長&#xff0c;租戶進行轉儲時會出現以下錯誤。 Oracle 租戶&#xff1a; ORA-01555&#xff1a;snapsho…

Keil調用跟蹤

調試時程序卡在一個位置&#xff0c;恰巧這個函數被很多地方調用&#xff0c;需要知道上一步在哪。 程序暫停后&#xff0c; 查看調用堆棧&#xff0c;點擊Keil菜單欄中的“View”&#xff0c;然后選擇“Call Stack”&#xff08;調用堆棧&#xff09;選項。這將顯示當前的調用…

市場活動系統搭建

精細差異化運營在今天的企業越來越普遍&#xff0c;運營驅動占據了業務經營的主導地位。各種營銷活動&#xff0c;幫助我們差異化運營、激發潛在客戶、帶動連帶消費、增加銷售額度、提升用戶增長、實現品牌宣傳。 天貓、京東上有各種各樣的促銷活動。如&#xff1a;滿減、滿返、…

算法day04

第一題 &#xff1a; 209. 長度最小的子數組 有上題可知&#xff0c;我們會采用雙指針和單調性的思路來解決 我們本題采用左右雙指針從數組的0位置同向前進&#xff0c;所以將此類模型稱為滑塊&#xff1b; 步驟思路如下&#xff1a; 步驟一&#xff1a; 定義所有雙指針都指向…

Prompt提示詞的技巧

Prompt提示詞的技巧 要讓GPT類模型產生最符合我們需求的輸出&#xff0c;我們需要精心設計和調整輸入的提示詞&#xff08;Prompt&#xff09;。 1、明確性&#xff1a; 確保你的提示詞清晰、具體。GPT類模型會根據你給出的信息來生成文本&#xff0c;因此&#xff0c;提供詳…

【實踐】使用vscode來debug go程序的嘗鮮

配置 首先&#xff0c;當然得配置好vscode 的go環境&#xff0c; 裝個go插件就基本滿足了 配置 launch.json, 可以配置多個環境的程序啟動參數&#xff08;很友好&#xff09; {"version": "0.2.0","configurations": [{"name": &…

ArrayList與LinkedList的區別

一、背景與現狀 在Java編程中&#xff0c;ArrayList和LinkedList都是實現List接口的重要類&#xff0c;用于存儲和操作動態大小的元素集合。兩者在Java集合框架中占據了核心地位&#xff0c;并被廣泛應用于各種軟件項目中。然而&#xff0c;盡管它們都提供了類似的功能&#x…

海外客戶開發渠道有哪些

海外客戶開發是一個多元化的過程&#xff0c;涉及線上與線下多個渠道。以下是一些有效的海外客戶開發渠道&#xff1a; 平臺電商&#xff1a; 利用國際B2B電商平臺&#xff0c;如阿里巴巴國際站、 Globalsources、Made-in-China等&#xff0c;這些平臺擁有龐大的國際買家流量&a…

STM32學習和實踐筆記(27):USART串口通信實驗程序

本實驗所要實現的功能是&#xff1a;STM32F1通過USART1實現與PC機對話&#xff0c;STM32F1的USART1收到PC機發來的數據后原封不動的返回給PC機顯示。同時使用D1指示燈不斷閃爍提示系統正常運行。程序框架如下&#xff1a; &#xff08;1&#xff09;初始化USART1&#xff0c;并…

linux 開發常用命令

一、查看 相關服務 1.查看 數據庫 相關服務 這里以mysql 和 redis 為例 &#xff08;1&#xff09;使用 ps 命令 執行命令會列出&#xff0c;“mysql”、“redis”名稱的進程 ps aux | grep redis 示例&#xff1a; rootspray:~# ps aux | grep mysql mysql 1609816 0.…

Flutter 中的 FilterChip 小部件:全面指南

Flutter 中的 FilterChip 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;FilterChip 是一種特殊類型的 Chip&#xff0c;用于呈現過濾選項。用戶可以通過點擊 FilterChip 來應用相應的過濾條件&#xff0c;這在需要對列表或集合進行篩選的場景中非常有用&#xff0c;如…