日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B+树与B*树小结

發(fā)布時間:2024/9/30 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B+树与B*树小结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/25/2608880.html

?B樹:二叉樹,每個結(jié)點只存儲一個關(guān)鍵字,等于則命中,小于走左結(jié)點,大于走右結(jié)點;但是B樹經(jīng)過多次的刪除插入操作,可能會出現(xiàn)長鏈

?B-樹:多路搜索樹,每個結(jié)點存儲M/2M個關(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+樹

1.B+樹定義與特性

B+樹是B-樹的變體,也是一種多路搜索樹:

其定義基本與B-樹同,除了:

1).非葉子結(jié)點的子樹指針與關(guān)鍵字個數(shù)相同

2).非葉子結(jié)點的子樹指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹B-樹是開區(qū)間);

3).為所有葉子結(jié)點增加一個鏈指針

4).所有關(guān)鍵字都在葉子結(jié)點出現(xiàn)

為了全面 這里給出網(wǎng)上另外一種說法:

一棵m階的B+樹和m階的B-樹的差異在于:

????? 1.有n棵子樹的結(jié)點中含有n個關(guān)鍵字; (而B- 樹是n棵子樹有n-1個關(guān)鍵字)

????? 2.所有的葉子結(jié)點中包含了全部關(guān)鍵字的信息,及指向含有這些關(guān)鍵字記錄的指針,且葉子結(jié)點本身依關(guān)鍵字的大小自小而大的順序鏈接。 (而B 樹的葉子節(jié)點并沒有包括全部需要查找的信息)

????? 3.所有的非終端結(jié)點可以看成是索引部分,結(jié)點中僅含有其子樹根結(jié)點中最大(或最小)關(guān)鍵字。 (而B 樹的非終節(jié)點也包含需要查找的有效信息)

下圖給出典型的3階B+樹示例

?

B+的特性:

1).所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好是有序的;

2).不可能在非葉子結(jié)點命中;

3).非葉子結(jié)點相當(dāng)于是葉子結(jié)點的索引(稀疏索引),葉子結(jié)點相當(dāng)于是存儲(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;

4).更適合文件索引系統(tǒng);

?

2.B+樹的基本操作

1)查找操作

???? 對B+樹可以進(jìn)行兩種查找運(yùn)算:

  a.從最小關(guān)鍵字起順序查找

  b.從根結(jié)點開始,進(jìn)行隨機(jī)查找

  在查找時,若非終端結(jié)點上的劇組機(jī)等于給定值,并不終止,而是繼續(xù)向下直到葉子結(jié)點。因此,在B+樹中,不管查找成功與否,每次查找都是走了一條從根到葉子結(jié)點的路徑。其余同B-樹的查找類似。

2).插入操作

????? B+樹的插入與B樹的插入過程類似。不同的是B+樹在葉結(jié)點上進(jìn)行,如果葉結(jié)點中的關(guān)鍵碼個數(shù)超過m,就必須分裂成關(guān)鍵碼數(shù)目大致相同的兩個結(jié)點,并保證上層結(jié)點中有這兩個結(jié)點的最大關(guān)鍵碼。(算法見百度百科)

3)刪除操作

??????B+樹的刪除也僅在葉子結(jié)點進(jìn)行,當(dāng)葉子結(jié)點中的最大關(guān)鍵字被刪除時,其在非終端結(jié)點中的值可以作為一個“分界關(guān)鍵字”存在。若因刪除而使結(jié)點中關(guān)鍵字的個數(shù)少于m/2 (m/2結(jié)果取上界,如5/2結(jié)果為3)時,其和兄弟結(jié)點的合并過程亦和B-樹類似。

?

PS:

a.不同于B+樹只適合隨機(jī)檢索,B+樹同時支持隨機(jī)檢索和順序檢索,在實際中應(yīng)用比較多.

b.為什么說B+樹比B 樹更適合實際應(yīng)用中操作系統(tǒng)的文件索引和數(shù)據(jù)庫索引?

1) B+樹的磁盤讀寫代價更低

