B樹隨筆

B樹的理解

在大型數據存儲過程中,由于計算機內存的大小畢竟有限,更多的時候,我們會把數據存放在硬盤上,這時對于數據查找的耗時,更多是出現在磁盤的讀取上。以一臺普通計算機為例(500-MIPS)1S可以執行5E條指令,而一個7200轉的硬盤,一秒鐘大約可以執行120次的磁盤讀取。
對于AVL樹的結構,我們已經把查找的時間復雜度降到了logN,如果放到了硬盤讀取上,降低后的耗時仍然無法滿足我們的需求。
舉個例子:如果計算機有20個用戶,那么單個用戶1S可以執行約2500萬次指令和6次硬盤讀取,如果數據的量是1000萬,log1000000≈24,一次成功的查找是1.38 × 24 ≈ 32次磁盤訪問,也就是5S的時間。很顯然這是無法忍受的。
要解決上述問題,二叉樹已經無法滿足,這時,我們可以通過增加樹的分支,來讓樹結構擁有更少的高度。
B樹(這里指B+樹)的特性
1.數據項全存儲在樹葉節點上
2.非樹葉節點擁有M-1個關鍵字,用來劃分M個分支
3.樹的節點的兒子數在2和M之間
4.除根外,所有非樹葉節點的兒子數在M/2和M之間
5.所有的樹葉都在相同的深度上并有L/2和L之間的數據項


58e5002054456.png

上述特性中的M和L的擬定,用一個例子來說明方法:
每個節點代表的是一塊磁盤區域,假設已知一塊磁盤區域最多能容納8192字節,現在又1000萬的數據,每一個關鍵字是32個字節,每一個記錄是256個字節。
那么非樹葉節點存儲的M-1個關鍵字和M個分支,一個分支是4個字節的話,需要的空間是32(M-1)和4M,總數是36M-32 不能超過8192,那么M的值最大是228。由于每個記錄是256,最多可以把32個記錄放入一個區塊中,于是我們選擇L=32。
一般在存儲中,我們將根節點和下一層存于內存中,第三層之后存于磁盤中,這樣就可以最大范圍的利用內存和磁盤的優勢了。

插入和刪除
插入操作是,根據關鍵字找到插入數據所屬的樹葉節點,如果沒有滿,那么很簡單,直接插入。如果已經達到了L的限度,那么需要對樹葉進行分裂操作,讓分裂的兩個樹葉都有L/2的數據量。同理,如果分裂后導致根節點也達到了L的限度,那么需要對根節點做同樣的分裂操作。直到根節點也執行該操作,那么根節點轉為兒子節點,在上一層增加新的根節點。這是唯一增加樹高度的方式。

刪除操作是插入的逆操作,如果達到了L/2的限度,需要進行合并操作。同樣如果追溯到了根節點,可能會導致樹的高度減少。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容