說一下B+tree和二叉搜索樹的區別?說一下二叉搜索樹和AVL樹、紅黑樹之間的差別


https://blog.csdn.net/kingcat666/article/details/45248487

http://www.cnblogs.com/FMOON/p/9487472.html

二叉查找樹(BST),平衡二叉查找樹(AVL),紅黑樹(RBT),B~/B+樹(B-tree)優勢:

(1) 都是動態結構。在刪除,插入操作的時候,都不需要徹底重建原始的索引樹。最多就是執行一定量的旋轉,變色操作來有限的改變樹的形態。而這些操作所付出的代價都遠遠小於重建一棵樹。這一優勢在《查找結構專題(1):靜態查找結構概論 》中講到過。

(2) 查找的時間復雜度大體維持在O(log(N))數量級上。可能有些結構在最差的情況下效率將會下降很快,比如BST。這個會在下面的對比中詳細闡述。

 

二叉搜索樹:就是二叉排序樹,中序遍歷可以得出遞增序列

BST 的操作代價分析:

    (1) 查找代價: 任何一個數據的查找過程都需要從根結點出發,沿某一個路徑朝葉子結點前進。因此查找中數據比較次數與樹的形態密切相關。

         當樹中每個結點左右子樹高度大致相同時,樹高為logN。則平均查找長度與logN成正比,查找的平均時間復雜度在O(logN)數量級上。

         當先后插入的關鍵字有序時,BST退化成單支樹結構。此時樹高n。平均查找長度為(n+1)/2,查找的平均時間復雜度在O(N)數量級上。

 

    (2) 插入代價: 新結點插入到樹的葉子上,完全不需要改變樹中原有結點的組織結構。插入一個結點的代價與查找一個不存在的數據的代價完全相同。

 

    (3) 刪除代價: 當刪除一個結點P,首先需要定位到這個結點P,這個過程需要一個查找的代價。然后稍微改變一下樹的形態。如果被刪除結點的左、右子樹只有一個存在,則改變形態的代價僅為O(1)。如果被刪除結點的左、右子樹均存在,只需要將當P的左孩子的右孩子的右孩子的...的右葉子結點與P互換,在改變一些左右子樹即可。因此刪除操作的時間復雜度最大不會超過O(logN)。

 

    BST效率總結 :  查找最好時間復雜度O(logN),最壞時間復雜度O(N)。

                            插入刪除操作算法簡單,時間復雜度與查找差不多

 

AVL樹(平衡二叉查找樹),解決單支的情況。平衡條件:每個結點的左右子樹的高度之差的絕對值(平衡因子)最多為1。

   (1) 查找代價: AVL是嚴格平衡的BST(平衡因子不超過1)。那么查找過程與BST一樣,只是AVL不會出現最差情況的BST(單支樹)。因此查找效率最好,最壞情況都是O(logN)數量級的。

 

    (2) 插入代價: AVL必須要保證嚴格平衡(|bf|<=1),那么每一次插入數據使得AVL中某些結點的平衡因子超過1就必須進行旋轉操作。事實上,AVL的每一次插入結點操作最多只需要旋轉1次(單旋轉或雙旋轉)。因此,總體上插入操作的代價仍然在O(logN)級別上(插入結點需要首先查找插入的位置)。

 

    (3) 刪除代價:AVL刪除結點的算法可以參見BST的刪除結點,但是刪除之后必須檢查從刪除結點開始到根結點路徑上的所有結點的平衡因子。因此刪除的代價稍微要大一些。每一次刪除操作最多需要O(logN)次旋轉。因此,刪除操作的時間復雜度為O(logN)+O(logN)=O(2logN)

 

    AVL 效率總結 :  查找的時間復雜度維持在O(logN),不會出現最差情況

                            AVL樹在執行每個插入操作時最多需要1次旋轉,其時間復雜度在O(logN)左右。

                            AVL樹在執行刪除時代價稍大,執行每個刪除操作的時間復雜度需要O(2logN)。

 紅黑樹 (Red-Black Tree )

  二叉平衡樹的嚴格平衡策略以犧牲建立查找結構(插入,刪除操作為代價,換來了穩定的O(logN) 的查找時間復雜度

 能不能找一種折中策略,即不犧牲太大的建立查找結構的代價,也能保證穩定高效的查找效率呢? 答案就是:紅黑樹。

紅黑樹的特性:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(NIL)是黑色。 [注意:這里葉子節點,是指為空(NIL或NULL)的葉子節點!]
(4)如果一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。(接近平衡二叉樹)

最長路徑長度不超過最短路徑長度的2倍

主要是用它來存儲有序的數據。C++ STL中的set、map,以及Linux虛擬內存的管理,都是通過紅黑樹去實現的。

   (1) 查找代價:由於紅黑樹的性質(最長路徑長度不超過最短路徑長度的2倍),可以說明紅黑樹雖然不像AVL一樣是嚴格平衡的,但平衡性能還是要比BST要好。其查找代價基本維持在O(logN)左右,但在最差情況下(最長路徑是最短路徑的2倍少1),比AVL要略遜色一點。

 

    (2) 插入代價:RBT插入結點時,需要旋轉操作和變色操作。但由於只需要保證RBT基本平衡就可以了。因此插入結點最多只需要2次旋轉,這一點和AVL的插入操作一樣。雖然變色操作需要O(logN),但是變色操作十分簡單,代價很小。

 

    (3) 刪除代價:RBT的刪除操作代價要比AVL要好的多,刪除一個結點最多只需要3次旋轉操作。

 

    RBT 效率總結 : 查找 效率最好情況下時間復雜度為O(logN),但在最壞情況下比AVL要差一些,但也遠遠好於BST。

                           插入和刪除操作改變樹的平衡性的概率要遠遠小於AVL(RBT不是高度平衡的)。因此需要的旋轉操作的可能性要小,而且一旦需要旋轉,插入一個結點最多只需要旋轉2次,刪除最多只需要旋轉3次(小於AVL的刪除操作所需要的旋轉次數)。雖然變色操作的時間復雜度在O(logN),但是實際上,這種操作由於簡單所需要的代價很小。

 

b+樹:多路的平衡二叉樹

在B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉節點中,各葉節點指針進行連接

小結

       B樹:二叉樹,每個結點只存儲一個關鍵字,等於則命中,小於走左結點,大於

走右結點;

       B-樹:多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵

字范圍的子結點;

       所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;

       B+樹:在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點

中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中;

       B*樹:在B+樹基礎上,為非葉子結點也增加鏈表指針,將結點的最低利用率

從1/2提高到2/3;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM