十三、數據結構---B+樹

十四、數據結構---B+樹
一、B-樹
 1、什麼是B-樹
    具體講解之前,有一點,再次強調下:B-樹,即爲B樹。因爲B樹的原英文名稱爲B-tree,而國內很多人喜歡把B-tree譯作B-tree,其實,這是個非常不好的直譯,很容易讓人產生誤解。如人們很可能會以爲B-樹是一種樹而B樹又是另一種樹。而事實上是,B-tree就是指的B樹。
  我們知道,B樹是爲了磁盤或其他存儲設備而設計的一種多叉(下面你會看到,相對於二叉,B樹每個內結點有多個分支,即多叉)平衡查找樹。與紅黑樹很相似,但在降低磁盤I/O操作方面要更好一些。許多數據庫系統都一般使用B樹或者B樹的各種變形結構,如下文即將要介紹的B+樹存儲信息。
 2、B-樹概念(用階定義B樹)
    是一種多路搜索樹(並不是二叉的),又叫平衡多路查找樹。一棵m階的B樹的特性如下:
    a、定義任意非葉子結點最多隻有M個兒子;且M>=2;
    b、根節點的兒子數爲[2,M](此時的根結點不是葉子結點);
    c、除根結點以外的非葉子結點的兒子數爲[M/2,M];
    d、有j個孩子的非葉結點恰好有j-1個關鍵字,關鍵字按遞增順序排列。
    e、非葉子結點的關鍵字個數n必須滿足: [ceil(M / 2)-1]<= n <= M-1;(其中ceil(x)是一個取上限的函數)
    f、非葉子結點的關鍵字:K[1],K[2],...,K[M-1];且K[i] < K[i+1];
    g、非葉子結點的指針:P[1],P[2],...,P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1],K[i])的子樹;
    h、所有的葉子結點位於同一層,葉子結點不包含任何關鍵字信息


    一棵含有N個總關鍵字數的m階的B樹的最大高度是多少?
    答:若B樹包含N個關鍵字,則次非葉子結點包含有N-1個孩子結點,而所有的葉子結點都在第i層,我們可以得出:
     1、因爲根至少有兩個孩子,因此第2層至少兩個結點
     2、除根和葉子外,其他結點至少┌m/2┐個孩子
     3、因此在第3層至少有2*┌m/2┐個結點
     4、在第4層至少有2*(┌m/2┐^2)個結點
     5、在第i層至少有2*(┌m/2┐^(i-2))個結點,
     於是有: N+1 ≥ 2*(┌m/2┐^(i-2))
     考慮第i層的結點個數爲N+1,那麼2*(┌m/2┐^(i-2)) ≤ N+1,也就是i層的最少結點數剛好達到N+1個,
     即: i ≤ log┌m/2┐((N+1)/2)+2;


     所以,當B樹包含N個關鍵字時,B樹的最大高度爲i-1(因爲計算B樹高度時,葉結點所在層不計算在內),
     即: i-1 ≤ log┌m/2┐((N+1)/2)+1;(log_ceil(m/2)(N+1)/2+1)
     ceil:返回不小於(m/2)的下一個整數。
 3、插入操作
    插入一個元素時,首先在B樹中是否存在,如果不存在,即在葉子結點處結束,然後在葉子結點中插入該新的元素,注意:如果葉子結點空間足夠,這裏需要向右移動葉子結點中大於新插入關鍵字的元素,如果空間滿了以致沒有足夠的空間去添加新的元素,則將該結點進行"分裂",將一半數量的元素分裂到新的其相鄰右節點中,中間關鍵字元素上移到父結點中(當然,如果父結點空間滿了,也同樣需要"分裂"操作),而且當結點中關鍵元素向右移動了,相關的指針也需要向右移。如果在根結點插入新元素,空間滿了,則進行分裂操作,這樣原來的根結點中的關鍵字元素向上移動到新的根結點中,因此導致樹的高度增加一層。


    B-樹的特性:
     1、關鍵字集合分佈在整顆樹中;
     2、任何一個關鍵字出現且只出現在一個結點中;
     3、搜索有可能在非葉子結點結束;
     4、其搜索性能等價於在關鍵字全集內做一次二分查找;
     5、自動層次控制;
 二、B+樹
    B+樹是B-樹的變體,也是一種多路搜索樹:
     a、任意非葉子節點最多有M個子節點;且M>2;
     b、除根結點以外的非葉子結點至少有M/2個子節點;
     c、根結點至少有兩個子節點;
     d、除根結點外每個結點存放至少M/2和至多M個關鍵字;(至少2個關鍵字)
     e、非葉子結點的子樹指針與關鍵字個數相同;
     f、所有結點的關鍵字:K[1],K[2],...K[M];且K[i] < K[i+1];
     g、非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i],K[i+1])的子樹;
     h、所有葉子結點位於同一層;
     i、爲所有葉子結點增加一個鏈指針;
     j、所有關鍵字都在葉子結點出現;


    B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在非葉子結點命中),其性能也等價於在關鍵字全集做一次二分查找;
     B+的特性:
      1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;
      2.不可能在非葉子結點命中;
      3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;
      4.更適合文件索引系統;
 三、B+樹的查找
    對B+樹可以進行兩種查找運算:
    1.從最小關鍵字起順序查找;
    2.從根節點開始,進行隨機查找。
    在查找時,若非終端結點上的關鍵值等於給定值,並不終止,而是繼續向下直到葉子結點。因此,在B+樹中,不管查找成功與否,每次查找都是走了一條從根到葉子結點的路徑。
 四、總結
    B樹:有序數組+平衡多叉樹;
    B+樹:有序數組鏈表+平衡多叉樹;


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章