1. 程式人生 > >紅黑樹、AVL樹、B樹的比較

紅黑樹、AVL樹、B樹的比較

   AVL, 紅黑樹,B

前段日子在研究著這幾中樹的優劣

    首先我們來談談AVL樹,AVL樹是一棵平衡的二叉查詢樹。它的平衡因子為-110不平衡達到2就會將樹進行平衡化。 AVL對數字的分佈要求比較高,比如說是隨機數,有人曾經做過計算,在利用AVL樹與紅黑樹進行插入運算的時候,AVL樹在數字分佈的較為集中的時候會不斷的進行著樹的左右旋,這在時間上是巨大的浪費。

    那麼紅黑樹呢,紅黑樹能夠以O(log2 n)的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決.紅黑樹在平衡上是不如AVL樹。但是紅黑樹應用的比較的廣,特別是C++中的關聯陣列,所謂的關聯陣列就是以鍵值對的形式進行存放資料的形式。

比如說MulitiMap

    B樹,應用的較多的在資料庫中,檔案系統中。在檔案系統中,因為資料比較的大,所以通常選擇的是放在磁碟等其他的硬體中,那麼對於讀取的時間要求比較高。一棵M階的B樹,在查詢方面高於二叉樹(對於有同樣多資料的情況下)它的一個節點有時候代表的是一個快或者作業系統中的一頁,我們知道在作業系統中,有頁儲存式,也有段儲存式,當然還有改進的段頁式。在頁儲存式中,我們有程式頁表(描述程式佔用的物理頁面及邏輯排列順序)。物理頁面表(描述實體記憶體空間的分配使用狀況)。請求表。每一個程式進行執行的時候都會有一個請求表(描述系統內各個程式頁表的位置和大小,用於地址轉換)。在請求表中有很多的塊,在塊中描述著每一個在哪一個頁,就對應著頁表中的內容,頁表中相應的指標指向的是物理儲存的地址。程式地址空間分成大小相等的頁面

(page frame),同時把記憶體也分成與頁面大小相等的塊,當一個使用者程式裝入記憶體時,以頁面為單位進行分配。那麼這個時候如果我們應用B-樹的時候,因為葉子節點並不是儲存了所有的資料,儘管一個節點會放一個頁的資料,那麼會產生跨頁的情況,

於是我們的B+樹出現了,B+樹中將所有的關鍵字放在葉子節點中,非葉子節點放索引。那麼查詢的時候就可以不用跨頁

     由上面我們知道在B樹中是針對大量資料時候使用的,對於一般的資料建議使用紅黑樹或者其它的資料結構就好,在平衡樹中紅黑樹使用的是比較廣的,查詢二叉樹中如果高度太大時間上消耗的比較多。而且很可能出現左子樹或者右子樹的情況。對於B樹中,我們知道一個節點可能會存放幾個資料,這種情況查詢時間上消耗的還是比紅黑樹多的

當你對樹中檢索的次數比插入、刪除的次數多的時候用AVL

當你對樹中插入、刪除、檢索差不多的時候用RB

當有很多資料且資料從硬碟或者其他較慢的裝置中時用B


以上就是個人的理解。請各位指正