介紹
B樹的目的為了硬盤快速讀取數據(降低IO操作次樹)而設計的一種平衡的多路查找樹。目前大多數據庫及文件索引,都是使用B樹或變形來存儲實現。
目錄
- 為什么B樹效率高
- B樹存儲
- B樹缺點
為什么B樹效率高
在大規模數據存儲操作中,由於無法一次性加載到內存里。所以避免不了發生內外存交換。所以次數越少,效率表現也越高。
來看下面這張圖:
這是個典型的b樹結構,初始因子為1000,高度僅為3的b樹,就可以存儲1002001000的數據了。
假設要查詢最后一個數據:
- 從硬盤加載根節點搜索,IO一次。
- 根據根節點的指針信息,去加載第二層的節點, IO一次。
- 重復2,IO一次。
IO只用了3次,就查詢了需要的數據,所以說B樹效率是非常高的。
B樹的節點,在硬盤里表現為:柱面里的頁(page)或盤塊(block) ,如果把索引持久化到內存,只需要一次就夠了。
B樹的高效的前提是數據已排序。
B樹結構
這是B樹存儲在硬盤的邏輯結構圖。
其中根節點中17,35在稱為關鍵字(key) ,實際中往往附帶更多復雜類型數據。
可以看出一個節點包含 keys ChildNotePointer 2部分信息。
根據這張圖介紹下b樹的基礎定義:
這是顆5階B樹的圖,階簡寫m。
1:樹中每個結點最多含有m個子節點(m>=2)。
2:每個內節點至少 [ceil(m / 2)] 個子節點。 內節點即非根節點非頁子節點,也可以叫中間節點。
3: 關鍵字key的數量 [ceil(m / 2)-1]<= n <= m-1,關鍵字按遞增排序。
6: 每個葉節點具有相同的深度,即樹的高度h,而且不包含關鍵字信息。
上圖也可稱為最小度數為3的b樹,(degree) ,簡寫t。
t其實是上面第二條定義中 [ceil(m / 2)] 的值,即t=[ceil(m/2)], 3=ceil(5/2) 。
1:每個非根節點至少有t-1個關鍵字,非根內節點至少有t個子節點。 t稱為度數(degree),t>=2 。
. 2:每個節點至多有2t-1關鍵字,每個內節點最多有2t個子節點。
3:每個葉節點具有相同的深度,即樹的高度h,而且不包含關鍵字信息。
度和階都是描述子節點的數量的。
算法導論譯版中是用度來描述的。
數據結構與算法分析是用階來描述,網上大多也是。
下面簡單的描述實現邏輯。
搜索:從根節點搜索,找到返回,找不到遞歸子節點。一直搜索到葉子節點,找到返回,找不到則說明key不存在。
//偽代碼 entry BTreeSearch(node, key) { if(node == null) return null; for(int i = 0; i < node.keys.length; i++) { if(node.keys[i] == key) return node.data[i]; } return BTreeSearch(ChildrenNode[i].node,key); } var entry = BTreeSearch(root, my_key);
插入:根節點插入,不滿直接插入。節點滿進行分裂,再滿遞歸分裂。
刪除:查詢到節點,然后進行刪除操作,不滿足B數節點的定義則進行節點合並。
更新:查詢到子節點,更新數據。
B樹缺點
從上面的得知,在查詢單條數據是非常快的。但如果范圍查的話,b樹每次都要從根節點查詢一遍。
所以在實際應用中,往往采用b樹的變形,b+樹來存儲,只有葉子節點存儲數據,每個葉子節點都指向下一個。
參考博客 http://blog.csdn.net/v_JULY_v/article/details/6530142/