佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 數(shù)據(jù)結(jié)構(gòu)-樹(三):多路搜索樹B樹、B+樹

數(shù)據(jù)結(jié)構(gòu)-樹(三):多路搜索樹B樹、B+樹

熱門標(biāo)簽:Linux服務(wù)器 網(wǎng)站排名優(yōu)化 服務(wù)外包 呼叫中心市場(chǎng)需求 地方門戶網(wǎng)站 百度競(jìng)價(jià)排名 AI電銷 鐵路電話系統(tǒng)

多路搜索樹

  1. 完全二叉樹高度:O(log2N),其中2為對(duì)數(shù)
  2. 完全M路搜索樹的高度:O(logmN),其中M為對(duì)數(shù),樹每層的節(jié)點(diǎn)數(shù)
  3. M路搜索樹主要用于解決數(shù)據(jù)量大無(wú)法全部加載到內(nèi)存的數(shù)據(jù)存儲(chǔ)。通過增加每層節(jié)點(diǎn)的個(gè)數(shù)和在每個(gè)節(jié)點(diǎn)存放更多的數(shù)據(jù)來(lái)在一層中存放更多的數(shù)據(jù),從而降低樹的高度,在數(shù)據(jù)查找時(shí)減少磁盤訪問次數(shù)。
  4. 所以每層的節(jié)點(diǎn)數(shù)和每個(gè)節(jié)點(diǎn)包含的關(guān)鍵字越多,則樹的高度越矮。但是在每個(gè)節(jié)點(diǎn)確定數(shù)據(jù)就越慢,但是B樹關(guān)注的是磁盤性能瓶頸,所以在單個(gè)節(jié)點(diǎn)搜索數(shù)據(jù)的開銷可以忽略。

 B樹

