1. 程式人生 > >關於T-tree和R-tree索引的學習

關於T-tree和R-tree索引的學習

今天上午去考mysql ocp時有一道題是關於T-tree和R-tree的題目,當時腦袋懵了,沒有見過T-tree索引和R-tree索引呀!

下來之後在網上收了一下,把相關知識點整理如下:

一、T-tree

1.T樹相關概念
     T樹具有以下特點:

①左子樹與右子樹之差不超過1

②在一個儲存節點可以儲存多個鍵值,它的最左與最右鍵值分別為這個節點的最小與最大鍵值,它的左子樹僅僅包含那些鍵值小於或等於最小鍵值的一記錄,同理右子樹只包括那些鍵值大於或等於最大鍵值的記錄

③同時擁有左右子樹的節點被稱為內部節點,只擁有一個子樹的節點被稱為半葉一,沒有子樹的節點被稱為葉子

④為了保持空間的利用率,每一個內部節點都需要包含一個最小數目的鍵值。由此可知T樹是一個每個結點含有多個關鍵字的平衡二叉樹,每個節點內的關鍵字有序排列,左子樹都要比根節點關鍵字小,右子樹都要比根節點關鍵字大。
在上述T樹結點結構中,包含如下資訊:
(1) balance(平衡因子),其絕對值不大於1,balance =右子樹高度-左子樹高度;
(2) Left_child_ptr和Right_child_ptr分別表示當前結點的左子樹和右子樹指標;
(3) Max_Item表示結點中所能容納的鍵值的最大數;
(4)Key[0]至K[Max_Item-1]為結點記憶體放的關鍵字;
(5)nItem是當前節點實際儲存的關鍵字個數。

2.T樹索引的操作
      用T樹作為索引方式主要完成三個工作:查詢,插入,刪除。其中插入和刪除都是以查詢為基礎。下面分別介紹三種操作的流程。
(1)T樹的查詢類似於二叉樹,不同之處主要在於每一結點上的比較不是針對結點中的各個元素值,而是首先檢查所要查詢的目標鍵值是否包含在當前結點的最左鍵值和最右鍵值所確定的範圍內,如果是的話,則在當前結點的鍵值列表中使用二分法進行查詢;如果目標鍵值小於當前結點的最左鍵值,則類似地搜尋當前結點的左孩子結點;如果目標鍵值大於當前結點的最右鍵值,則類似地搜尋當前結點的右孩子結點。
(2)T樹的插入是以查詢為基礎,應用查詢操作定位目標鍵值插入位置,並記下查詢過程所遇到的最後結點。如果查詢成功,判斷此結點中是否有足夠的儲存空間。如果有,則將目標鍵值插入結點中;否則將目標鍵值插入此結點,然後將結點中的最左鍵值插入到它的左子樹中(此時是遞迴插入操作),之後結束;否則分配新結點,並插入目標鍵值;然後根據目標鍵值與結點的最大最小鍵值之間的關係,將新分配的結點連結為結點的左孩子或右孩子;對樹進行檢查,判斷T樹的平衡因子是否滿足條件,如果平衡因子不滿足則執行旋轉操作。

(3)T樹的刪除操作也是以查詢為基礎,應用查詢操作定位目標鍵值。如果查詢失敗,則結束;否則令N為目標鍵值所在的結點,並從結點N中刪除目標鍵值;刪除節點後,如果結點N為空,則刪除結點N,並對樹的平衡因子進行檢查,判斷是否需要執行旋轉操作;如果結點N中的鍵值數量少於最小值,則根據N的平衡因子決定從結點N的左子樹中移出最大的鍵值或者右子樹中移出最小值來填充。 

3.T樹索引實現關鍵技術
     實現T樹索引即要實現T樹的查詢,插入和刪除。其中又以查詢為基礎,對T樹的維護也就是T樹的旋轉為關鍵。當由於插入或刪除鍵值導致樹的失衡,則要進行T樹的旋轉。使之重新達到平衡。
     在插入情況下,需要依次對所有沿著從新建立結點到根結點路徑中的結點進行檢查,直到出現如下兩種情況之一時中止:某個被檢查結點的兩個子樹高度相等,此時不需要執行旋轉操作;某個被檢查結點的兩個子樹的高度之差大於1,此時對該結點僅需執行一次旋轉操作即可。
     在刪除情況下,類似地需要依次對所有沿著從待刪除結點的父結點到根結點路徑中的結點進行檢查,在檢查過程中當發現某個結點的左右子樹高度之差越界時,需要執行一次旋轉操作。與插入操作不同的是,執行完旋轉操作之後,檢查過程不能中止,而是必須一直執行到檢查完根結點。
     由此可以看出,對於插入操作,最多隻需要一次旋轉操作即可使T樹恢復到平衡狀態;而對於刪除操作則可能會引起向上的連鎖反應,使高層結點發生旋轉,因而可能需要進行多次旋轉操作。
     為了對T樹進行平衡,需要進行旋轉操作,旋轉是T樹中最關鍵也是最難的的操作,下面介紹T樹旋轉的技術。旋轉可分為四種情況:由左孩子的左子樹的插入(或者刪除)引起的旋轉記為LL旋轉,類似有LR,RR及RL旋轉。插入時的情況與刪除類似。

