1. 程式人生 > >紅黑樹 VS AVL樹

紅黑樹 VS AVL樹

概述:本文從排序二叉樹作為引子,講解了紅黑樹,最後把紅黑樹和AVL樹做了一個比較全面的對比。

1 排序二叉樹

排序二叉樹是一種特殊結構的二叉樹,可以非常方便地對樹中所有節點進行排序檢索。 排序二叉樹要麼是一棵空二叉樹,要麼是具有下列性質的二叉樹: ? 若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值; ? 若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值; ? 它的左、右子樹也分別為排序二叉樹。 下圖顯示了一棵排序二叉樹:

對排序二叉樹,若按中序遍歷就可以得到由小到大的有序序列。中序遍歷得: {2,3,4,8,9,9,10,13,15,18} 排序二叉樹雖然可以快速檢索,但在最壞的情況下

:如果插入的節點集本身就是有序的,要麼是由小到大排列,要麼是由大到小排列,那麼最後得到的排序二叉樹將變成連結串列:所有節點只有左節點(如果插入節點集本身是大到小排列);或所有節點只有右節點(如果插入節點集本身是小到大排列)。在這種情況下,排序二叉樹就變成了普通連結串列,其檢索效率就會很差

2 紅黑樹

《演算法導論》關於紅黑樹的定義:

正如在CLRS中定義的那樣(CLRS指的是就是演算法導論這本書《Introduction to Algorithms》,CLRS是該書作者Cormen, Leiserson, Rivest and Stein的首字母縮寫),一棵紅黑樹是指一棵滿足下述性質的二叉搜尋樹(BST, binary search tree):

1. 每個結點或者為黑色或者為紅色。

2. 根結點為黑色。

3. 每個葉結點(實際上就是NULL指標)都是黑色的。

4. 如果一個結點是紅色的,那麼它的兩個子節點都是黑色的(也就是說,不能有兩個相鄰的紅色結點)。

5. 對於每個結點,從該結點到其所有子孫葉結點的路徑中所包含的黑色結點數量必須相同。

資料項只能儲存在內部結點中(internal node)。我們所指的"葉結點"在其父結點中可能僅僅用一個NULL指標表示,但是將它也看作一個實際的結點有助於描述紅黑樹的插入與刪除演算法,葉結點一律為黑色。 定義詳解: 根據性質 5:紅黑樹從根節點到每個葉子節點的路徑都包含相同數量的黑色節點,因此從根節點到葉子節點的路徑中包含的黑色節點數被稱為樹的“黑色高度(black-height)

”。 性質 4 則保證了從根節點到葉子節點的最長路徑的長度不會超過任何其他路徑的兩倍。假如有一棵黑色高度為 3 的紅黑樹:從根節點到葉節點的最短路徑長度是 2,該路徑上全是黑色節點(黑節點 – 黑節點 – 黑節點)。最長路徑也只可能為 4,在每個黑色節點之間插入一個紅色節點(黑節點 – 紅節點 – 黑節點 – 紅節點 – 黑節點),性質 4 保證絕不可能插入更多的紅色節點。由此可見,紅黑樹中最長路徑就是一條紅黑交替的路徑。 根據定義我們做如下練習: -不符合定義的一顆非紅黑樹: 紅黑樹的這5個性質中,第3點是比較難理解的,但它卻非常有必要。我們看圖1中的左邊這張圖,如果不使用黑哨兵,它完全滿足紅黑樹性質,結點50到兩個葉結點8和葉結點82路徑上的黑色結點數都為2個。但如果加入黑哨兵後(如圖1右圖中的小黑圓點),葉結點的個數變為8個黑哨兵,根結點50到這8個葉結點路徑上的黑高度就不一樣了,所以它並不是一棵紅黑樹。 -兩顆正確的紅黑樹:  定理

一棵擁有n個內部結點的紅黑樹的樹高h<=2log(n+1)

