b樹的概念是為了解決一些現實問題而提出的,當資料量太大時,而記憶體中又無法儲存這麼多的資料,那麼就需要將資料儲存在磁碟上,如果繼續採用平衡樹的方法就會帶來一些問題,平衡樹每個節點都會分為兩個節點,那麼當資料太大的時候,樹的高度也會不斷增減,io操作的次數也隨之增加,所以需要降低樹的高度,所以才有了乙個節點儲存多個資料的b樹的方案。
b-樹b-樹其實就是b樹,b樹是一種多路平衡搜尋樹(非二叉),若其是m路,則:
b樹與二叉搜尋樹的最大區別在於其每個節點可以存不止乙個鍵值,並且其子女不止兩個,不過還是需要滿足鍵值數=子女數-1。因此,對於相同數量的鍵值,b樹比二叉搜尋樹要更加矮一些,特別是當m較大時,樹高會更低。
一張圖看懂一切
b-樹的插入
b樹的插入首先查詢插入所在的節點,若該節點未滿,插入即可,若該節點以及滿了,則需要將該節點**,並將該節點的中間的元素移動到父節點上,若父節點未滿,則結束,若父節點也滿了,則需要繼續**父節點,如此不斷向上,直到根節點,如果根節點也滿了,則**根節點,從而樹的高度+1。
b-樹的刪除
b樹的刪除首先要找到刪除的節點,並刪除節點中的元素,如果刪除的元素有左右孩子,則上移左孩子最右節點或右孩子最左節點到父節點,若沒有左右孩子,則直接刪除。刪除後,若某節點中元素數目不符合b樹要求(小於m/2-1取上整),則需要看起相鄰的兄弟節點是否有多餘的元素,若有,則可以向父節點借乙個元素,然後將最豐滿的相鄰兄弟結點中上移最後或最前乙個元素到父節點中(有點類似於左旋)。若其相鄰兄弟節點沒有多餘的元素,則與其兄弟節點合併成乙個節點,此時也需要將父節點中的乙個元素一起合併。
b+樹b+樹主要是應檔案系統所需而產生的。檔案系統中,檔案的目錄是一級一級索引,只有最底層的葉子節點(檔案)儲存資料。非葉子節點只儲存索引,不儲存實際的資料,資料都儲存在葉子節點中,所有的非葉子節點都可以看成是索引部分。
b+樹是b樹的乙個變種,其也是一種多路平衡搜尋樹,其與b樹的主要區別是:
一張圖看懂一切
b+樹的插入
b+樹的插入與b樹類似,如果節點中有多餘的空間放入元素,則直接插入即可。如果節點本來就已經滿了,則將其**為兩個節點,並將其中間元素的索引放入到父節點中,在這裡如果是葉子節點的話,是拷貝中間元素的索引到父節點中(因為葉子節點需要包含所有的元素),而如果是非葉子節點,則是上移節點的中間元素到父節點中。
b+樹的刪除
在葉節點中刪除元素,如果節點還滿足b+樹的要求,則okay。如果元素個數過少,並且其鄰近兄弟節點有多餘的元素,則從鄰近兄弟節點中藉乙個元素,並修改父節點中的索引使其滿足新的劃分。如果其鄰近兄弟節點也沒有多餘的元素,則將其和鄰近兄弟節點合併,並且我們需要修改其父節點的索引以滿足新的劃分。並且如果父節點的索引元素太少不滿足要求,則需要繼續看起兄弟節點是否多餘,如果沒有多餘則還需要與兄弟節點合併,如此不斷向上,直到根節點。如果根節點中元素也被刪除,則把根節點刪除,並由合併來的節點作為新的根節點,樹的高度減1。
b-樹和b+樹的區別
b+樹的非葉子節點並沒有指向關鍵字具體資訊的指標,因此其內部節點相對b樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,盤塊所能容納的關鍵字數量也越多,具有更好的空間區域性性,一次性讀入記憶體的需要查詢的關鍵字也越多,相對的io讀寫次數也就降低了。
另外對於b+樹來說,因為非葉子節點只是葉子節點中關鍵字的索引,所以任何關鍵字的查詢都必須走一條從根節點到葉子節點的路,所有關鍵字查詢的路徑長度相同。而若經常訪問的元素離根節點很近,則b樹訪問更迅速,因為其不一定要到葉子節點。
資料庫索引採用b+樹的主要原因是b樹在提高了io效能的同時並沒有解決元素遍歷效率低下的問題,而也正是為了解決該問題,b+樹應運而生。因為葉子節點中增加了乙個鏈指標,b+樹只需要取遍歷葉子節點可以實現整棵樹的遍歷。而且資料庫中基於範圍的查詢是非常頻繁的,b樹對基於範圍的查詢效率太低。
資料結構之B樹 B 樹 B 樹 B 樹
b 樹b 樹 b b b 樹是為了磁碟或其它儲存裝置而設計的一種平衡多路查詢樹 相對於二叉,b樹每個內節點有多個分支 與紅黑樹相比,在相同的的節點的情況下,一顆b樹的高度遠遠小於紅黑樹的高度.b樹上操作的時間通常由訪問磁碟的時間和cpu計算時間這兩部分構成,而cpu的速度非常快,所以b樹的操作效率取...
資料結構 四 B樹 B 樹 B 樹 B 樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
資料結構 B樹 B 樹 B 樹 B 概念
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...