紅黑樹(平衡的排序二叉樹),滿足以下性質:
1)每個結點要么是紅的,要么是黑的。
2)根結點是黑的。
3)每個葉結點,即空結點(NIL)是黑的。
4)如果一個結點是紅的,那么它的倆個兒子都是黑的。
5)對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點
根據性質5,我們得出:從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長
紅黑樹的關鍵性質: 內部保證有序,旋轉開銷小,整體相對平衡
紅黑樹的應用:
1、java8 hashmap中鏈表轉紅黑樹。
優勢:時間復雜度從O(n)-->O(logn) ,且自旋開銷較其他樹較低(不用整體平衡)。
2、epoll在內核中的實現,用紅黑樹管理事件塊(文件描述符)。
優勢:
1、因為內核態需要維護一個長久存放fd的數據結構,而fd變動十分頻繁,且需要支持快速查詢,且所以紅黑樹很適合。
2、紅黑樹可以判斷是否是重復的fd
-----
其實我感覺用hash表也可以
3、Java的TreeMap實現
相對與hashMap優勢,內部key保持有序,且支持自定義排序比較器。
適用場景,對數據需要排序統計
4、linux進程調度Completely Fair Scheduler,用紅黑樹管理進程控制塊
CFS 背后的主要想法是維護為任務提供處理器時間方面的平衡(公平性)。這意味着應給進程分配相當數量的處理器
任務存儲在以時間為順序的紅黑樹中(由 sched_entity 對象表示),對處理器需求最多的任務 (最低虛擬執行時vruntime)存儲在樹的左側,處理器需求最少的任務(最高虛擬執行時)存儲在樹的右側。 為了公平。調度器然后選取紅黑樹最左端的節點調度為下一個以便保持公平性。
任務通過將其執行時間加入到虛擬執行時, 說明其占用 CPU 的時間,然后假設可執行。再插回到樹中。這樣,樹左側的任務就被給予時間執行了,樹的內容從右側遷移到左側以保持公平。
因此,每一個可執行的任務都會追趕其它任務以維持整個可執行任務集合的執行平衡。
CFS 不直接使用優先級而是將其用作同意任務運行的時間的衰減系數。低優先級任務具有更高的衰減系數。而高優先級任務具有較低的衰減系數。
這意味着與高優先級任務相比,低優先級任務同意任務運行的時間消耗得更快。 這是一個絕妙的解決方式,能夠避免維護按優先級調度的運行隊列。
優勢:優先級保證下沒有O(1)出色,但之所以沒有用隊列是為了保證其公平性
其他:nginx中,用紅黑樹管理timer等
參考文章:
https://blog.csdn.net/ywh147/article/details/8684486
https://www.cnblogs.com/mfrbuaa/p/4641240.html