由此我們可以得出結論:對於給定的黑色高度為 N 的紅黑樹,從根到葉子節點的最短路徑長度為 N-1,最長路徑長度為 2 * (N-1)。 提示:排序二叉樹的深度直接影響了檢索的效能,正如前面指出,當插入節點本身就是由小到大排列時,排序二叉樹將變成一個連結串列,這種排序二叉樹的檢索效能最低:N 個節點的二叉樹深度就是 N-1。 紅黑樹通過上面這種限制來保證它大致是平衡的——因為紅黑樹的高度不會無限增高,這樣保證紅黑樹在最壞情況下都是高效的,不會出現普通排序二叉樹的情況。 由於紅黑樹只是一個特殊的排序二叉樹,因此對紅黑樹上的只讀操作與普通排序二叉樹上的只讀操作完全相同,只是紅黑樹保持了大致平衡,因此檢索效能比排序二叉樹要好很多。 但在紅黑樹上進行插入操作和刪除操作會導致樹不再符合紅黑樹的特徵,因此插入操作和刪除操作都需要進行一定的維護,以保證插入節點、刪除節點後的樹依然是紅黑樹。

3 紅黑樹和AVL樹的比較

1. 紅黑樹並不追求“完全平衡”——它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了效能。 紅黑樹能夠以O(log2 n) 的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的資料結構,能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高。 當然,紅黑樹並不適應所有應用樹的領域。如果資料基本上是靜態的,那麼讓他們待在他們能夠插入,並且不影響平衡的地方會具有更好的效能。如果資料完全是靜態的,做一個雜湊表,效能可能會更好一些。 紅黑樹是一個更高效的檢索二叉樹,因此常常用來實現關聯陣列。典型地,JDK 提供的集合類 TreeMap 本身就是一個紅黑樹的實現。 TreeMap 和 TreeSet 是 Java Collection Framework 的兩個重要成員,其中 TreeMap 是 Map 介面的常用實現類,而 TreeSet 是 Set 介面的常用實現類。雖然 HashMap 和 HashSet 實現的介面規範不同,但 TreeSet 底層是通過 TreeMap 來實現的,因此二者的實現方式完全一樣。而 TreeMap 的實現就是紅黑樹演算法。 對於 TreeMap 而言,由於它底層採用一棵“紅黑樹”來儲存集合中的 Entry,這意味這 TreeMap 新增元素、取出元素的效能都比 HashMap 低:當 TreeMap 新增元素時,需要通過迴圈找到新增 Entry 的插入位置,因此比較耗效能;當從 TreeMap 中取出元素時,需要通過迴圈才能找到合適的 Entry,也比較耗效能。 但 TreeMap、TreeSet 比 HashMap、HashSet 的優勢在於:TreeMap 中的所有 Entry 總是按 key 根據指定排序規則保持有序狀態,TreeSet 中所有元素總是根據指定排序規則保持有序狀態。 2 AVL樹是最先發明的自平衡二叉查詢樹。在AVL樹中任何節點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。 引入二叉樹的目的是為了提高二叉樹的搜尋的效率,減少樹的平均搜尋長度.為此,就必須每向二叉樹插入一個結點時調整樹的結構,使得二叉樹搜尋保持平衡,從而可能降低樹的高度,減少的平均樹的搜尋長度. AVL樹的定義:
一棵AVL樹滿足以下的條件: 1>它的左子樹和右子樹都是AVL樹 2>左子樹和右子樹的高度差不能超過1
性質:
1>一棵n個結點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1) 2>一棵n個結點的AVL樹的平均搜尋長度保持在0(log2(n)). 3>一棵n個結點的AVL樹刪除一個結點做平衡化旋轉所需要的時間為0(log2(n)).
為了保證平衡,AVL樹中的每個結點都有一個平衡因子(balance factor,以下用BF表示),它表示這個結點的左、右子樹的高度差,也就是左子樹的高度減去右子樹的高度的結果值。AVL樹上所有結點的BF值只能是-1、0、1。反之,只要二叉樹上一個結點的BF的絕對值大於1,則該二叉樹就不是平衡二叉樹。下圖演示了平衡二叉樹和非平衡二叉樹。 從1這點來看紅黑樹是犧牲了嚴格的高度平衡的優越條件為代價紅黑樹能夠以O(log2 n)的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的資料結構能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高.