二、R-tree

1、R-Tree資料結構

R-Tree是一種空間索引資料結構,下面做簡要介紹:

1R-Treen 叉樹,n稱為R-Tree的扇(fan)。

2)每個結點對應一個矩形。

3)葉子結點上包含了小於等於n 的物件,其對應的矩為所有物件的外包矩形。

4)非葉結點的矩形為所有子結點矩形的外包矩形。

R-Tree的定義很寬泛,同一套資料構造R-Tree,不同方可以得到差別很大的結構。什麼樣的結構比較優呢?有兩標準:

1)位置上相鄰的結點儘量在樹中聚集為一個父結點。

2)同一層中各兄弟結點相交部分比例儘量小。

R樹是一種用於處理多維資料的資料結構,用來訪問二維或者更高維區域物件組成的空間資料.R樹是一棵平衡樹。樹上有兩類結點:葉子結點和非葉子結點。每一個結點由若干個索引項構成。對於葉子結點,索引項形如(IndexObj_ID)。其中,Index表示包圍空間資料物件的最小外接矩形MBRObj_ID標識一個空間資料物件。對於一個非葉子結點,它的索引項形如(IndexChild_Pointer) Child_Pointer 指向該結點的子結點。Index仍指一個矩形區域,該矩形區域包圍了子結點上所有索引項MBR的最小矩形區域。

2、R-Tree空間索引演算法

1 R-Tree

多維索引技術的歷史可以追溯到20世紀70年代中期。就在那個時候,諸如Cell演算法、四叉樹和k-d樹等各種索引技術紛紛問世,但它們的效果都不盡人意。在GISCAD系統對空間索引技術的需求推動下,Guttman1984年提出了R樹索引結構,發表了《R:一種空間查詢的動態索引結構》,它是一種高度平衡的樹,由中間節點和頁節點組成,實際資料物件的最小外接矩形儲存在頁節點中,中間節點通過聚集其低層節點的外接矩形形成,包含所有這些外接矩形。其後,人們在此基礎上針對不同空間運算提出了不同改進,才形成了一個繁榮的索引樹族,是目前流行的空間索引。

2 R+

Guttman的工作的基礎上,許多R樹的變種被開發出來, Sellis等提出了R+樹,R+樹與R樹類似,主要區別在於R+樹中兄弟結點對應的空間區域無重疊,這樣劃分空間消除了R樹因允許結點間的重疊而產生的“死區域”(一個結點內不含本結點資料的空白區域),減少了無效查詢數,從而大大提高空間索引的效率,但對於插入、刪除空間物件的操作,則由於操作要保證空間區域無重疊而效率降低。同時R+樹對跨區域的空間物體的資料的儲存是有冗餘的,而且隨著資料庫中資料的增多,冗餘資訊會不斷增長。Greene也提出了他的R樹的變種。

3 R*

1990年,BeckmanKriegel提出了最佳動態R樹的變種——R*樹。R*樹和R樹一樣允許矩形的重疊,但在構造演算法R*樹不僅考慮了索引空間的“面積”,而且還考慮了索引空間的重疊。該方法對結點的插入、分裂演算法進行了改進,並採用“強制重新插入”的方法使樹的結構得到優化。但R*樹演算法仍然不能有效地降低空間的重疊程度,尤其是在資料量較大、空間維數增加時表現的更為明顯。R*樹無法處理維數高於20的情況。

4 QR

QR樹利用四叉樹將空間劃分成一些子空間,在各子空間內使用許多R樹索引,從而改良索引空間的重疊。QR樹結合了四叉樹與R樹的優勢,是二者的綜合應用。實驗證明:與R樹相比,QR樹以略大(有時甚至略小)的空間開銷代價,換取了更高的效能,且索引目標數越多,QR樹的整體效能越好。

5 SS

SSR*樹進行了改進,通過以下措施提高了最鄰近查詢的效能:用最小邊界圓代替最小邊界矩形表示區域的形狀,增強了最鄰近查詢的效能,減少將近一半儲存空間;SS樹改進了R*樹的強制重插機制。當維數增加到5是,R樹及其變種中的邊界矩形的重疊將達到90%,因此在高維情況(≧5)下,其效能將變的很差,甚至不如順序掃描。

6 X

X樹是線性陣列和層狀的R樹的雜合體,通過引入超級結點,大大地減少了最小邊界矩形之間的重疊,提高了查詢效率。X樹用邊界圓進行索引,邊界矩形的直徑(對角線)比邊界圓大,SS樹將點分到小直徑區域。由於區域的直徑對最鄰近查詢效能的影響較大,因此SS樹的最鄰近查詢效能優於R*樹;邊界矩形的平均容積比邊界圓小,R*樹將點分到小容積區域;由於大的容積會產生較多的覆蓋,因此邊界矩形在容積方面要優於邊界圓。SR樹既採用了最小邊界圓(MBS),也採用了最小邊界矩形(MBR),相對於SS樹,減小了區域的面積,提高了區域之間的分離性,相對於R*樹,提高了鄰近查詢的效能。