轉載:https://blog.csdn.net/z702143700/article/details/49079107
前言:BST、AVL、RBT、B-tree都是動態結構,查找時間基本都在O(longN)數量級上。下面做出詳細對比。
1. 二叉查找樹 (Binary Search Tree)
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)。
插入刪除操作算法簡單,時間復雜度與查找差不多。
2. 平衡二叉查找樹 ( Balanced Binary Search Tree )
二叉查找樹在最差情況下竟然和順序查找效率相當,這是無法仍受的。事實也證明,當存儲數據足夠大的時候,樹的結構對某些關鍵字的查找效率影響很大。當然,造成這種情況的主要原因就是BST不夠平衡(左右子樹高度差太大)。既然如此,那么我們就需要通過一定的算法,將不平衡樹改變成平衡樹。因此,AVL樹就誕生了。
AVL 的操作代價分析:
(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)。
3. 紅黑樹 (Red-Black Tree )
二叉平衡樹的嚴格平衡策略以犧牲建立查找結構(插入,刪除操作)的代價,換來了穩定的O(logN) 的查找時間復雜度。但是這樣做是否值得呢?
能不能找一種折中策略,即不犧牲太大的建立查找結構的代價,也能保證穩定高效的查找效率呢? 答案就是:紅黑樹。
RBT 的操作代價分析:
(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),但是實際上,這種操作由於簡單所需要的代價很小。
4. B~樹/B+樹 (B-Tree )
對於在內存中的查找結構而言,紅黑樹的效率已經非常好了(實際上很多實際應用還對RBT進行了優化)。但是如果是數據量非常大的查找呢?將這些數據全部放入內存組織成RBT結構顯然是不實際的。實際上,像OS中的文件目錄存儲,數據庫中的文件索引結構的存儲…. 都不可能在內存中建立查找結構。必須在磁盤中建立好這個結構。那么在這個背景下,RBT還是一種好的選擇嗎?
在磁盤中組織查找結構,從任何一個結點指向其他結點都有可能讀取一次磁盤數據,再將數據寫入內存進行比較。大家都知道,頻繁的磁盤IO操作,效率是很低下的(機械運動比電子運動要慢不知道多少)。顯而易見,所有的二叉樹的查找結構在磁盤中都是低效的。因此,B樹很好的解決了這一個問題。
B-Tree的操作代價分析:
(1) 查找代價:
B-Tree作為一個平衡多路查找樹(m-叉)。B樹的查找分成兩種:一種是從一個結點查找另一結點的地址的時候,需要定位磁盤地址(查找地址),查找代價極高。另一種是將結點中的有序關鍵字序列放入內存,進行優化查找(可以用折半),相比查找代價極低。而B樹的高度很小,因此在這一背景下,B樹比任何二叉結構查找樹的效率都要高很多。而且B+樹作為B樹的變種,其查找效率更高。
(2)插入代價:
B-Tree的插入會發生結點的分裂操作。當插入操作引起了s個節點的分裂時,磁盤訪問的次數為h(讀取搜索路徑上的節點)+2s(回寫兩個分裂出的新節點)+1(回寫新的根節點或插入后沒有導致分裂的節點)。因此,所需要的磁盤訪問次數是h+2s+1,最多可達到3h+1。因此插入的代價是很大的。
(3)刪除代價:
B-Tree的刪除會發生結點合並操作。最壞情況下磁盤訪問次數是3h=(找到包含被刪除元素需要h次讀訪問)+(獲取第2至h層的最相鄰兄弟需要h-1次讀訪問)+(在第3至h層的合並需要h-2次寫訪問)+(對修改過的根節點和第2層的兩個節點進行3次寫訪問)。
B-Tree效率總結:
由於考慮磁盤儲存結構,B樹的查找、刪除、插入的代價都遠遠要小於任何二叉結構樹(讀寫磁盤次數的降低)。
動態查找樹結構的對比:
(1) 平衡二叉樹和紅黑樹 [AVL PK RBT]
AVL 和RBT 都是二叉查找樹的優化。其性能要遠遠好於二叉查找樹。他們之間都有自己的優勢,其應用上也有不同。
結構對比: AVL的結構高度平衡,RBT的結構基本平衡。平衡度AVL > RBT.
查找對比: AVL 查找時間復雜度最好,最壞情況都是O(logN)。RBT 查找時間復雜度最好為O(logN),最壞情況下比AVL略差。
插入刪除對比:
1. AVL的插入和刪除結點很容易造成樹結構的不平衡,而RBT的平衡度要求較低。因此在大量數據插入的情況下,RBT需要通過旋轉變色操作來重新達到平衡的頻度要小於AVL。
2. 如果需要平衡處理時,RBT比AVL多一種變色操作,而且變色的時間復雜度在O(logN)數量級上。但是由於操作簡單,所以在實踐中這種變色仍然是非常快速的。
3. 當插入一個結點都引起了樹的不平衡,AVL和RBT都最多需要2次旋轉操作。但刪除一個結點引起不平衡后,AVL最多需要logN 次旋轉操作,而RBT最多只需要3次。因此兩者插入一個結點的代價差不多,但刪除一個結點的代價RBT要低一些。
4. AVL和RBT的插入刪除代價主要還是消耗在查找待操作的結點上。因此時間復雜度基本上都是與O(logN) 成正比的。
總體評價:大量數據實踐證明,RBT的總體統計性能要好於平衡二叉樹。
(2) B-樹和B+樹 [ B-Tree PK B+Tree]
B+樹是B-樹的一種變體,在磁盤查找結構中,B+樹更適合文件系統的磁盤存儲結構。
結構對比:
B-樹是平衡多路查找樹,所有結點中都包含了待查關鍵字的有效信息(比如文件磁盤指針)。每個結點若有n個關鍵字,則有n+1個指向其他結點的指針。
B+樹嚴格意義上說已經不是樹,它的葉子結點之間也有指針鏈接。B+樹的非終結點中並不含有關鍵字的信息,需要查找的關鍵字的全部信息都包含在葉子結點上。非終結點中只作為葉子結點關鍵字的索引而存在。
查找對比:
1. 在相同數量的待查數據下,B+樹查找過程中需要調用的磁盤IO操作要少於普通B-樹。由於B+樹所在的磁盤存儲背景下,因此B+樹的查找性能要好於B-樹。
2. B+樹的查找效率更加穩定,因為所有葉子結點都處於同一層中,而且查找所有關鍵字都必須走完從根結點到葉子結點的全部歷程。因此同一顆B+樹中,任何關鍵字的查找比較次數都是一樣的。而B樹就不一定了,可能查找到某一個非終結點就結束了。
插入刪除對比: B+樹與B-樹在插入刪除操作中的效率是差不多的。
總體評價:在應用背景下,特別是文件結構存儲中。B+樹的應用要更多,其效率也要比B-樹好。