2016-06-09 68 views
0

我正在編寫一個程序來檢索給定範圍內的對象數,並且我使用B-樹數據結構來實現我的解決方案,因爲對象數不能放入RAM中。我遇到過幾篇文章,說B +樹在範圍查詢方面遠遠優於B樹,並被所有主要的數據庫實現所使用。我無法理解爲什麼B +樹優於B樹,因爲所有數據都存儲在葉上,並且需要h(樹的高度)磁盤訪問來檢索節點並在B樹中執行範圍查詢可能位於父節點上,因此磁盤訪問將會最小化。此外,如果我有一個查詢,例如返回一個特定鍵的對象,那麼我可能能夠找到該鍵,然後像在B +樹中一樣一直下降到樹葉。那爲什麼他們說B +樹比B樹更有效呢?如果我必須編寫一個程序來執行範圍查詢,那麼B樹不應該是正確的數據結構嗎?提前感謝您的回覆!使用B樹和B +樹的範圍查詢

回答

0

實際的B樹和B +樹實現傾向於具有固定字節大小的節點,該節點的大小被選擇爲與架構的頁大小或另一個像磁盤上簇大小的夾具相匹配。典型的值將是4096字節。

B +樹可以將更多的密鑰放入內部節點,因爲記錄數據不需要空間。由於與B樹相比,給定的一組索引頁(內部節點)「覆蓋」了更多的查詢,這給出了更高的扇出(更低的樹高度)和更好的緩存利用率。

B +樹的第二個優點是內部節點中的密鑰只用於路由搜索到右邊的葉子。他們只需要將他們左邊的東西與他們右邊的東西分開,但他們不必與任何實際的記錄鍵相對應。這意味着它們通常可以縮短,這也意味着刪除不必從葉層傳播到索引層(即,一旦從葉中刪除了一個鍵,就完成了 - 沒有必要刪除內部節點中的任何內容,除了在重新鏈接期間自然發生的情況)。

另外,在一個典型的B +樹中,葉節點有指向其左右兄弟姐妹的指針。這意味着您可以通過遍歷頁面的鏈表來遍歷一系列記錄,而不必使用B樹典型的棘手迭代邏輯。

在B樹的間隔可以位於父節點和磁盤訪問

將因此最小化

要躺在該理論休息,估計有多少鍵總共位於的內部節點B樹和總共有多少個密鑰位於葉節點中。該比率表示搜索可以提前停止的頻率,然後一直下降到葉級別。注意:早期情況只適用於密鑰恰好存在於樹中的查詢;否則體面到葉級是不可避免的。