???? B+樹的內(nèi)部結(jié)點并沒有指向關(guān)鍵字具體信息的指針。因此其內(nèi)部結(jié)點相對B 樹更小。如果把所有同一內(nèi)部結(jié)點的關(guān)鍵字存放在同一盤塊中,那么盤塊所能容納的關(guān)鍵字?jǐn)?shù)量也越多。一次性讀入內(nèi)存中的需要查找的關(guān)鍵字也就越多。相對來說IO讀寫次數(shù)也就降低了。

??? 舉個例子,假設(shè)磁盤中的一個盤塊容納16bytes,而一個關(guān)鍵字2bytes,一個關(guān)鍵字具體信息指針2bytes。一棵9階B-tree(一個結(jié)點最多8個關(guān)鍵字)的內(nèi)部結(jié)點需要2個盤快。而B+樹內(nèi)部結(jié)點只需要1個盤快(全部關(guān)鍵字都在葉結(jié)點的緣故?)。當(dāng)需要把內(nèi)部結(jié)點讀入內(nèi)存中的時候,B-樹就比B+樹多一次盤塊查找時間(在磁盤中就是盤片旋轉(zhuǎn)的時間)(B+樹的內(nèi)結(jié)點只有索引的作用,何來“把內(nèi)部結(jié)點讀入內(nèi)存”...,對于B+樹找到葉結(jié)點就可以,另外B+樹可以順序查找)。

2) B+樹的查詢效率更加穩(wěn)定

???? 由于非終結(jié)點并不是最終指向文件內(nèi)容的結(jié)點,而只是葉子結(jié)點中關(guān)鍵字的索引。所以任何關(guān)鍵字的查找必須走一條從根結(jié)點到葉子結(jié)點的路。所有關(guān)鍵字查詢的路徑長度相同,導(dǎo)致每一個數(shù)據(jù)的查詢效率相當(dāng)

c.B+樹和B-樹最大的不同點是:

1).B-樹的關(guān)鍵字和記錄是放在一起的,葉子節(jié)點可以看作外部節(jié)點,不包含任何信息;B+樹的非葉子節(jié)點中只有關(guān)鍵字和指向下一個節(jié)點的索引,記錄只放在葉子節(jié)點中。

2).在B-樹中,越靠近根節(jié)點的記錄查找時間越快,只要找到關(guān)鍵字即可確定記錄的存在;而B+樹中每個記錄的查找時間基本是一樣的,都需要從根節(jié)點走到葉子節(jié)點,而且在葉子節(jié)點中還要再比較關(guān)鍵字。從這個角度看B-樹的性能好像要比B+樹好,而在實際應(yīng)用中卻是B+樹的性能要好些。因為B+樹的非葉子節(jié)點不存放實際的數(shù)據(jù),這樣每個節(jié)點可容納的元素個數(shù)比B-樹多,樹高比B-樹小,這樣帶來的好處是減少磁盤訪問次數(shù)。盡管B+樹找到一個記錄所需的比較次數(shù)要比B-樹多,但是一次磁盤訪問的時間相當(dāng)于成百上千次內(nèi)存比較的時間,因此實際中B+樹的性能可能還會好些,而且B+樹的葉子節(jié)點使用指針連接在一起,方便順序遍歷(例如查看一個目錄下的所有文件,一個表中的所有記錄等),這也是很多數(shù)據(jù)庫和文件系統(tǒng)使用B+樹的緣故。

?

二、B*樹(這個網(wǎng)上介紹的甚少,教科書我也沒有找到細(xì)致的介紹)

B*Tree是B+樹的變體,在B+Tree的非根和非葉子結(jié)點(內(nèi)結(jié)點)再增加指向兄弟的指針

B*樹定義了非葉子結(jié)點關(guān)鍵字個數(shù)至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2);

B+樹的分裂:當(dāng)一個結(jié)點滿時,分配一個新的結(jié)點,并將原結(jié)點中1/2的數(shù)據(jù)復(fù)制到新結(jié)點,最后在父結(jié)點中增加新結(jié)點的指針;B+樹的分裂只影響原結(jié)點和父結(jié)點,而不會影響兄弟結(jié)點,所以它不需要指向兄弟的指針;

B*樹的分裂:當(dāng)一個結(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+树与B*树小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。