相關推薦

VS AVL

概述:本文從排序二叉樹作為引子,講解了紅黑樹,最後把紅黑樹和AVL樹做了一個比較全面的對比。 1 排序二叉樹 排序二叉樹是一種特殊結構的二叉樹,可以非常方便地對樹中所有節點進行排序和檢索。 排序二叉樹要麼是一棵空二叉樹,要麼是具有下列性質的二叉樹: ? 若它的左子樹不空,則左子樹上所有節點的值均小於它的

AVL

target 相同 spa search htm 解決 evel 所有應用 二叉搜索樹 概述:本文從排序二叉樹作為引子,講解了紅黑樹,最後把紅黑樹和AVL樹做了一個比較全面的對比。 1 排序二叉樹 排序二叉樹是一種特殊結構的二叉樹,可以非常方便地對樹中所有節點進行排

B、B+AVL

付出 而不是 通過 找到 磁盤讀寫 三次 復雜度 節點 span 定義及概念 B樹 二叉樹的深度較大,在查找時會造成I/O讀寫頻繁,查詢效率低下,所以引入了多叉樹的結構,也就是B樹。階為M的B樹具有以下性質: 1、根節點在不為葉子節點的情況下兒子數為 2 ~ M2、除根結

AVL的區別

文章目錄 紅黑樹與AVL樹的區別 紅黑樹的一個案列 英文答案 紅黑樹的高度問題 紅黑樹的優點 與AVL樹的比較 相同點 使用 紅黑樹為何能比AVL樹高效的原

、自平衡二叉AVL、B的比較

1. 紅黑樹和自平衡二叉(查詢)樹區別 紅黑樹放棄了追求完全平衡,追求大致平衡,在與平衡二叉樹的時間複雜度相差不大的情況下,保證每次插入最多隻需要三次旋轉就能達到平衡,實現起來也更為簡單。 平衡二叉樹追求絕對平衡,條件比較苛刻,實現起來比較麻煩,每次插入新節點之後需要旋轉的

終於搞懂了什麼是二叉查詢AVL,B,B+

二叉查詢樹: 二叉查詢樹就是左結點小於根節點,右結點大於根節點的一種排序樹,也叫二叉搜尋樹。也叫BST,英文Binary Sort Tree。 二叉查詢樹比普通樹查詢更快,查詢、插入、刪除的時間複雜度為O(logN)。但是二叉查詢樹有一種極端的情況,就是會變成一種線性連結

淺談二叉查詢AVL、B、B+的原理及應用

一、二叉查詢樹 1、簡介 二叉查詢樹也稱為有序二叉查詢樹,滿足二叉查詢樹的一般性質,是指一棵空樹具有如下性質: 任意節點左子樹不為空,則左子樹的值均小於根節點的值. 任意節點右子樹不為空,則右子樹的值均大於於根節點的值. 任意節點的左右子樹也分別是二叉查

二叉查詢AVL,B~/B+(B-tree),伸展——優缺點及比較

二叉查詢樹(Binary Search Tree) 很顯然,二叉查詢樹的發現完全是因為靜態查詢結構在動態插入,刪除結點所表現出來的無能為力(需要付出極大的代價)。 BST 的操作代價分析:     (1) 查詢代價: 任何一個數據的查詢過程都需要從根結點出發,沿

二叉之一BSTAVL詳解及B原理分析

BST樹,AVL樹詳解及B樹和紅黑樹原理分析 網際網路面試中樹尤其是BST,AVL是提問的重點也是難點,甚至B樹乃至高階資料結構紅黑樹都是提問的重點,像阿里雲面試就曾經問過map實現機制(紅黑樹)及其原理,這裡我們要做到對BST/AVL完全熟悉能給出全部程式碼實現,紅黑樹、

