R-樹相關技術

空間索引是對存儲在介質上的數據位置信息的描述,用來提高系統對數據獲取的效率。GIS涉及的各種海量複雜數據存儲於外存,如果對磁盤上的數據的位置不加以記錄和組織,每查詢一個數據項都要掃描整個數據文件,則這種訪問磁盤的代價將嚴重影響系統的效率。因此索引的建立與處理至關重要。此外GIS所表現的地理數據多維性使得傳統的B樹索引不再適合,因爲B樹所針對的字符、數字等傳統數據類型是在一個良序集之中,即都是在一個維度上,集合中任給兩個元素,都可以在這個維度上確定其關係只可能是大於、小於、等於三種,若對多個字段進行索引,必須指定各個字段的優先級形成一個組合字段,而地理數據的多維性,在任何方向上並不存在優先級問題,因此B樹並不能對地理數據進行有效的索引,所以需要研究特殊的能適應多維特性的空間索引方式。

1984年Guttman發表了《R樹:一種空間查詢的動態索引結構》[1]一種高度平衡樹,由中間節點和葉節點組成,實際數據對象的最小外接矩形存儲在葉節點中,中間節點通過聚集其低層節點的外接矩形形成,包含所有這些外接矩形。其後,人們在此基礎上針對不同空間運算提出了不同改進,才形成了一個繁榮的索引樹族,是目前流行的空間索引。

R樹是一種採用對象界定技術的高度平衡樹,是B 樹在 k 維空間上的自然擴展,它將空間對象按範圍劃分,每個結點都對應一個區域和一個磁盤頁,非葉結點的磁盤頁中存儲其所有子結點的區域範圍,非葉結點的所有子結點的區域都落在它的區域範圍之內;葉結點的磁盤頁中存儲其區域範圍之內的所有空間對象的外接矩形。每個結點所能擁有的子結點數目有上、下限,下限保證對磁盤空間的有效利用,上限保證每個結點對應一個磁盤頁,當插入新的結點導致某結點要求的空間大於一個磁盤頁時,該結點一分爲二。R樹是一種動態索引結構,即:它的查詢可與插入或刪除同時進行,而且不需要定期地對樹結構進行重新組織。

R-Tree數據結構

(1)R-Tree是n叉樹,n稱爲R-Tree的扇(fan)

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

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

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

R-tree具有以下性質:

(1)除根節點外,每個節點的項數介於最小項數m和最大項數M之間;

(2)根節點至少有兩個孩子,除非它是葉子節點;

(3)所有葉子節點位於同一層;

(4)同一節點中項,其排列沒有順序要求

R-Tree的的評價標準爲:

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

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

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

 

 

R-Tree算法描述

(I)插入算法

     基本思想:找到合適的葉子節點,插入之,若需分裂,則由下至上調整MBR值。算法如下:

     I1: 調用ChooseLeaf來選擇一個合適的葉子節點L以容納需插入項E

     I2: 若L中還能容納E,則加入之;否則調用SplitNode來獲取兩個節點L和LL,它們包含E和L中原有的所有項

     I3: 調用AdjustTree,傳遞參數L,LL(若產生了分裂)

     I4: 若節點分裂向上傳播導致根節點的分裂,則生成新的根節點。

算法ChooseLeaf: 選擇一個合適的葉子節點以放置新項E。合適的評價標準是插入E後的節點MBR面積增加度最少。

     C1: 設N指向根結點root

     C2: 若N是葉子節點,返回N   

     C3: 若N不是葉子節點,讓F表示N中的一項,該項F容納E後,則N在面積上只需作面積最小擴展

     C4: 設N指向葉子節點,則返回C2.

算法AdjustTree: 從葉子節點向根節點進行調整

     A1: 設N=L,若L進行了分裂,則設NN=LL

     A2: 若N爲根節點,則返回

     A3: 設P爲N的雙親節點,EN爲節點P中指向N的項,調整項EN的MBR

     A4: 若NN存在,創建一個新項ENN,使其指向NN,同時計算出ENN的MBR.將ENN加入P,若不能容納則調用SplitNode產生節點P和PP,包含ENN和原來P中所有項

     A5: 設N=P, NN=PP, 轉至A2.

算法SplitNode: 將M+1項分成兩組,將它們加入到兩個新節點。

判斷節點分裂好壞的一個標準爲:分裂後,兩個新節點對應的MBR的面積之和最小。下圖展示了節點分裂的一個例子。

一個時間複雜度爲二次(Quadratic)的分裂算法如下:

      S1: 調用PickSeeds選出兩項,將它們分別作爲兩組的第一個元素;

      S2: 若所有項都已分配完,則返回;若一組中的項如此之少,以至於將剩下的所有項添至其中才能滿足項數達到m的要求,則進行分配且返回;

      S3: 調用PickNext選擇下一項,將其分配到某組中,該組在容納該項後,MBR只需作最小面積擴展,轉至S2.

算法PickSeeds:

      PS1: 對每一項E1和E2,計算d=area(E1和E2合併之後的MBR) – area(E1) – area(E2);

      PS2:選擇d值最大的一對項。

算法PickNext:

      PN1:對每一項E,計算d1=<將E加入組1後MBR增加的面積>,同理計算d2;

      PN2:選出d1和d2值差距最大的項。

(2)R-tree刪除算法

算法DeleteEntry E)從R-tree中刪除項E

D1:調用FindLeaf來尋找存放E的葉子結點L ;若沒有找到則停止;

D2:從L中刪去E;

D3:調用CondenseTree,傳遞參數L :

D4::若根結點只有一個孩子,則讓該孩子結點成爲新根節點。

算法FindLeaf (NODE  T,  Entry  E )

FL1:若T不是葉子結點,則對於T中每一個與E相重疊的項,將該項所指的結點作參數,遞歸調用FindLeaf 

FL2:若T是葉子結點,則檢查T中是否有與E相等的項,若有,則返回T

算法CondenseTree :傳遞參數結點L ,該結點進行了刪除項的操作

CT1:設N=L ,將存儲被刪結點的集合Q置爲空;

CT2:若N是根,轉至CT6;否則,設P爲N的父節點,EN爲P中指向N的項;

CT3:若N中的項數小於m,在P中刪除EN,並把N加入到集合Q中;

CT4:若N沒有被刪除,調整EN的MBR;

CT5:設N=P,轉向CT2;

CT6:重新插入集合Q中所有節點中的所有項,對於葉子節點中的項仍插入到葉子節點

中,但對於中間節點的項需要插入到其原來所在的那一層。

R樹主要變體

R樹最初由Guttman於1984年提出,其後,人們在此基礎上針對不同的空間操作需求提出了各種改進方案。經過二十多年的發展,不斷產生的R樹變體逐漸形成了一個枝繁葉茂的空間索引R樹家族。

1 R+樹[2]

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

2 R*樹[3]

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

發佈了64 篇原創文章 · 獲贊 64 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章