紅黑樹 vs 最小堆

2021-10-02 11:37:52 字數 1486 閱讀 2987

不談記憶體,從演算法上來講

紅黑樹插入是最壞情況要比較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

**:

紅黑樹 vs 最小堆

不談記憶體,從演算法上來講 紅黑樹插入是最壞情況要比較2logn次 最高的高度 外加不超過兩次旋轉,最小堆最壞情況是logn次 紅黑樹刪除不需要比較只需要不超過3旋轉,查詢最小值需要遍歷logn,如果刪除最小值樹調整一般很小 最小堆查詢頂節點是o 1 而刪除頂節點在任何情況下都是個最壞的情況,需要比...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...