B樹 B 樹和B 樹

2021-07-22 07:52:54 字數 3134 閱讀 9155

參考

大規模資料儲存中,實現索引查詢這樣乙個實際背景下,樹節點儲存的元素數量是有限的(如果元素數量非常多的話,查詢就退化成節點內部的線性查詢了),這樣導致二叉查詢樹結構由於

樹的深度過大而造成磁碟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...