1. 程式人生 > >紅黑樹和AVL樹的效率對比

紅黑樹和AVL樹的效率對比

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

用過 STL map 麼, 你用過 linux 麼(這個說大了), 他們都有紅黑樹的應用. 當你對搜尋的效率要求較高,並且資料經常改動的情景,你可以用紅黑樹, 也就是 map.

至於, 為什麼不用 AVL 樹作為底層實現, 那是因為 AVL 樹是高度平衡的樹, 而每一次對樹的修改, 都要 rebalance, 這裡的開銷會比紅黑樹大. 紅黑樹插入只要兩次旋轉, 刪除至多三次旋轉. 但不可否認的是, AVL 樹搜尋的效率是非常穩定的. 選取紅黑樹, 我認為是一種折中的方案.

黑體字是不正確的,對AVL插一個node或者刪一個node,顯然不需要每次都做rotation來維持balance。且AVL插入最多也只需要2次旋轉。

下面是我的回答:

  1. 如果插入一個node引起了樹的不平衡,AVL和RB-Tree都是最多隻需要2次旋轉操作,即兩者都是O(1);但是在刪除node引起樹的不平衡時,最壞情況下,AVL需要維護從被刪node到root這條路徑上所有node的平衡性,因此需要旋轉的量級O(logN),而RB-Tree最多隻需3次旋轉,只需要O(1)的複雜度。

  2. 其次,AVL的結構相較RB-Tree來說更為平衡,在插入和刪除node更容易引起Tree的unbalance,因此在大量資料需要插入或者刪除時,AVL需要rebalance的頻率會更高。因此,RB-Tree在需要大量插入和刪除node的場景下,效率更高。自然,由於AVL高度平衡,因此AVL的search效率更高。

  3. map的實現只是折衷了兩者在search、insert以及delete下的效率。總體來說,RB-tree的統計效能是高於AVL的。

最壞情況下,AVL樹有最多O(logN)次旋轉,而紅黑樹最多三次。當然,這是個結論,誰能給出一個證明啊。。