《演算法導論》筆記 B樹

2021-06-06 21:16:14 字數 2282 閱讀 9183

演算法

cc++

c#資料結構

b樹是平衡樹的一種,主要用於操作儲存在磁碟等二級儲存裝置上的大量資料。相比起記憶體(主存)來說,磁碟操作的速度非常慢(慢幾個數量級),所以涉及到儲存在磁碟的資料的時候,儘量減少磁碟的讀取和寫入操作對於提高操作速度是非常重要的。b樹就是針對這個特點進行設計以滿足相應要求的。

b樹的性質:

2. 每個內節點擁有指向n[x]+1個指向葉節點的指標,c1[x],c2[x]......cn[x]+1[x]。葉節點沒有ci[x]域

3. 節點x的key值,將子節點的key值範圍分開了。如果ki是ci[x]指向的子節點的任意乙個key的值,那麼有:

k1 ≤ key1[x] ≤ k2 ≤ key2[x] ≤ ≤ keyn[x][x] ≤ kn[x]+1.

4. 所有的葉節點具有相同的深度,這個深度也就是樹高h。

5. 乙個節點可容納的關鍵字數目是有上下限的。這個界限可以用包含乙個大於2的整數t的表示式來表示,這個數t稱為b樹的最小度。

b樹的每個節點都會擁有大量的子節點,而b樹樹高也很小。一般情況下,每個節點都會儲存大量的關鍵字,使得節點大小接近磁碟頁面大小,因為磁碟讀取乙個頁面的資料時,相對會快一些(由於機械結構方面的原因,讀取連續乙個頁面的資料,機械臂移動很小)。另外,根據b樹的構造方式,節點的關鍵越多,也就能擁有越多的子節點,這對降低b樹的高度很關鍵,b樹的樹高越小,那麼讀取磁碟的操作也會越少。速度也就相應得到提高。

b樹的高度: ht(n+1/2)

b樹的查詢操作(search):

b樹的查詢操作比較簡單,可以看成是二叉查詢樹查詢操作的簡單擴充套件。因為每個節點中的key都是有序排列的,所以只需要從根節點開始,對每個節點進行如下的遞迴操作:

將目標keytarget從節點x的最小關鍵值key1[x]開始比對,一直找到keytarget第一次大於某個關鍵值keyi[x],可知,如果keytarget等於keyi+1[x],則keyi+1[x]就是要找查詢的物件,如果keytarget不等於keyi+1[x],那麼,keytarget就是存在於ci+1[x]所指向的子樹中。然後在這個子樹根節點重複上述查詢過程,一種到找到目標物件,或是到葉節點後仍然無法找到該物件,則返回null。

b樹的建立

b樹的建立很簡單,就是建立乙個空的根節點即可。要注意的是,不論是b樹的建立或是插入操作中,都需要建立新的節點的操作(allocatt_node)。這個操作會分配一般是分配乙個新的磁碟頁的空間供b樹使用。

b樹的插入操作

b樹插入操作不像二叉查詢樹(先找到合適位置,然後創新乙個新節點插入該位置)那樣單純,顯然這樣做會破壞b樹的應有性質。因此,對於b樹,新的key值會插入到某個節點中。但對於滿的節點,也是不能直接插入新key值的。這時就需要乙個節點的split(**)操作。把滿的節點,分成兩個新節點,這兩個新節點各得原節點的一半key值和一半節點,原節點中最中間的key提公升到父節點去作為新節點的區分標誌。這樣,就解決了向滿節點插入的key值的問題。但這樣求父節點本身是非滿狀態的,否則子節點中提公升上來的key值就不能正常插入了。因此,對於b樹的插入操作來說,從根開始往下尋找新key值插入位置的時候,只要一遇到滿節點,就立即進行split,而不是等到在葉節點進行插入操作後遇到節點滿狀態再split。這樣,就可以在進行split操作時,保證被**的節點始終有乙個非滿狀態的父節點。

對於根節點,也要進行特殊和處理,(根很特殊,因為我們知道樹根只有乙個,而且根節點是始終放在主存中的,指向它的引用也是唯一且需要保持的。根節點可以存任意不超過2t-1個key而沒有下限限制。)在根節點進行split時,我們還需要維持一些其它的屬性(特別是對樹根的引用)。

b樹的刪除操作

3. 如果k不在內節點x中,則找到以ci[x]為根的包含k值的那棵子樹(如果k值確實存在的話)。如果ci[x]只有t-1個鍵值,就執行3a或是3b以保證我們在向下尋找的過程中到達的節點都是含有至少t個鍵值的。最後遞迴過程會在某個節點終止(刪除了k或是找不到k)

演算法導論B樹學習筆記

定義就不重複說明了 b樹與b 樹的不同是,b 樹中非葉子節點的節點也會出現在葉子節點中 b樹要求至少t 1,至多2t 1 b樹一 插入 1 關於高度的定理 h l ogtn 1 2h leqslant log t frac h logt 2n 1 2 操作 抽象出來就是插入到某個節點,滿了之後從中間...

演算法導論 B樹

include include define t 3 typedef struct bnodetype bnode,pbnode typedef struct btree,pbtree typedef struct stype,pstype pbnode allocatenode void b tr...

演算法導論 B樹

這是為磁碟儲存而專門設計的一類平衡搜尋樹。由於磁碟訪問相對訪存極慢,因此度量b樹的效能,考慮 a.動態集合操作消耗的計算時間 b.執行了多少次的磁碟訪問。對每個b樹操作,磁碟訪問的次數隨著b樹的高度增加。b tree定義 第1.每個節點x有 a.x.n儲存節點x的關鍵字個數。b.x.n個關鍵字不嚴格...