算法學習之高級數據結構之B樹的操作和B+樹,B*樹介紹

  一、介紹磁盤

  B樹其中一個應用就是在磁盤的存儲結構中,先說一下磁盤的讀寫原理和效率。
  磁盤上數據必須用一個三維地址唯一標示:柱面號、盤面號、塊號(磁道上的盤塊)

/寫磁盤上某一指定數據需要下面3個步驟:

(1)  首先移動臂根據柱面號使磁頭移動到所需要的柱面上,這一過程被稱爲定位或查找 

(2)  根據盤面號來確定指定盤面上的磁道。

(3) 盤面確定以後,盤片開始旋轉,將指定塊號的磁道段移動至磁頭下。

經過上面三個步驟,指定數據的存儲位置就被找到。這時就可以開始讀/寫操作了。

訪問某一具體信息,由3部分時間組成:

查找時間(seek time) Ts: 完成上述步驟(1)所需要的時間。這部分時間代價最高,最大可達到0.1s左右。

等待時間(latency time) Tl: 完成上述步驟(3)所需要的時間。由於盤片繞主軸旋轉速度很快,一般爲7200/(電腦硬盤的性能指標之一家用的普通硬盤的轉速一般有5400rpm(筆記本)7200rpm幾種)因此一般旋轉一圈大約0.0083s

傳輸時間(transmission time) Tt: 數據通過系統總線傳送到內存的時間,一般傳輸一個字節(byte)大概0.02us=2*10^(-8)s

磁盤讀取數據是以盤塊(block)爲基本單位的。位於同一盤塊中的所有數據都能被一次性全部讀取出來。而磁盤IO代價主要花費在查找時間Ts上。因此我們應該儘量將相關信息存放在同一盤塊,同一磁道中。或者至少放在同一柱面或相鄰柱面上,以求在讀/寫信息時儘量減少磁頭來回移動的次數,避免過多的查找時間Ts

所以,在大規模數據存儲方面,大量數據存儲在外存磁盤中,而在外存磁盤中讀取/寫入塊(block)中某數據時,首先需要定位到磁盤中的某塊,如何有效地查找磁盤中的數據,需要一種合理高效的外存數據結構,這種結構就是B樹。

  B樹是爲磁盤或其他直接存取輔助存儲設備而設計的一種平衡多路查找樹。許多數據庫系統採用B樹或B樹的變形來存儲信息。 

  二、B樹定義。(左子樹小於根節點小於右子樹。)

  一個m階的B樹(m叉樹)具有如下性質:
  內節點含有關鍵字樹爲n[x],則其含有的子女數爲n[x]+1,。
  1,樹中每個結點含有n個孩子,即n滿足:ceil(m/2)<=n<=m。關鍵字數界限則爲:ceil(m/2)-1到m-1個。算法導論中下界稱爲最小度數t(t>=2)。即關鍵字數範圍t-1到2t-1個。若含有2t-1個節點,則稱爲這個節點是滿的。其中ceil(x)是一個取上限的函數
  2,若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點爲葉子結點,整棵樹只有一個根節點);
  3,所有葉子結點都出現在同一層,,每個葉子節點具有相同的深度。葉子節點不包含任何關鍵字信息。
  4,每個非終端結點中包含有n個關鍵字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
       a)Ki (i=1...n)爲關鍵字,且關鍵字按順序升序排序K(i-1)< Ki。 
       b)Pi爲指向子樹根的接點,且指針P(i-1)指向子樹種所有結點的關鍵字均小於Ki,但都大於K(i-1)。 
       c)除根結點之外的結點的關鍵字的個數n必須滿足: [ceil(m / 2)-1]<= n <= m-1(葉子結點也必須滿足此條關於關鍵字數的性質,根結點除外)。
  5,B樹的高度:h>=logt((n+1)/2)

  三、B樹的搜索,插入,刪除。

  1,搜索:和搜索二叉查找樹相似。
  根據節點的子女數做分支界定。判斷要查找的值與當前值的大小,小則在左子樹,大則在右子樹,遞歸查找,直到找到相等的節點爲止,並肩該節點和該值的下標返回。如果找到葉子節點依然沒找到則返回null。
   2,插入:原則是要滿足B樹的性質,所以插入的時候要注意關鍵字的個數在ceil(m/2)-1到m-1個之間。
   如果插入的節點關鍵字樹<m-1說明還沒有滿,則直接插入。如果插入的關鍵字數=m-1則說明滿了,要進行分裂。取節點中關鍵字的中間值,以中間值爲界一分爲二,產生兩個新的節點,將中間值作爲關鍵字插入到父節點中(h-1層),由於插入到父節點時可能父節點也是滿的,所以要重複上述操作直至根節點,建立一個新的根節點,整個B樹增加一層。分裂是B樹長高的唯一途徑!
  3,刪除:刪除操作也要注意滿足B樹的性質。關鍵字的個數在ceil(m/2)-1到m-1個之間。
  先查找到要刪除的值,看該值所在的節點是不是葉子節點,如果不是則有孩子節點,需要上移其孩子節點或者合併孩紙節點,再看情況;如果沒有孩子節點則要看情況。
  葉子節點刪除後,如果該節點關鍵字數<ceil(m/2)-1則看兄弟節點中關鍵字數是否滿足>ceil(m/2)-1,若是則借一個兄弟節點:先從父節點移除一個節點下來,再從兄弟節點移除一個節點給父節點,這樣就滿足了;如果兄弟節點不滿足>ceil(m/2)-1,則合併:從父節點下移除一個節點,並與下相鄰兄弟節點合併。
被刪除的節點如果有孩子節點,看其中孩子節點的關鍵字樹是否都是t-1個關鍵字,如果是,則將其下移和兩個孩紙節點合併,並將其刪除;如果不是,則將至少含有t個關鍵字的孩子節點移除一個元素到該內節點中。

  四、補充B樹變體結構B+樹和B*樹的介紹。

  B+樹與m階B樹的區別:
  1,有n子樹節點就有n個關鍵字
2,葉子節點包含了全部關鍵字信息,及只想這些記錄的指針。
3,非終結點可堪稱是索引部分。節點中僅僅只含有子樹根節點中的最大或者最小關鍵字。
B+樹相比較而言,讀寫磁盤代價更低,查詢效率穩定。(由於非終結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。)
  B*樹與B+樹類似,在B+樹中的非根和非葉子節點增加指向其兄弟節點的指針,塊的最低使用率爲2/3滿,即節點的最小讀數爲2/3*m滿。
  在網上發現了不錯的學習資料,分享給大家:http://blog.csdn.net/v_JULY_v/article/details/6530142#comments
  








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