1.為什么hashMap使用紅黑樹而不是其他結構?
在回答這個問題之前,我們先了解一下有關二叉樹的基本內容。
①二叉排序樹(又稱二叉查找樹):
1)若左子樹不為空,則左子樹上所有結點的值均小於根結點的值。
2)若右子樹不為空,則右子樹上所有結點的值均大於根節點的值。
3)左右子樹也為二叉排序樹。
②平衡二叉樹(AVL樹):是一種二叉查找樹,當且僅當兩個子樹的高度差不超過1時,這個樹是平衡二叉樹。
③紅黑樹:是許多二叉查找樹中的一種,它能保證在最壞的情況下,基本動態集合操作時間為O(lgn).
問題1:為什么不使用二叉排序樹?
問題主要出現在二叉排序樹在添加元素的時候極端情況下會出現線性結構。
舉例說明:由於二叉排序樹左子樹所有節點的值均小於根節點的特點,如果我們添加的元素都比根節點小,會導致左子樹線性增長,這樣就失去了用樹型結構替換鏈表的初衷,導致查詢時間增長。所以這是不用二叉查找樹的原因。
問題2:為什么不使用平衡二叉樹呢?
①紅黑樹不追求"完全平衡",即不像AVL那樣要求節點的 |balFact| <= 1,它只要求部分達到平衡,但是提出了為節點增加顏色,紅黑是用非嚴格的平衡來換取增刪節點時候旋轉次數的降低,任何不平衡都會在三次旋轉之內解決,而AVL是嚴格平衡樹,因此在增加或者刪除節點的時候,根據不同情況,旋轉的次數比紅黑樹要多。
就插入節點導致樹失衡的情況,AVL和RB-Tree都是最多兩次樹旋轉來實現復衡rebalance,旋轉的量級是O(1)
刪除節點導致失衡,AVL需要維護從被刪除節點到根節點root這條路徑上所有節點的平衡,旋轉的量級為O(logN),而RB-Tree最多只需要旋轉3次實現復衡,只需O(1),所以說RB-Tree刪除節點的rebalance的效率更高,開銷更小!
AVL的結構相較於RB-Tree更為平衡,插入和刪除引起失衡,如2所述,RB-Tree復衡效率更高;當然,由於AVL高度平衡,因此AVL的Search效率更高啦。
針對插入和刪除節點導致失衡后的rebalance操作,紅黑樹能夠提供一個比較"便宜"的解決方案,降低開銷,是對search,insert ,以及delete效率的折衷,總體來說,RB-Tree的統計性能高於AVL.
故引入RB-Tree是功能、性能、空間開銷的折中結果。
② AVL更平衡,結構上更加直觀,時間效能針對讀取而言更高;維護稍慢,空間開銷較大。
③ 紅黑樹,讀取略遜於AVL,維護強於AVL,空間開銷與AVL類似,內容極多時略優於AVL,維護優於AVL。
基本上主要的幾種平衡樹看來,紅黑樹有着良好的穩定性和完整的功能,性能表現也很不錯,綜合實力強,在諸如STL的場景中需要穩定表現。
鏈接:https://www.jianshu.com/p/37436ed14cc6
2.紅黑樹介紹
2.1特點:
①:每個節點都有紅色或黑色樹的根始終是黑色的
②:沒有兩個相鄰的紅色節點
③:從節點(包括根)到其任何后代NULL節點(葉子結點下方掛的兩個空節點,並且認為他們是黑色的)的每條路徑都具有相同數量的黑色節點
2.2插入操作時保持平衡:
這里推薦大佬的博客,寫的很詳細。
https://www.jianshu.com/p/104fa73c81b3