R Tree學習筆記

2021-07-05 02:25:07 字數 4319 閱讀 7572

空間資料物件(spatial data objects)通常是乙個在多維空間中區域,不能僅用座標點位置很好的表示。

例如,在地圖應用中,代表乙個國家的空間資料物件,就是乙個在二維空間中的區域。

對於空間資料的常用操作就是查詢乙個區域中的所有物件,所以根據空間資料物件所表示的區域範圍,高效的獲取該區域中的空間資料物件,是很重要的。

傳統的一維資料庫索引並不適合多維的空間搜尋。如基於hash的索引結構適用於精確匹配查詢值的搜尋,而空間資料搜尋通常是範圍查詢,而b-tress這樣的一維排序鍵值所以又難以滿足對多維資料索引。

乙個空間資料庫由一系列對應空間物件的tuple組成,而每乙個tuple具有乙個唯一標示(tuple identifier,簡稱tupleid吧),資料庫可以通過這個唯一標示獲取到該tuple。

r-tree所做的就是將這些tupleid索引起來。

每乙個葉子節點包含一組索引記錄(index record,後文稱之為entry)。

每個entry的格式如下:

(mbr,tupleid)
其中,mbr(minimum bounding region)表示可以框住tupleid所對應的空間資料物件的最小n維矩形。 mb

r=(m

br0,

mbr1

,...

,mbr

n−1)

其中n為mb

r 所在空間維度,mb

ri為該mbr

在第i個維度上的值,通常是乙個閉區間範圍[a,b]

tupleid為乙個指向資料物件的指標。

非葉子節點的包含的entry格式如下:

(mbr,child-pointer)
其中,child-pointer為指向其子節點的指標。而mbr則是乙個可以框住其child-pointer對應的子節點上所有entry包含的mbr的最小n維矩形。

對於乙個基於磁碟儲存的r-tree索引,其每乙個節點對應乙個磁碟頁(page)。為了節省磁碟io,同時盡可能高效的利用磁碟空間,

m為乙個節點所能包含的entry的最大值,m為乙個節點包含entry的最小值,有m≤

m2。r-tree具有以下屬性:

1. 每個節點的包含的entry的個數範圍[m,m],除非該節點是根節點

2. 對於葉子節點中每一條entry(mbr,tupleid),其中mbr表示能框住其tupleid所對應的空間物件的最小n維矩形。

3. 對於非葉子節點中的每一條entry(mbr,child-pointer),其中mbr表示能框住其子節點中所有entry對應的空間物件的mbr的最小n維矩形。

4. 根節點由至少兩個子節點,除非該節點同時也是葉子節點

5. 所有葉子節點出現在同一層。

包含n條索引記錄的r-tree:

search在根節點為t的r-tree中搜尋乙個mbr為s的空間資料物件

如果該節點是葉子節點,檢視該節點上是否存在ei與s重合,如果有則說明該ei對應的entry為需要檢索的記錄。

insert為新的空間資料物件(tuple)插入索引記錄(index record)

通過chooseleaf過程,查詢將要插入entry的葉子節點

如果葉節點有空間則直接插入,否則呼叫splitnode過程進行節點**

呼叫ajusttree過程,向上層傳播節點的變化,包括可能產生的節點**與新entry加入引起的ei的變化

如果節點變化的傳播最終導致根節點**,則建立乙個新的根節點作為原根節點**後的父節點,即r-tree向上生長了一層

chooseleaf選擇乙個葉子節點放置索引記錄f

從根節點n開始查詢

如果n為葉子節點,則直接返回節點n

如果n不是葉子節點,則分別檢視節點n中所有的entry,選擇包含fi後擴充套件量最小的entry,如果擴充套件量相同,則選擇ei最小的e

以ep所指向的子節點為為根,繼續步驟2

adjusttree從葉子節點l向上傳播mbr值的變化,以及可能發生的節點**

令n=l,如果l發生了**,則令nn為**後的另乙個節點

如果n為根節點,則停止。(如果r-tree只有一層,根節點也是葉子節點,那麼mbr的改變無需向上傳播)

找到節點n的父節點p,並調整n在p中的對應entry的mbr值,使之可以包含節點n中所有的ei

如果nn存在,則建立乙個新的entry(en

n,en

np),如果p中有空間,則將其插入p中,否則呼叫splitnode過程,產生節點p與pp

