1. 程式人生 > >兩種平衡二叉樹的比較: AVL樹和紅黑樹

兩種平衡二叉樹的比較: AVL樹和紅黑樹



1 好處 及 用途

        紅黑樹並不追求“完全平衡”——它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了效能。

紅黑樹能夠以O(log2 n) 的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的資料結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高。

        當然,紅黑樹並不適應所有應用樹的領域。如果資料基本上是靜態的,那麼讓他們待在他們能夠插入,並且不影響平衡的地方會具有更好的效能。如果資料完全是靜態的,例如,做一個雜湊表,效能可能會更好一些。

在實際的系統中,例如,需要使用動態規則的防火牆系統,使用紅黑樹而不是散列表被實踐證明具有更好的伸縮性。

典型的用途是實現關聯陣列

AVL樹是最先發明的自平衡二叉查 找樹。在AVL樹中任何節點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。AVL樹得名於它的發明者 G.M. Adelson-Velsky 和 E.M. Landis,他們在 1962 年的論文 "An algorithm for the organization of information" 中發表了它。

引入二叉樹的目的是為了提高二叉樹的搜尋的效率,減少樹的平均搜尋長度.為此,就必須每向二叉樹插入一個結點時調整樹的結構,使得二叉樹搜尋保持平衡,從而可能降低樹的高度,減少的平均樹的搜尋長度. 

AVL樹的定義: 
一棵AVL樹滿足以下的條件: 
1>它的左子樹和右子樹都是AVL樹 
2>左子樹和右子樹的高度差不能超過1 
從條件1可能看出是個遞迴定義,如GNU一樣. 

性質: 
1>一棵n個結點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1) 
2>一棵n個結點的AVL樹的平均搜尋長度保持在0(log2(n)). 
3>一棵n個結點的AVL樹刪除一個結點做平衡化旋轉所需要的時間為0(log2(n)).

 

從1這點來看紅黑樹是犧牲了嚴格的高度平衡的優越條件為 代價紅黑樹能夠以O(log2 n)的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的資料結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高. 
看看人家怎麼評價的:

http://wangdei.javaeye.com/blog/236157  關於二者的比較