一、B樹:
(1)、每個(gè)節(jié)點(diǎn)存儲(chǔ)多個(gè)元素
(2)、摒棄二叉樹結(jié)構(gòu),采用多叉樹
它是一種多路搜索樹,它的每個(gè)節(jié)點(diǎn)可以擁有多余兩個(gè)的孩子節(jié)點(diǎn),M路的B樹最多可以擁有M路孩子節(jié)點(diǎn)。這樣設(shè)計(jì)主要是為了降低它的高度。但也不能無限多路,那樣就成了一個(gè)一維數(shù)組了,一般用在文件索引的地方比較多。
那么為什么文件系統(tǒng)不用紅黑樹之類的呢?
如果用紅黑樹存儲(chǔ),增加或者減少文件時(shí)紅黑樹需要做旋轉(zhuǎn)之類的操作來保持平衡,那么就需要把所有節(jié)點(diǎn)都加載到內(nèi)存中,查找時(shí)也需要全部加載到內(nèi)存,所以不適合。然而用B樹的多路存儲(chǔ)就沒有這個(gè)壓力,并且查找的時(shí)候只需要一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)的往下查找就可以了。
二、B+樹
B+樹是在B樹的基礎(chǔ)上改造的,它的數(shù)據(jù)都在葉子節(jié)點(diǎn)上,同時(shí),葉子節(jié)點(diǎn)之間還加了指針形成鏈表。
B+樹在數(shù)據(jù)庫的索引中用得比較多,如果需要查詢多條數(shù)據(jù),B樹需要做局部的中序遍歷,可能要跨層訪問。而B+樹由于所有數(shù)據(jù)都在葉子結(jié)點(diǎn),不用跨層,同時(shí)由于有鏈表結(jié)構(gòu),只需要找到首尾,通過鏈表就能把所有數(shù)據(jù)取出來了。
這也是為什么沒有在數(shù)據(jù)庫中用hash的原因,查找一個(gè)數(shù)hash更快,但是多個(gè)數(shù)字的時(shí)候就沒有B+數(shù)快了。