1. 程式人生 > >紅黑樹 vs 最小堆

紅黑樹 vs 最小堆

紅黑樹插入是最壞情況要比較2logN次(最高的高度)外加不超過兩次旋轉,最小堆最壞情況是logN次 紅黑樹刪除不需要比較只需要不超過3旋轉,查詢最小值需要遍歷logN,如果刪除最小值樹調整一般很小 最小堆查詢頂節點是O(1),而刪除頂節點在任何情況下都是個最壞的情況,需要比較2logN次 紅黑樹的最壞情況在旋轉中不斷調整變化,插入效能比最小堆差,但刪除最小效能卻比最小堆好上幾倍 如果插入+查詢最小+刪除最小總體來確定紅黑樹和最小堆,紅黑樹佔優,效能波動相對較小,紅黑樹不過多的依賴比較,相對最小堆由比較帶來的的效能影響較小(如果比較是呼叫自定義函式、比較的是字串等,那麼效能就犧牲很大) 最小堆最大的優勢在於取最小值效能是O(1),如果插入的資料基本有序,那麼最小堆能獲得比較好的效能,在頻繁不斷地取最小值的是否滿足條件的應用中有更加好的效能(如超時佇列),紅黑樹相應就要儘量避免不必要的查詢次數才能在超時佇列這種應用中獲得更好的效能 從實際出發: 由於最小堆一般是採用堆的方式實現,元素訪問速度遠高於採用連結串列方式的紅黑樹,插入效能快紅黑樹好幾倍,但最小堆的刪除效能並不快於紅黑樹 最小堆的最大缺點就在於必須是連續的記憶體 測試環境: vmware虛擬機器記憶體1G,cpu1,centos 64, 物理cpu i5 3210m 編譯 O2優化,記憶體預先分配,資料預先生成 千萬級(0-10000000) 連結串列方式實現的最小堆,每次插入刪除都會涉及到後繼和前驅的問題,演算法複雜度高一點(從測試結果來看還比較理想) 逆序,刪除最小 紅黑樹: insert use time 4.856 delete use time 2.142 最小堆: insert use time 1.021 delete use time 2.015 連結串列實現最小堆: insert use time 3.043 delete use time 3.179 順序: 紅黑樹: insert use time 5.672 delete use time 1.910 最小堆: insert use time 0.178 delete use time 3.049
連結串列實現最小堆: insert use time 0.243 delete use time 4.834 隨機(測試序列都是一樣,srand(100),然後千萬次rand()): 紅黑樹: insert use time 15.264 delete use time 1.136 最小堆: insert use time 0.361 delete use time 21.272 連結串列實現最小堆: insert use time 0.524 delete use time 21.984