參考
大規模資料儲存中,實現索引查詢這樣乙個實際背景下,樹節點儲存的元素數量是有限的(如果元素數量非常多的話,查詢就退化成節點內部的線性查詢了),這樣導致二叉查詢樹結構由於
樹的深度過大而造成磁碟i/o讀寫過於頻繁,進而導致查詢效率低下
,那麼如何減少樹的深度(當然是不能減少查詢的資料量),乙個基本的想法就是:採用多叉樹結構(由於樹節點元素數量是有限的,自然該節點的子樹數量也就是有限的)。
1. b-樹,即為b樹
b樹與紅黑樹最大的不同在於,b樹的結點可以有許多子女,從幾個到幾千個。那為什麼又說b樹與紅黑樹很相似呢?因為與紅黑樹一樣,一棵含n個結點的b樹的高度也為o(lgn),但可能比一棵紅黑樹的高度小許多,應為它的分支因子比較大。所以,b樹可以在o(logn)時間內,實現各種如插入(insert),刪除(delete)等動態集合操作
b 樹是為了磁碟或其它儲存裝置而設計的一種多叉平衡查詢樹。與紅黑樹很相似,但在降低磁碟i/0操作方面要更好一些。許多資料庫系統都一般使用b樹或者b樹的各種變形結構,如b+樹,b*樹來儲存資訊。
b樹與紅黑樹最大的不同在於,b樹的結點可以有許多子女,從幾個到幾千個。那為什麼又說b樹與紅黑樹很相似呢?因為與紅黑樹一樣,一棵含n個結點的b樹的高度也為o(lgn),但可能比一棵紅黑樹的高度小許多,應為它的分支因子比較大。所以,b樹可以在o(logn)時間內,實現各種如插入(insert),刪除(delete)等動態集合操作。
b 樹又叫平衡多路查詢樹。一棵
m階的b樹的特性如下:
樹中每個結點最多含有m個孩子(m>=2);
除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子(其中ceil(x)是乙個取上限的函式);
若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有乙個根節點);
所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字資訊(可以看做是外部接點或查詢失敗的接點,實際上這些結點不存在,指向這些結點的指標都為null);
每個非終端結點中包含有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。
b樹的高度
根據上面的例子我們可以看出,對於輔存做io讀的次數取決於b樹的高度。而b樹的高度由什麼決定的呢?
若b樹某一非葉子節點包含n個關鍵字,則此非葉子節點含有n+1個孩子結點,而所有的葉子結點都在第i層,我們可以得出:
因為根至少有兩個孩子,因此第2層至少有兩個結點。
除根和葉子外,其它結點至少有┌m/2┐個孩子,
因此在第3層至少有2*┌m/2┐個結點,
在第4層至少有2*(┌m/2┐^2)個結點,
在第 i 層至少有2*(┌m/2┐^(l-2) )個結點,於是有: n+1 ≥ 2*┌m/2┐i-2;
考慮第l層的結點個數為n+1,那麼2*(┌m/2┐^(l-2))≤n+1,也就是l層的最少結點數剛好達到n+1個,即: i≤ log┌m/2┐((n+1)/2 )+2;
所以:當b樹包含n個關鍵字時,b樹的最大高度為l-1(因為計算b樹高度時,葉結點所在層不計算在內),即:l - 1 =log┌m/2┐((n+1)/2 )+1。
2. b+樹是應檔案系統所需而產生的一種
變形樹。
一棵m階的
b+樹和m階的
b樹的異同點在於:1.有
n棵子樹的結點中含有
n個關鍵字;
2.所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大的順序鏈結。
(而b 樹
的葉子節點並沒有包括全部需要查詢的資訊)3.
所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。
(而b 樹
的非終節點也包含需要查詢的有效資訊)
a) 為什麼說b+-tree比b 樹更適合實際應用中作業系統的檔案索引和資料庫索引?
1) b+-tree
的磁碟讀寫代價更低
b+-tree
的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對
b 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說
io讀寫次數也就降低了。
舉個例子,假設磁碟中的乙個盤塊容納
16bytes
,而乙個關鍵字
2bytes
,乙個關鍵字具體資訊指標
2bytes
。一棵9
階b-tree
(乙個結點最多
8個關鍵字
)的內部結點需要
2個盤快。而b+
樹內部結點只需要
1個盤快。當需要把內部結點讀入記憶體中的時候,
b 樹就比b+
樹多一次盤塊查詢時間
(在磁碟中就是碟片旋轉的時間)。
2) b+-tree
的查詢效率更加穩定
由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。
7.
總結
通過以上介紹,大致將b樹,b+樹,b*樹總結如下:
b樹:有序陣列+平衡多叉樹;
b+樹:有序陣列鍊錶+平衡多叉樹;
b*樹:一棵豐滿的b+樹。
B樹B 樹B 樹和B 樹
原文link b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點...
B 樹 B 樹 B 樹和B 樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就...
B樹 B 樹和B 樹
一 b樹的查詢是在內部節點進行的,節點處存放了節點的所有資訊,即相當於存放的是乙個node。二 b 樹的查詢最終會在外部節點,或者稱為葉子節點,而內部節點不存放node,只存放node的索引,最終能夠在葉子節點處找到乙個指向該node的指標,從而結束查詢。b 樹的另乙個特點是在葉子節點中存放的所有n...