紅黑樹常見問題
1 stl中的set和set底層用的什么數據結構?
紅黑樹
2 紅黑樹的數據結構
1 enum Color 2. { 3. RED = 0, 4. BLACK = 1 5. }; 6. 7. struct RBTreeNode 8. { 9. struct RBTreeNode*left, *right, *parent; 10. int key; 11. int data; 12. Color color; 13. };
3 紅黑樹有哪些性質?
一般的,紅黑樹,滿足以下性質,即只有滿足以下全部性質的樹,我們才稱之為紅黑樹: 1)每個結點要么是紅的,要么是黑的。 2)根結點是黑的。 3)每個葉結點(葉結點即指樹尾端NIL指針或NULL結點)是黑的。 4)如果一個結點是紅的,那么它的倆個兒子都是黑的。 5)對於任一結點而言,其到葉結點樹尾端NIL指針的每一條路徑都包含相同數目的黑結點。
正是紅黑樹的這5條性質,使一棵n個結點的紅黑樹始終保持了logn的高度,從而也就解釋了上面所說的“紅黑樹的查找、插入、刪除的時間復雜度最壞為O(log n)”

4.紅黑樹的各種操作的時間復雜度是多少?
能保證在最壞情況下,基本的動態幾何操作的時間均為O(lgn)
5.紅黑樹相比於BST和AVL樹有什么優點?
紅黑樹是犧牲了嚴格的高度平衡的優越條件為代價,它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了性能。
紅黑樹能夠以O(log2 n)的時間復雜度進行搜索、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。
當然,還有一些更好的,但實現起來更復雜的數據結構能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。
相比於BST,因為紅黑樹可以能確保樹的最長路徑不大於兩倍的最短路徑的長度,所以可以看出它的查找效果是有最低保證的。 在最壞的情況下也可以保證O(logN)的,這是要好於二叉查找樹的。因為二叉查找樹最壞情況可以讓查找達到O(N)。
紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高,所以在插入和刪除中所做的后期維護操作肯定會比紅黑樹要耗時好多, 但是他們的查找效率都是O(logN),所以紅黑樹應用還是高於AVL樹的. 實際上插入 AVL 樹和紅黑樹的速度取決於你所插入的數據。
如果你的數據分布較好,則比較宜於采用 AVL樹(例如隨機產生系列數),但是如果你想處理比較雜亂的情況,則紅黑樹是比較快的。
6.紅黑樹相對於哈希表,在選擇使用的時候有什么依據?
權衡三個因素: 查找速度, 數據量, 內存使用,可擴展性。
總體來說,hash查找速度會比map快,而且查找速度基本和數據量大小無關,屬於常數級別;而map的查找速度是log(n)級別。
並不一定常數就比log(n) 小,hash還有hash函數的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash。
但若你對內存使用特別嚴格, 希望程序盡可能少消耗內存,那么一定要小心,hash可能會讓你陷入尷尬,特別是當你的hash對象特別多時,
你就更無法控制了,而且 hash的構造速度較慢。
- 紅黑樹是有序的,Hash是無序的,根據需求來選擇。
- 紅黑樹占用的內存更小(僅需要為其存在的節點分配內存),而Hash事先應該分配足夠的內存存儲散列表,即使有些槽可能棄用
- 紅黑樹查找和刪除的時間復雜度都是O(logn),Hash查找和刪除的時間復雜度都是O(1)。
- 當哈希沖突的比較多的時候,一般解決都是拉鏈法,但是這樣就會導致查找的復雜度為o(n),這樣就不如用紅黑樹了
7 請你回答一下map底層為什么用紅黑樹實現
1、紅黑樹:
紅黑樹是一種二叉查找樹,但在每個節點增加一個存儲位表示節點的顏色,可以是紅或黑(非紅即黑)。
通過對任何一條從根到葉子的路徑上各個節點着色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,
因此,紅黑樹是一種弱平衡二叉樹,相對於要求嚴格的AVL樹來說,它的旋轉次數少,所以對於搜索,插入,刪除操作較多的情況下,通常使用紅黑樹。
性質:
1. 每個節點非紅即黑
2. 根節點是黑的;
3. 每個葉節點(葉節點即樹尾端NULL指針或NULL節點)都是黑的;
4. 如果一個節點是紅色的,則它的子節點必須是黑色的。
5. 對於任意節點而言,其到葉子點樹NULL指針的每條路徑都包含相同數目的黑節點;
2、平衡二叉樹(AVL樹):
紅黑樹是在AVL樹的基礎上提出來的。
平衡二叉樹又稱為AVL樹,是一種特殊的二叉排序樹。其左右子樹都是平衡二叉樹,且左右子樹高度之差的絕對值不超過1。
AVL樹中所有結點為根的樹的左右子樹高度之差的絕對值不超過1。
將二叉樹上結點的左子樹深度減去右子樹深度的值稱為平衡因子BF,那么平衡二叉樹上的所有結點的平衡因子只可能是-1、0和1。只要二叉樹上有一個結點的平衡因子的絕對值大於1,則該二叉樹就是不平衡的。
3、紅黑樹較AVL樹的優點:
AVL 樹是高度平衡的,頻繁的插入和刪除,會引起頻繁的rebalance,導致效率下降;紅黑樹不是高度平衡的,算是一種折中,插入最多兩次旋轉,刪除最多三次旋轉。
所以紅黑樹在查找,插入刪除的性能都是O(logn),且性能穩定,所以STL里面很多結構包括map底層實現都是使用的紅黑樹。
推薦鏈接:
