B-樹

定義:算法

  B-樹是一種平衡的多路查找樹,在文件系統中有所應用。主要用做文件的索引。spa

特性:(M爲層數)指針

  1.定義任意非 葉子結點最多隻有M個 兒子;且M>2;
  2. 根結點兒子數爲[2, M];
  3.除 根結點之外的非 葉子結點兒子數爲[M/2, M];
  4.每一個結點存放至少M/2-1(取上整)和至多M-1個 關鍵字;(至少2個關鍵字,根 節點至少一個關鍵字);
  5.非葉子結點的 關鍵字個數=指向 兒子指針個數-1;
  6.非 葉子結點關鍵字:K[1], K[2], …, K[m-1],m<M+1;且K[i]< K[i+1] ;
  7.非 葉子結點指針:P[1], P[2], …, P[m];其中P[1]指向 關鍵字小於K[1]的子樹,P[m]指向關鍵字大於K[m-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;
  8.全部 葉子結點位於同一層;
 
時間複雜度:(M爲設定的非葉子結點最多子樹個數,N爲關鍵字總數
   
 
基本操做:
     1.B-樹的插入操做 (重點判斷是否知足 n<=m-1)
    a.利用前述的 B-樹的查找算法查找關鍵字的插入位置。若找到,則說明該關鍵字已經存在,直接返回。不然查找操做必失敗於某個最低層的非終端結點上。

        b.判斷該結點是否還有空位置。即判斷該結點的關鍵字總數是否知足n<=m-1。若知足,則說明該結點還有空位置,直接把關鍵字k插入到該結點的合適位置上。若不知足,說明該結點己沒有空位置,須要把結點分裂成兩個。 htm

    分裂的方法是:生成一新結點。把原結點上的關鍵字和k按升序排序後,從中間位置把關鍵字(不包括中間位置的關鍵字)分紅兩部分。左部分所含關鍵字放在舊結點中,右部分所含關鍵字放在新結點中,中間位置的關鍵字連同新結點的存儲位置插入到父結點中。若是父結點的關鍵字個數也超過(m-1),則要再分裂,再往上插。直至這個過程傳到根結點爲止。blog

 

 

  (2)B-樹的刪除操做(重點判斷刪除所在結點及其兄弟結點,父結點中n>ceil(m/2)-1n=ceil(m/2)-1,n<ceil(m/2)-1)排序

      方法:在B-樹上刪除關鍵字K的過程也能夠分爲兩步完成索引

      a.利用前述的B-樹的查找算法找出該關鍵字所在的結點。而後根據 k所在結點是否爲葉子結點有不一樣的處理方法。get

      b.若該結點爲非葉結點,且被刪關鍵字爲該結點中第i個關鍵字key[i],則可從指針son[i]所指的子樹中找出最小關鍵字Y,代替key[i]的位置,而後在葉結點中刪去Y所以,把在非葉結點刪除關鍵字k的問題就變成了刪除葉子結點中的關鍵字的問題了。終端

    B-樹葉結點上刪除一個關鍵字的方法是方法

      首先將要刪除的關鍵字 k直接從該葉子結點中刪除。而後根據不一樣狀況分別做相應的處理,共有三種可能狀況:

        a.若是被刪關鍵字所在結點的原關鍵字個數n>=ceil(m/2),說明刪去該關鍵字後該結點仍知足B-樹的定義。這種狀況最爲簡單,只需從該結點中直接刪去關鍵字便可。

        b.若是被刪關鍵字所在結點的關鍵字個數n等於ceil(m/2)-1,說明刪去該關鍵字後該結點將不知足B-樹的定義,須要調整。

        調整過程爲:若是其左右兄弟結點中有「多餘」的關鍵字,即與該結點相鄰的右(左)兄弟結點中的關鍵字數目大於ceil(m/2)-1。則可將右(左)兄弟結點中最小(大)關鍵字上移至雙親結點。而將雙親結點中小(大)於該上移關鍵字的關鍵字下移至被刪關鍵字所在結點中

         c.若是左右兄弟結點中沒有「多餘」的關鍵字,即與該結點相鄰的右(左)兄弟結點中的關鍵字數目均等於ceil(m/2)-1。這種狀況比較複雜。需把要刪除關鍵字的結點與其左(或右)兄弟結點以及雙親結點中分割兩者的關鍵字合併成一個結點,即在刪除關鍵字後,該結點中剩餘的關鍵字加指針,加上雙親結點中的關鍵字Ki一塊兒合併到Ai(即雙親結點指向該刪除關鍵字結點的左(右)兄弟結點的指針)所指的兄弟結點中去。若是所以使雙親結點中關鍵字個數小於ceil(m/2)-1,則對此雙親結點作一樣處理。以至於可能直到對根結點作這樣的處理而使整個樹減小一層。

    總之,設所刪關鍵字爲非終端結點中的Ki,則能夠指針Ai所指子樹中的最小關鍵字Y代替Ki,而後在相應結點中刪除Y。對任意關鍵字的刪除均可以轉化爲對最下層關鍵字的刪除。

 

如圖示:

a被刪關鍵字Ki所在結點的關鍵字數目不小於ceil(m/2),則只需從結點中刪除Ki和相應指針Ai,樹的其它部分不變

 

b、被刪關鍵字Ki所在結點的關鍵字數目等於ceil(m/2)-1,則需調整。調整過程如上面所述。

 

c、被刪關鍵字Ki所在結點和其相鄰兄弟結點中的的關鍵字數目均等於ceil(m/2)-1,假設該結點有右兄弟,且其右兄弟結點地址由其雙親結點指針Ai所指。則在刪除關鍵字以後,它所在結點的剩餘關鍵字和指針,加上雙親結點中的關鍵字Ki一塊兒,合併到Ai所指兄弟結點中(若無右兄弟,則合併到左兄弟結點中)。若是所以使雙親結點中的關鍵字數目少於ceil(m/2)-1,則依次類推.

相關文章
相關標籤/搜索