B樹是一種M路搜索樹,B樹主要用于解決M路搜索樹的不平衡導(dǎo)致樹的高度變高,跟二叉樹退化為鏈表導(dǎo)致性能問題一樣。B樹通過對(duì)每層的節(jié)點(diǎn)進(jìn)行控制、調(diào)整,如節(jié)點(diǎn)分離,節(jié)點(diǎn)合并,一層滿時(shí)向上分裂父節(jié)點(diǎn)來(lái)增加新的層等操作來(lái)來(lái)保證該M路搜索樹的平衡。具體規(guī)則如下:

  1. 根節(jié)點(diǎn)的兒子樹個(gè)數(shù)在2到M之間,其他非葉子節(jié)點(diǎn)的兒子樹個(gè)數(shù)在M/2和M之間。如果兒子樹個(gè)數(shù)因?yàn)榉至殉^了M則此時(shí)需要向上遞歸分裂父節(jié)點(diǎn),當(dāng)找到一個(gè)不需要再分裂的父節(jié)點(diǎn)則停止分裂。該分裂過程直到根節(jié)點(diǎn),如果需要分裂根節(jié)點(diǎn),則會(huì)產(chǎn)生兩個(gè)根,故需要?jiǎng)?chuàng)建一個(gè)新的根來(lái)將這兩個(gè)根作為兒子節(jié)點(diǎn),此時(shí)樹的高度會(huì)增加1。
  2. 每個(gè)非葉子節(jié)點(diǎn)的關(guān)鍵字的值從左到右依次變大,第i個(gè)關(guān)鍵字代表子樹i+1中的最小關(guān)鍵字;(其中對(duì)于根節(jié)點(diǎn)來(lái)說(shuō)i在1到(2到M)之間,其他非葉子節(jié)點(diǎn)則是1到(M/2到M)之間);
  3. B樹的所有數(shù)據(jù)項(xiàng)都存放到葉子節(jié)點(diǎn),非葉子節(jié)點(diǎn)不存放數(shù)據(jù),非葉子節(jié)點(diǎn)只存放用于指示搜索方向的關(guān)鍵字,即索引。這樣有利于將更多的非葉子節(jié)點(diǎn)加載到內(nèi)存中,方便進(jìn)行數(shù)據(jù)查找;
  4. 所有葉子節(jié)點(diǎn)都在相同的深度并且每個(gè)葉子節(jié)點(diǎn)包含L/2到L項(xiàng)數(shù)據(jù)。

 M和L的大小選擇

  1. M為B樹的階數(shù)或者說(shuō)是路數(shù)
  2. L為每個(gè)葉子節(jié)點(diǎn)最多存放的數(shù)據(jù)項(xiàng)個(gè)數(shù)
  3. 在B樹中,每個(gè)節(jié)點(diǎn)都是一個(gè)磁盤區(qū)塊,所以需要根據(jù)磁盤區(qū)塊的大小來(lái)決定M和L。

 磁盤區(qū)塊大小與M的計(jì)算

  1. 每個(gè)非葉子節(jié)點(diǎn)存放了關(guān)鍵字和指向兒子樹的指針,具體數(shù)量為:M階的B樹,每個(gè)非葉子節(jié)點(diǎn)存放了M-1個(gè)關(guān)鍵字和M個(gè)指向兒子樹的指針,故加入每個(gè)關(guān)鍵字的大小為8字節(jié)(如Java的long類型就是8字節(jié)),每個(gè)指針為4字節(jié),則M階B樹的每個(gè)非一葉子節(jié)點(diǎn)需要:8 * (M-1) + 4 * M = 12M - 8個(gè)字節(jié)。
  2. 如果規(guī)定每個(gè)非葉子節(jié)點(diǎn)(磁盤區(qū)塊)占用內(nèi)存不超過8K,即8192,則M最大為683,即683*12-8=8192。

 葉子節(jié)點(diǎn)數(shù)據(jù)項(xiàng)個(gè)數(shù)L

  1. 假如每個(gè)數(shù)據(jù)項(xiàng)大小也是256字節(jié),則由于磁盤區(qū)塊大小為8K,即8192個(gè)字節(jié),而每個(gè)葉子節(jié)點(diǎn)可以存放L/2到L個(gè)數(shù)據(jù)項(xiàng),所以每個(gè)葉子節(jié)點(diǎn)最多存放:8192/256=32個(gè)數(shù)據(jù)項(xiàng),即L的大小為32。
  2. 一棵5階的B樹的結(jié)構(gòu)如下,即M和L等于5:其中每個(gè)非葉子節(jié)點(diǎn)包含最多M-1=5-1=4個(gè)關(guān)鍵字,包含M,即5個(gè)指向子樹指針。L等于5,則每個(gè)葉子節(jié)點(diǎn)最多存放5個(gè)數(shù)據(jù)項(xiàng)。

 

B+樹

B+樹結(jié)構(gòu)跟B樹基本一致,唯一的區(qū)別是B+樹的葉子節(jié)點(diǎn)之間通過指針相連形成一個(gè)鏈表,故便于遍歷所有的葉子節(jié)點(diǎn),即獲取所有或者搜索關(guān)鍵字某一范圍的所有數(shù)據(jù)項(xiàng)。MySQL的InnoDB存儲(chǔ)引擎就是會(huì)用B+樹作為索引實(shí)現(xiàn)。

以上所述是小編給大家介紹的多路搜索樹B樹、B+樹詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • MySQL優(yōu)化中B樹索引知識(shí)點(diǎn)總結(jié)
  • 淺談MySQL的B樹索引與索引優(yōu)化小結(jié)
  • 完整B樹算法Java實(shí)現(xiàn)代碼
  • c語(yǔ)言B樹深入理解

標(biāo)簽:衡水 蘭州 黃山 崇左 仙桃 銅川 湖南 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《數(shù)據(jù)結(jié)構(gòu)-樹(三):多路搜索樹B樹、B+樹》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    洛扎县| 洞头县| 化德县| 怀柔区| 广饶县| 临夏县| 汝城县| 兴和县| 岳池县| 乌审旗| 吉安市| 黄浦区| 搜索| 东丰县| 南开区| 徐水县| 三原县| 吉安县| 柞水县| 南陵县| 彭水| 屯留县| 南平市| 调兵山市| 大方县| 赣榆县| 乌恰县| 中牟县| 沧州市| 翼城县| 滁州市| 泰安市| 晴隆县| 临泽县| 东宁县| 综艺| 崇文区| 库尔勒市| 永城市| 彭水| 荣成市|