令n=p,如果p節點發生**,則靈nn=pp,重複2(逐層向上傳播)

delete刪除索引記錄e

呼叫findleaf以定位包含索引記錄e的葉子節點l,如果沒有沒有找到則停止

從l中刪除e

呼叫condensetree從l向上傳播節點的變化

如果根節點只剩乙個子節點,則令該子節點成為新的根節點,即r-tree減少一層

findleaf在r-tree t中查詢包含entry f的葉子節點l

如果t不是葉子節點,則檢視節點中每乙個entry,對每乙個與f重合的entry,以ep指向的子節點為根,呼叫findleaf過程,直到f被找到或者所有的entry都檢查過但仍為找到f

如果t是葉子節點,則檢視t中是否包含與f相符合的entry,如果有則返回t

condensetree給定乙個被刪除了乙個entry的葉節點l,如果剩下的entry少於m,則要進行節點合併,同時向上傳播ei的變化。

令n=l,同時集合q用來存放被刪除的節點

如果n不是根節點,則查詢n的父節點p,以及n在p中對應的entryen

;如果n是根節點,則要開始節點重插過程,見步驟6

如果節點n中剩下的entry數量小於m,則將en

從p中刪除,並將n加入集合q

如果節點n並沒有被刪除,則調整en

使其框住所有n中所有ei

令n=p,重複步驟2;即逐層向上傳播變化

集合q中的節點所包含的entry重新被插入r-tree中,來自葉子節點的entry直接呼叫insert過程即可,而來自非葉子結點的entry需要被插入對應高度層的節點中。

當乙個節點上包含的entry數量超過m時,就會觸發節點的**。節點**後,應當盡量避免乙個查詢需要訪問多個節點的情況,而決定乙個節點在查詢中是否被訪問的原因是該節點上的entry的mbr是否與查詢區域向重合,所以應當是**後節點其對應的mbr盡可能的小。

窮舉演算法

將m+1個entry分為兩組的所有情況窮舉,並計算出所有情況的mbr值。顯然這一方法複雜度過高。

平方複雜度演算法

呼叫pickseeds過程,選取兩個組中的第乙個entry。

如果所有的entry已經被分配,那麼過程結束;如果有乙個組g中的entry數量x不足m,且剩下的尚未分組的entry數量為m-x,則將這m-x個entry都分給組g,並停止過程

呼叫picknext過程,在剩下的尚未分組的entry中選擇乙個entry進行分組;將其加入包含該entry後,mbr擴充套件最小的組

pickseeds在所有entry中,選擇最不應該分為一組的兩個entry,作為兩個組的第乙個entry

對於每一對entry e1

、e2,計算歸為一組後的無效性d=

area

(j)−

area

(e1i

)−ar

ea(e

2i) ,其中,j為包含e1

、e2的矩形。

選擇d最大的一組

picknext首先選擇歸為不同組差別最大的entry進行分組(因為最後的entry很可能會根據補償m的原則,不考慮分組造成的mbr擴充套件而直接進行分組)

計算所有entry歸入不同組g1和g2後,mbr增長量d1

、d2選擇d1

、d2差別最大的entry

R TREE學習借鑑之路

在trajectory中,r tree是基礎,看了 不是特別明白,看下部落格,進一步理解 1.比較清楚講解的link然後,在內部裡面,閱讀聯想b tree提到的僅包含key 在non leaf 節點的舉例,前後聯想r tree,融會貫通 2.實現部分,忘了typedef struct用法,順便複習一...

GIS演算法 4 空間檢索RTree原理

rtree主要是為了快速進行空間檢索。維基百科關於它的釋義如下 r樹是用來做空間資料儲存的樹狀資料結構。例如給地理位置,矩形和多邊形這類多維資料建立索引。r樹是由antonin guttman於1984年提出的。人們隨後發現它在理論和應用方面都非常實用。在現實生活中,r樹可以用來儲存地圖上的空間資訊...

高階資料結構之R樹(R tree)

r樹 r tree 是一種將 樹擴充套件到多維情況下得到的資料結構,它最初由antonin guttman於1984年提出。樹的結點中會儲存乙個鍵的集合,這些鍵把線分成片段,沿著那條線的點僅屬於乙個片段。因此,樹使得我們可以很容易地找到點。如果把沿線各處的點表示成 樹結點,我們就能夠確定點所屬唯一子...