1. 程式人生 > >B數學習筆記

B數學習筆記

基本概念

  • 所謂m階B樹,即m路平衡搜尋數(m>=2)
  • 內部節點各有不超過m-1個關鍵碼,不超過m個分支
  • 內部節點的分支數也不能太少,根節點的分支>=2,其餘節點>=m/2
  • 一般也用([m/2],m)樹來稱呼具體分支數的B樹
  • B樹的高度由外部節點界定,外部節點是葉節點的數值為空,其實並不存在的孩子.
  • B樹的構造,一個節點指向父節點,兩個節點列表,一個是本超級節點所含的n個節點,另一個是n+1個孩子節點,所以後一個列表的大小永遠比前一個大一
  • 一個B樹類需要記錄關鍵碼總數,階數,根,最後訪問的非空節點的位置; 方法包括查詢,插入,刪除;兩種非法行動的解決方法,1:因插入而上溢後的分裂處理,2:因刪除而下溢後的合併處理
  • 查詢: 從根節點開始,在每一個超級節點列表中進行順序查詢,如果查詢成功,返回,如果查詢失敗,找到大小包含被查詢節點值的孩子節點,依次進行. 一次失敗的查詢必然結束於外部節點.
  • 樹根節點為第0層,則葉子節點深度為h-1,樹高為h. 最大數高:每個超級節點所含節點數為下限—m/2,最小樹高,每個超級節點所含節點為m-1
  • 查詢的時間複雜度為O(logn),底數為分支數,n為節點數
  • 插入: 先查詢節點的位置,根據B樹中的最後訪問的非空節點的位置來確定插入位置r,然後在本節點列表r+1處插入該節點,在孩子節點列表中的r+2處插入空指標. 上溢是指,在完成插入操作後,本超級節點和分支數超出了B數的規定,即m-1和m.
  • 上溢解決–分裂 : 將超級節點列表根據中位數(偶數個取中間偏大的節點)分為三部分,0-k—1,k,k+1—m-1,然後將k位置的節點上升到其父節點,然後其餘兩部分分別作為k位置節點的左右孩子
  • 如果分裂後父節點發生上溢,如法炮製,再進行分裂,最壞的情況是一直上溢到根節點,如果根節點發生上溢,令提升的節點作為新的根節點,樹的高度增加一,這也是B樹高度增加的唯一方法
  • 插入的時間複雜度正比與B樹的高度,即O(h)
  • 刪除: 先查詢到被刪除節點的位置,再查詢該節點在具體超級節點列表中的位置.如果該超級節點是葉子節點,直接刪除對應節點即可;如果不是,我們需要找到比該節點值大的節點中值最小的那個對應的節點,這個節點很好找,就是被刪除節點的右子樹的最左端節點,一直向下尋找後繼節點,直到葉子節點,將後繼節點賦值給被刪除節點的位置,然後刪除葉子節點的後繼節點和其左子樹.
  • 下溢: 完成刪除操作後,破壞了B樹的規定
  • 下溢解決, 旋轉,如果被刪除節點的超級節點的兄弟節點中的節點數大於m/2,那麼可以借出一個節點,但是兄弟節點中的各節點的值要不都小於其父節點,要不都大於其父節點,如果簡單的借出,會破壞B樹,所以將兄弟節點中最大的小於其父節點或最小的大於其父節點的節點代替父節點,父節點下降至缺少節點的超級節點.
  • 下溢解決,合併,如果被刪除節點的超級節點的兄弟不存在或者沒有足夠的可以借出的節點,這時,下降父節點,並和其左右子樹合併,合併後的超級節點最大size為m-2,然後將合併後的節點作為原父節點的前置節點的右子樹,如果下降了節點的超級節點發生了下溢,如法炮製,直至根節點.