1. 程式人生 > >硬碟儲存B-+樹及地圖搜尋R樹

硬碟儲存B-+樹及地圖搜尋R樹

硬碟儲存B-+樹及地圖搜尋R樹
B-樹
強調!B-樹,即為B樹。因為B樹的原英文名稱為B-tree,而國內很多人喜歡把B-tree譯作B-樹,其實,這是個非常不好的直譯,很容易讓人產生誤解。如人們可能會以為B-樹是一種樹,而B樹又是一種一種樹。而事實上是,B-tree就是指的B樹。特此說明。
我們知道,B 樹是為了磁碟或其它儲存裝置而設計的一種多叉(下面你會看到,相對於二叉,B樹每個內結點有多個分支,即多叉)平衡查詢樹。許多資料庫系統都一般使用B樹或者B樹的各種變形結構,如下文即將要介紹的B+樹,B*樹來儲存資訊。B樹的結點可以有許多子女。一棵含n個結點的B樹的高度也為O(lgn),B樹可以在O(logn)時間內,實現各種如插入(insert),刪除(delete)等動態集合操作。
如下圖所示,即是一棵B樹,一棵關鍵字為英語中子音字母的B樹,現在要從樹種查詢字母R(包含n[x]個關鍵字的內結點x,x有n[x]+1個子女(也就是說,一個內結點x若含有n[x]個關鍵字,那麼x將含有n[x]+1個子女)。所有的葉結點都處於相同的深度,帶陰影的結點為查詢字母R時要檢查的結點):
在這裡插入圖片描述

B±tree:是應檔案系統所需而產生的一種B-tree的變形樹。
m階的B+樹和m階的B樹的異同點:
所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大的順序連結。(而B 樹的葉子節點並沒有包括全部需要查詢的資訊),所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最(或最大)關鍵字。
在這裡插入圖片描述
B-tree
B-tree是B±tree的變體,在B+樹的基礎上(所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標),B**樹中非根和非葉子結點再增加指向兄弟的指標;B* 樹定義了非葉子結點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3(代替B+樹的1/2)。右圖是一個簡單例項:
B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的資料複製到新結點,最後在父結點中增加新結點的指標;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指標。
B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分資料移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的資料到新結點,最後在父結點增加新結點的指標。
所以,B樹分配新結點的概率比B+樹要低,空間使用率更高;
在這裡插入圖片描述


R樹
R樹是B樹在高維空間的擴充套件,是一棵平衡樹。每個R樹的葉子結點包含了多個指向不同資料的指標,這些資料可以是存放在硬碟中的,也可以是存在記憶體中。根據R樹的這種資料結構,當我們需要進行一個高維空間查詢時,我們只需要遍歷少數幾個葉子結點所包含的指標,檢視這些指標指向的資料是否滿足要求即可。這種方式使我們不必遍歷所有資料即可獲得答案,效率顯著提高。
如右圖所示,首先我們假設所有資料都是二維空間下的點,圖中僅僅標誌了R8區域中的資料,也就是那個shape of data object。別把那一塊不規則圖形看成一個數據,我們把它看作是多個數據圍成的一個區域。為了實現R樹結構,我們用一個最小邊界矩形恰好框住這個不規則區域,這樣,我們就構造出了一個區域:R8。R8的特點很明顯,就是正正好好框住所有在此區域中的資料。其他實線包圍住的區域,如R9,R10,R12等都是同樣的道理。這樣一來,我們一共得到了12個最最基本的最小矩形。這些矩形都將被儲存在子結點中。
下一步操作就是進行高一層次的處理。我們發現R8,R9,R10三個矩形距離最為靠近,因此就可以用一個更大的矩形R3恰好框住這3個矩形。同樣道理,R15,R16被R6恰好框住,R11,R12被R4恰好框住,等等。所有最基本的最小邊界矩形被框入更大的矩形中之後,再次迭代,用更大的框去框住這些矩形。
這就是這個資料結構的特徵。用地圖的例子來解釋,就是所有的資料都是餐廳所對應的地點,先把相鄰的餐廳劃分到同一塊區域,劃分好所有餐廳之後,再把鄰近的區域劃分到更大的區域,劃分完畢後再次進行更高層次的劃分,直到劃分到只剩下兩個最大的區域為止。要查詢的時候就方便了。
在這裡插入圖片描述