B樹B-樹B+樹B*樹概念
B樹
即二叉搜索樹:
1.所有非葉子結(jié)點至多擁有兩個兒子(Left和Right);
2.所有結(jié)點存儲一個關(guān)鍵字骏掀;
3.非葉子結(jié)點的左指針指向小于其關(guān)鍵字的子樹尾抑,右指針指向大于其關(guān)鍵字的子樹芭商;
B樹的搜索:
從根結(jié)點開始语盈,如果查詢的關(guān)鍵字與結(jié)點的關(guān)鍵字相等哑了,那么就命中赘方;否則,如果查詢關(guān)鍵字比結(jié)點關(guān)鍵字小弱左,就進入左兒子窄陡;如果比結(jié)點關(guān)鍵字大,就進入右兒子拆火;如果左兒子或右兒子的指針為空跳夭,則報告找不到相應(yīng)的關(guān)鍵字;
如果B樹的所有非葉子結(jié)點的左右子樹的結(jié)點數(shù)目均保持差不多(平衡)们镜,那么B樹的搜索性能逼近二分查找币叹;
但它比連續(xù)內(nèi)存空間的二分查找的優(yōu)點是,改變B樹結(jié)構(gòu)(插入與刪除結(jié)點)不需要移動大段的內(nèi)存數(shù)據(jù)模狭,甚至通常是常數(shù)開銷颈抚;
但B樹在經(jīng)過多次插入與刪除后,有可能導(dǎo)致不同的結(jié)構(gòu):
右邊也是一個B樹嚼鹉,但它的搜索性能已經(jīng)是線性的了贩汉;同樣的關(guān)鍵字集合有可能導(dǎo)致不同的樹結(jié)構(gòu)索引九妈;所以,使用B樹還要考慮盡可能讓B樹保持左圖的結(jié)構(gòu)雾鬼,和避免右圖的結(jié)構(gòu),也就是所謂的“平衡”問題宴树;??????
實際使用的B樹都是在原B樹的基礎(chǔ)上加上平衡算法策菜,即“平衡二叉樹”;如何保持B樹結(jié)點分布均勻的平衡算法是平衡二叉樹的關(guān)鍵酒贬;平衡算法是一種在B樹中插入和刪除結(jié)點的策略又憨;
B-樹
是一種多路搜索樹(并不是二叉的):
1.定義任意非葉子結(jié)點最多只有M個兒子;且M>2锭吨;
2.根結(jié)點的兒子數(shù)為[2, M]蠢莺;
3.除根結(jié)點以外的非葉子結(jié)點的兒子數(shù)為[M/2, M];
4.每個結(jié)點存放至少M/2-1(取上整)和至多M-1個關(guān)鍵字零如;(至少2個關(guān)鍵字)
5.非葉子結(jié)點的關(guān)鍵字個數(shù)=指向兒子的指針個數(shù)-1躏将;(沒有太明白?)
6.非葉子結(jié)點的關(guān)鍵字:K[1], K[2], …, K[M-1]考蕾;且K[i]< K[i+1]祸憋;
7.非葉子結(jié)點的指針:P[1], P[2], …, P[M];其中P[1]指向關(guān)鍵字小于K[1]的子樹肖卧,P[M]指向關(guān)鍵字大于K[M-1]的子樹蚯窥,其它P[i]指向關(guān)鍵字屬于(K[i-1],K[i])的子樹;
8.所有葉子結(jié)點位于同一層塞帐;
B-樹的搜索拦赠,從根結(jié)點開始,對結(jié)點內(nèi)的關(guān)鍵字(有序)序列進行二分查找葵姥,如果命中則結(jié)束荷鼠,否則進入查詢關(guān)鍵字所屬范圍的兒子結(jié)點;重復(fù)牌里,直到所對應(yīng)的兒子指針為空颊咬,或已經(jīng)是葉子結(jié)點;
B-樹的特性:
1.關(guān)鍵字集合分布在整顆樹中牡辽;
2.任何一個關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個結(jié)點中喳篇;
3.搜索有可能在非葉子結(jié)點結(jié)束;
4.其搜索性能等價于在關(guān)鍵字全集內(nèi)做一次二分查找态辛;
5.自動層次控制麸澜;
由于限制了除根結(jié)點以外的非葉子結(jié)點,至少含有M/2個兒子奏黑,確保了結(jié)點的至少利用率炊邦,其最底搜索性能為:
其中编矾,M為設(shè)定的非葉子結(jié)點最多子樹個數(shù),N為關(guān)鍵字總數(shù)馁害;
所以B-樹的性能總是等價于二分查找(與M值無關(guān))窄俏,也就沒有B樹平衡的問題;
由于M/2的限制碘菜,在插入結(jié)點時凹蜈,如果結(jié)點已滿,需要將結(jié)點分裂為兩個各占M/2的結(jié)點忍啸;刪除結(jié)點時仰坦,需將兩個不足M/2的兄弟結(jié)點合并;
B+樹
B+樹是B-樹的變體计雌,也是一種多路搜索樹:
1.其定義基本與B-樹同悄晃,除了:
2.非葉子結(jié)點的子樹指針與關(guān)鍵字個數(shù)相同;
3.非葉子結(jié)點的子樹指針P[i]凿滤,指向關(guān)鍵字值屬于[K[i],
K[i+1])的子樹(B-樹是開區(qū)間)妈橄;
5.為所有葉子結(jié)點增加一個鏈指針;
6.所有關(guān)鍵字都在葉子結(jié)點出現(xiàn)鸭巴;
B+的搜索與B-樹也基本相同眷细,區(qū)別是B+樹只有達到葉子結(jié)點才命中(B-樹可以在非葉子結(jié)點命中),其性能也等價于在關(guān)鍵字全集做一次二分查找鹃祖;
B+的特性:
1.所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點的鏈表中(稠密索引)溪椎,且鏈表中的關(guān)鍵字恰好是有序的;
2.不可能在非葉子結(jié)點命中恬口;
3.非葉子結(jié)點相當于是葉子結(jié)點的索引(稀疏索引)校读,葉子結(jié)點相當于是存儲(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;
4.更適合文件索引系統(tǒng)祖能;
B*樹
是B+樹的變體歉秫,在B+樹的非根和非葉子結(jié)點再增加指向兄弟的指針;
B*樹定義了非葉子結(jié)點關(guān)鍵字個數(shù)至少為(2/3)*M养铸,即塊的最低使用率為2/3(代替B+樹的1/2)雁芙;
B+樹的分裂:當一個結(jié)點滿時,分配一個新的結(jié)點钞螟,并將原結(jié)點中1/2的數(shù)據(jù)復(fù)制到新結(jié)點兔甘,最后在父結(jié)點中增加新結(jié)點的指針;B+樹的分裂只影響原結(jié)點和父結(jié)點鳞滨,而不會影響兄弟結(jié)點洞焙,所以它不需要指向兄弟的指針;
B*樹的分裂:當一個結(jié)點滿時,如果它的下一個兄弟結(jié)點未滿澡匪,那么將一部分數(shù)據(jù)移到兄弟結(jié)點中熔任,再在原結(jié)點插入關(guān)鍵字,最后修改父結(jié)點中兄弟結(jié)點的關(guān)鍵字(因為兄弟結(jié)點的關(guān)鍵字范圍改變了)唁情;如果兄弟也滿了疑苔,則在原結(jié)點與兄弟結(jié)點之間增加新結(jié)點,并各復(fù)制1/3的數(shù)據(jù)到新結(jié)點甸鸟,最后在父結(jié)點增加新結(jié)點的指針夯巷;
所以,B*樹分配新結(jié)點的概率比B+樹要低哀墓,空間使用率更高;
小結(jié)
B樹:二叉樹喷兼,每個結(jié)點只存儲一個關(guān)鍵字篮绰,等于則命中,小于走左結(jié)點季惯,大于走右結(jié)點吠各;
B-樹:多路搜索樹,每個結(jié)點存儲 [M/2勉抓,M] 個關(guān)鍵字贾漏,非葉子結(jié)點存儲指向關(guān)鍵字范圍的子結(jié)點;
?????????? 所有關(guān)鍵字在整顆樹中出現(xiàn)藕筋,且只出現(xiàn)一次纵散,非葉子結(jié)點可以命中;
B+樹:在B-樹基礎(chǔ)上隐圾,為葉子結(jié)點增加鏈表指針伍掀,所有關(guān)鍵字都在葉子結(jié)點中出現(xiàn),非葉子結(jié)點作為葉子結(jié)點的索引暇藏;B+樹總是到葉子結(jié)點才命中蜜笤;
B*樹:在B+樹基礎(chǔ)上,為非葉子結(jié)點也增加鏈表指針盐碱,將結(jié)點的最低利用率從1/2提高到2/3