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


B樹是為了提高磁盤或外部存儲設備查找效率而產生的一種多路平衡查找樹。

B+樹為B樹的變形結構,用於大多數數據庫或文件系統的存儲而設計。

 

B樹相對於紅黑樹的區別

在大規模數據存儲的時候,紅黑樹往往出現由於樹的深度過大而造成磁盤IO讀寫過於頻繁,進而導致效率低下的情況。為什么會出現這樣的情況,我們知道要獲取磁盤上數據,必須先通過磁盤移動臂移動到數據所在的柱面,然后找到指定盤面,接着旋轉盤面找到數據所在的磁道,最后對數據進行讀寫。磁盤IO代價主要花費在查找所需的柱面上,樹的深度過大會造成磁盤IO頻繁讀寫。根據磁盤查找存取的次數往往由樹的高度所決定,所以,只要我們通過某種較好的樹結構減少樹的結構盡量減少樹的高度,B樹可以有多個子女,從幾十到上千,可以降低樹的高度。

 

B樹和B+樹的區別

1.  B樹則所有節點都帶有帶有指向記錄(數據)的指針(ROWID),B+樹中只有葉子節點會帶有指向記錄(數據)的指針(ROWID)。因為B+樹它把所有的衛星數據(或指向數據的指針)都存儲在葉節點中,內部節點只存放關鍵字和孩子指針,不會帶上指向記錄的指針(ROWID),這樣,一個塊中可以容納更多的索引項,一是可以降低樹的高度。二是一個內部節點可以定位更多的葉子節點(優點1)。

2.  B+樹中每個葉子節點都包含指向下一個葉子節點的指針。所有葉子節點都是通過指針連接在一起,而B樹不會。 葉子節點之間通過指針來連接,范圍掃描將十分簡單(優點2),而對於B樹來說,則需要在葉子節點和內部節點不停的往返移動。

   B+樹還有一個最大的好處,遍歷更加高效,方便掃庫(優點2),B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支持range-query非常方便,而B樹不支持。這是數據庫選用B+樹的最主要原因。(B+樹的遍歷更加高效,B樹需要以中序的方式遍歷節點,而B+樹只需把所有葉子節點串成鏈表就可以從頭到尾遍歷)。

3.  B+樹每個節點的指針和key一樣多,B樹每個節點指針比key多1。

 

 

為什么說B+比B樹更適合實際應用中操作系統的文件索引和數據庫索引?

1) B+的磁盤讀寫代價更低

B+的內部結點並沒有指向關鍵字具體信息的指針。因此其內部結點相對B樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的需要查找的關鍵字也就越多。相對來說IO讀寫次數也就降低了。

2) B+tree的查詢效率更加穩定

由於非葉子結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。

數據庫索引采用B+樹的主要原因是 B樹在提高了磁盤IO性能的同時並沒有解決元素遍歷的效率低下的問題。正是為了解決這個問題,B+樹應運而生。B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在數據庫中基於范圍的查詢是非常頻繁的,而B樹不支持這樣的操作(或者說效率太低)

 

 

各有優點: 

B+樹的優點:

1. 非葉子節點不會帶上指向記錄的指針(ROWID),這樣,一個塊中可以容納更多的索引項,一是可以降低樹的高度。二是一個內部節點可以定位更多的葉子節點。

2. 葉子節點之間通過指針來連接,范圍掃描將十分簡單,而對於B樹來說,則需要在葉子節點和內部節點不停的往返移動。

 

B樹的優點:

對於在內部節點的數據,可直接得到,不必根據葉子節點來定位。


免責聲明!

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



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