演算法和資料結構 平衡查詢樹之B樹

2021-07-15 10:35:39 字數 3422 閱讀 7729

b

b樹(b-tree)是一種樹狀資料結構,它能夠儲存資料、對其進行排序並允許以o(log n)的時間複雜度執行進行查詢、順序讀取、插入和刪除的資料結構。b樹,概括來說是乙個節點可以擁有多於2個子節點的二叉查詢樹。與自平衡二叉查詢樹不同,b-樹為系統最優化大塊資料的讀和寫操作。b-tree演算法減少定位記錄時所經歷的中間過程,從而加快訪問速度。普遍運用在資料庫檔案系統

b樹是二叉搜尋樹:

1.所有非葉子結點至多擁有兩個兒子(left和right);

2.所有結點儲存乙個關鍵字

3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹;

b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中;如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入右兒子;如果左兒子或右兒子的指標為空,則報告找不到相應的關鍵字;如果b樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那麼b樹的搜尋效能逼近二分查詢;但它比連續記憶體空間的二分查詢的優點是,改變b樹結構(插入與刪除結點)不需要移動大段的記憶體資料,甚至通常是常數開銷;但b樹在經過多次插入與刪除後,有可能導致不同的結構,也就是「平衡問題」。

b-樹(是「b樹」不是「b減樹」)

一棵m階(m>2)的b樹,是一棵平衡的m路平衡搜尋樹,可以是空樹或者滿足一下性質:

1. 根節點至少有兩個孩子

2. 每個非根節點有[「m/2」,m]個孩子(孩子個數的區間)

3. 每個非根節點有[ 「m/2」,m-1]個關鍵字,並且以公升序排列(關鍵字個數的區間)

4. key[i]和key[i+1]之間的孩子節點的值介於key[i]、key[i+1]之間

5. 所有的葉子節點都在同一層

ps:「m/2」是向上取整

b-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果

命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為

空,或已經是葉子結點。

如:(m=3)

以b-樹的效能總是等價於二分查詢(與m值無關),也就沒有b樹平衡的問題;

由於m/2的限制,在插入結點時,如果結點已滿,需要將結點**為兩個各佔m/2的結點;刪除結點時,需將兩個不足m/2的兄弟結點合併。

下面簡單說明**:

下面對b-樹進行實現

#pragma once

//3階b樹

templatestruct btreenode

_keys[i] = 0;

}};template//結構體實現k,v形式

struct pair

};templateclass btree

bool insert(const k& key)//插入節點

pairret= find(key);

if (ret._second != -1)//判斷key是否已經存在

return false;

//在節點cur中插入key和sub

node* cur = ret._first;

k insertkey = key;

node* sub = null;

while (1)

cur->_size = (cur->_size - 1) / 2;//更新cur(**後的左半部分)大小

if (cur->_parent == null)//插入**後上移的元素

else

}return true;

} pairfind(const k& key) //查詢key,返回節點及對應節點中陣列下標

parent = cur;

cur = cur->_subs[index];

} return pair(parent, -1);//沒有找到,注意返回cur的父結點和-1

} void inorder()//中序遍歷輸出

private:

void _insertkey(node* cur,const k& key, node* sub)//插入key值

cur->_keys[index + 1] = key;

cur->_subs[index + 2] = sub;

if (sub)

sub->_parent = cur;

++cur->_size;

} void _inorder(node* root)

for (int i = 0; i < _root->_size; ++i)

}protected:

node* _root;

};void btreetest()

; btreebt;

for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)

bt.inorder();

}

b+b+樹是b-樹的變體,也是一種多路搜尋樹:

1.其定義基本與b-樹同,除了以下幾點不同。

2.非葉子結點的子樹指標與關鍵字個數相同;

3.非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹

(b-樹是開區間);

5.為所有葉子結點增加乙個鏈指標;

6.所有關鍵字都在葉子結點出現;

b+的搜尋與b-樹也基本相同,區別是b+樹只有達到葉子結點才命中(b-樹可以在

非葉子結點命中),其效能也等價於在關鍵字全集做一次二分查詢。

b*

b*是b+樹的變體,在b+樹的非根和非葉子結點再增加指向兄弟的指標。

小結

●b樹:二叉樹,每個結點只儲存乙個關鍵字,等於則命中,小於走左結點,大於走右結點;

●b-樹:多路搜尋樹,每個結點儲存m/2到m個關鍵字,非葉子結點儲存指向關鍵字範圍的子結點;所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;

●b+樹:在b-樹基礎上,為葉子結點增加鍊錶指標,所有關鍵字都在葉子結點中出現,非葉子結點作為葉子結點的索引;b+樹總是到葉子結點才命中;

●b*樹:在b+樹基礎上,為非葉子結點也增加鍊錶指標,將結點的最低利用率從1/2提高到2/3;

資料結構之B樹 B 樹 B 樹 B 樹

b 樹b 樹 b b b 樹是為了磁碟或其它儲存裝置而設計的一種平衡多路查詢樹 相對於二叉,b樹每個內節點有多個分支 與紅黑樹相比,在相同的的節點的情況下,一顆b樹的高度遠遠小於紅黑樹的高度.b樹上操作的時間通常由訪問磁碟的時間和cpu計算時間這兩部分構成,而cpu的速度非常快,所以b樹的操作效率取...

資料結構之B 樹 B 樹

b樹的概念是為了解決一些現實問題而提出的,當資料量太大時,而記憶體中又無法儲存這麼多的資料,那麼就需要將資料儲存在磁碟上,如果繼續採用平衡樹的方法就會帶來一些問題,平衡樹每個節點都會分為兩個節點,那麼當資料太大的時候,樹的高度也會不斷增減,io操作的次數也隨之增加,所以需要降低樹的高度,所以才有了乙...

資料結構之B樹與B 樹

1970年,提出了一種用於外查詢的樹,名為b樹,b樹是一顆平衡多叉樹,允許乙個節點有多個孩子,b樹也常常稱為m樹,m為乙個節點的子節點數 b樹滿足以下標準特徵 1.根結點至少有兩個子女。2.每個中間節點都包含k 1個元素和k個孩子,其中 m 2 k m 3.每乙個葉子節點都包含k 1個元素,其中 m...