二叉排序AVL最簡單的理解

前言 [為什麼寫這篇] 之前在知乎上看過一個提問:為什麼紅黑樹比AVL樹用的場景更為廣泛?其實,這兩者應用場景都挺廣泛的。紅黑樹在 STL 和 Linux 都有一定的運用。而AVL樹也在 Windows程序地址空間管理 中得到了使用。既然紅黑樹和AVL樹這麼

AVL、B的比較

   AVL, 紅黑樹,B樹 前段日子在研究著這幾中樹的優劣     首先我們來談談AVL樹,AVL樹是一棵平衡的二叉查詢樹。它的平衡因子為-1,1,0不平衡達到2就會將樹進行平衡化。 AVL對數字的分佈要求比較高,比如說是隨機數,有人曾經做過計算,在利用AVL樹與紅黑樹進

關於AVL,以下哪種說法不正確?----騰訊2016研發工程師線上模擬筆試題

關於紅黑樹和AVL樹,以下哪種說法不正確? 正確答案: D   你的答案: 空 (錯誤) 兩者都屬於自平衡二叉樹 兩者查詢,插入,刪除的時間複雜度相同 包含n個內部節點的紅黑樹的高度是O(log(n)) JDK的TreeMap是一個AVL的實現

二叉,B-,B+,LSMAVL,堆

二叉樹的概念 在計算機領域,二叉樹是每個節點最多有兩個子樹的結構。通常子樹被稱為左子樹和右子樹。 二叉樹的特例: 滿二叉樹 滿二叉樹是完全二叉樹的特例。 所有葉節點必須在同一層上 除了葉子節點的所有節點都有兩個子節點 完全二叉樹 完全二叉樹可以看成是滿二叉樹

AVL的效率對比

為什麼選擇紅黑樹作為底層實現 紅黑樹是一種類平衡樹, 但它不是高度的平衡樹, 但平衡的效果已經很好了. 補充說明另一種 AVL 樹, 我之前的博文: 《程式設計珠璣,字字珠璣》讀書筆記完結篇——AVL樹 用過 STL map 麼, 你用過 linux 麼(這

二叉查找AVL

結構 ima div info 四種 分享圖片 查找 pos image AVL樹插入數據的四種結構: 第一種: 第二種: 第三種: 第四種: 二叉查找樹之AVL樹

用js來實現那些數據結構14(02-AVL

PE 有一個 解決 講解 html 16px var map 操作   在使用二叉搜索樹的時候會出現 一個問題,就是樹的一條分支會有很多層,而其他的分支卻只有幾層,就像下面這樣:   如果數據量夠大,那麽我們在某條邊上進行增刪改查的操作時,就會消耗大量的時間。我們花費精力

數據結構(三十八)平衡二叉AVL

圖1 建立 滿足 技術分享 factor 這也 絕對值 因此 調整   一、平衡二叉樹的定義   平衡二叉樹(Self-Balancing Binary Search Tree或Height-Balanced Binary Search Tree),是一種二叉排序樹,其中每

AVL

搜索樹 .com 最大 理論 深度 大量 統計 特點 tails AVL樹得名於它的發明者。 AVL樹是帶有平衡條件的二叉查找樹。這個平衡條件必須要容易保持,而且它須保證樹的深度是O(logN)。 查找、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通

篇2-平衡二叉查詢AVL

一、AVL樹定義         在資料結構中,AVL樹是最先發明的自平衡二叉查詢樹。在AVL樹中任何節點的兩個子樹的高度差的絕對值不能超過一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次

【學習筆記】平衡二叉AVL)簡介及其查詢、插入、建立操作的實現

  目錄 平衡二叉樹簡介: 各種操作實現程式碼:   詳細內容請參見《演算法筆記》P319 初始AVL樹,一知半解,目前不是很懂要如何應用,特記錄下重要內容,以供今後review。   平衡二叉樹簡介: 平衡二叉樹由兩位前