算法数据结构(一)-B树
介紹
B樹的目的為了硬盤快速讀取數據(降低IO操作次樹)而設計的一種平衡的多路查找樹。目前大多數據庫及文件索引,都是使用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不存在。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | //偽代碼 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/
來源:http://www.cnblogs.com/mushroom/p/4100087.html
總結
以上是生活随笔為你收集整理的算法数据结构(一)-B树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis之Hash数据结构
- 下一篇: Btree 索引