本篇文章給大家分享的是有關(guān)什么是多路搜索樹(shù)B樹(shù)和B+樹(shù),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習,希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著(zhù)小編一起來(lái)看看吧。
多路搜索樹(shù)
完全二叉樹(shù)高度:O(log2N),其中2為對數
完全M路搜索樹(shù)的高度:O(logmN),其中M為對數,樹(shù)每層的節點(diǎn)數
M路搜索樹(shù)主要用于解決數據量大無(wú)法全部加載到內存的數據存儲。通過(guò)增加每層節點(diǎn)的個(gè)數和在每個(gè)節點(diǎn)存放更多的數據來(lái)在一層中存放更多的數據,從而降低樹(shù)的高度,在數據查找時(shí)減少磁盤(pán)訪(fǎng)問(wèn)次數。
所以每層的節點(diǎn)數和每個(gè)節點(diǎn)包含的關(guān)鍵字越多,則樹(shù)的高度越矮。但是在每個(gè)節點(diǎn)確定數據就越慢,但是B樹(shù)關(guān)注的是磁盤(pán)性能瓶頸,所以在單個(gè)節點(diǎn)搜索數據的開(kāi)銷(xiāo)可以忽略。
B樹(shù)
B樹(shù)是一種M路搜索樹(shù),B樹(shù)主要用于解決M路搜索樹(shù)的不平衡導致樹(shù)的高度變高,跟二叉樹(shù)退化為鏈表導致性能問(wèn)題一樣。B樹(shù)通過(guò)對每層的節點(diǎn)進(jìn)行控制、調整,如節點(diǎn)分離,節點(diǎn)合并,一層滿(mǎn)時(shí)向上分裂父節點(diǎn)來(lái)增加新的層等操作來(lái)來(lái)保證該M路搜索樹(shù)的平衡。具體規則如下:
根節點(diǎn)的兒子樹(shù)個(gè)數在2到M之間,其他非葉子節點(diǎn)的兒子樹(shù)個(gè)數在M/2和M之間。如果兒子樹(shù)個(gè)數因為分裂超過(guò)了M則此時(shí)需要向上遞歸分裂父節點(diǎn),當找到一個(gè)不需要再分裂的父節點(diǎn)則停止分裂。該分裂過(guò)程直到根節點(diǎn),如果需要分裂根節點(diǎn),則會(huì )產(chǎn)生兩個(gè)根,故需要創(chuàng )建一個(gè)新的根來(lái)將這兩個(gè)根作為兒子節點(diǎn),此時(shí)樹(shù)的高度會(huì )增加1。
每個(gè)非葉子節點(diǎn)的關(guān)鍵字的值從左到右依次變大,第i個(gè)關(guān)鍵字代表子樹(shù)i+1中的最小關(guān)鍵字;(其中對于根節點(diǎn)來(lái)說(shuō)i在1到(2到M)之間,其他非葉子節點(diǎn)則是1到(M/2到M)之間);
B樹(shù)的所有數據項都存放到葉子節點(diǎn),非葉子節點(diǎn)不存放數據,非葉子節點(diǎn)只存放用于指示搜索方向的關(guān)鍵字,即索引。這樣有利于將更多的非葉子節點(diǎn)加載到內存中,方便進(jìn)行數據查找;
所有葉子節點(diǎn)都在相同的深度并且每個(gè)葉子節點(diǎn)包含L/2到L項數據。
M和L的大小選擇
M為B樹(shù)的階數或者說(shuō)是路數
L為每個(gè)葉子節點(diǎn)最多存放的數據項個(gè)數
在B樹(shù)中,每個(gè)節點(diǎn)都是一個(gè)磁盤(pán)區塊,所以需要根據磁盤(pán)區塊的大小來(lái)決定M和L。
磁盤(pán)區塊大小與M的計算
每個(gè)非葉子節點(diǎn)存放了關(guān)鍵字和指向兒子樹(shù)的指針,具體數量為:M階的B樹(shù),每個(gè)非葉子節點(diǎn)存放了M-1個(gè)關(guān)鍵字和M個(gè)指向兒子樹(shù)的指針,故加入每個(gè)關(guān)鍵字的大小為8字節(如Java的long類(lèi)型就是8字節),每個(gè)指針為4字節,則M階B樹(shù)的每個(gè)非一葉子節點(diǎn)需要:8 * (M-1) + 4 * M = 12M - 8個(gè)字節。
如果規定每個(gè)非葉子節點(diǎn)(磁盤(pán)區塊)占用內存不超過(guò)8K,即8192,則M最大為683,即683*12-8=8192。
葉子節點(diǎn)數據項個(gè)數L
假如每個(gè)數據項大小也是256字節,則由于磁盤(pán)區塊大小為8K,即8192個(gè)字節,而每個(gè)葉子節點(diǎn)可以存放L/2到L個(gè)數據項,所以每個(gè)葉子節點(diǎn)最多存放:8192/256=32個(gè)數據項,即L的大小為32。
一棵5階的B樹(shù)的結構如下,即M和L等于5:其中每個(gè)非葉子節點(diǎn)包含最多M-1=5-1=4個(gè)關(guān)鍵字,包含M,即5個(gè)指向子樹(shù)指針。L等于5,則每個(gè)葉子節點(diǎn)最多存放5個(gè)數據項。
B+樹(shù)
B+樹(shù)結構跟B樹(shù)基本一致,唯一的區別是B+樹(shù)的葉子節點(diǎn)之間通過(guò)指針相連形成一個(gè)鏈表,故便于遍歷所有的葉子節點(diǎn),即獲取所有或者搜索關(guān)鍵字某一范圍的所有數據項。的InnoDB存儲引擎就是會(huì )用B+樹(shù)作為索引實(shí)現。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站