這篇部落格分析了**indexing metric spaces with m-tree(後文簡稱m-tree或m樹),我將從以下幾個方面介紹它:
背景m-tree的結構
m-tree的插入
m-tree的**
如何使用m-tree進行range搜尋
m-tree的**
m-tree被設計為了解決最近鄰搜尋問題(nn)或範圍搜尋問題。以生活中的例子作為說明,最近鄰搜尋問題(nn)指的是,給定乙個地理位置,在資料集中找到距離給定位置最近的目標(比如最近的飯店,最近的銀行等等)。
範圍搜尋問題指的是,給定乙個地理位置和搜尋範圍,在資料集中找到距離小於範圍的所有目標。
m-tree使用圓形(二維情況)覆蓋空間區域。每個圓涵蓋了一部分資料所在的區域。對於查詢目標,m-tree確定哪個圓和目標區域相交,若相交,則繼續探測對應的圓。若不相交則濾除對應的圓,這意味著該圓涵蓋的資料都不需要進行判斷,減少了需要探測的資料量。本質上,m-tree從上到下就是乙個大圓包含小圓的結構。
在這一節分析如果構建m-tree。m-tree使用圓來劃分區域,因此每個結點存在乙個圓心和乙個半徑。m-tree的分為兩類結點:內結點,葉結點。每個結點儲存0~m個孩子結點。每個結點的多個屬性我們用乙個entry類來組織,不同型別的結點entry類是不同的:
內節點:它是包含了 o
ro_r
or是結點圓心值,d(o
j,p(
oj))
d\left(o_, p\left(o_\right)\right)
d(oj,
p(oj
))是當前結點圓心值到父節點圓心值的距離,r(o
r)r(o_r)
r(or)
是圓的半徑,ptr
(t(o
r))ptr \left(t\left(o_\right)\right)
ptr(t(
or)
)是指向孩子結點的指標。
葉結點: o
jo_j
oj是目標的值,d(o
j,p(
oj))
d\left(o_, p\left(o_\right)\right)
d(oj,
p(oj
))是當前結點值和父節點值的距離,oid
(oj)
oid(o_j)
oid(oj
)是葉節點儲存的資料在資料集中的id或指標,
在這一節描述m-tree的插入過程。插入過程需要將乙個資料插入到對應的葉節點當中(同樣地,葉節點只能存放0-m個資料)。
從根節點開始,找到插入資料對應的葉節點有以下關鍵思路:
找到正確的孩子結點(最小範圍擴大):
葉節點開始**
對於乙個滿的結點,我們需要將它**成兩個結點。然後
下面我以下面的**舉例分析
1
void pm_tree::
split
(m_node_st *
* cur_node_ptr_address_, m_node_st *
* insert_node_address_)237
else
53else56}
57}58
基於上述m-tree,本節分析如何進行range搜尋。
range搜尋的關鍵思路是:找到和查詢資料相交的圓
1
void pm_tree::
subrange_search
(datametric& highdata, vector<
double
>
& highquery, m_node_st *
* cur_node_address_, vector<
double
>
& q_feature_val_,
double search_range_, vector
double
,int
>>
& res_vec_,
double
&dist_parent_q_, vector<
double
>
& dist_q_pivot_)217
}18}19
}20else30}
31}32}
33}
很早以前寫的**,大致上的pm-tree是沒有問題的。在程式設計上存在血多瑕疵,希望大家多多指點 一文了解Flink State Backends
當我們使用flink進行流式計算時,通常會產生各種形式的中間結果,我們稱之為state。有狀態產生,就必然涉及到狀態的儲存,那麼flink中定義了哪些形式的狀態儲存呢,下面一一給大家介紹一下。顧名思義,memorystatebackend狀態後端是將狀態資料以object的形式存放於j a heap...
一文了解Perl語言
perl,一種功能豐富的計算機程式語言,執行在超過100種計算機平台上,適用廣泛,從大型機到便攜裝置,從快速原型建立到大規模可擴充套件開發。1 perl最初的設計者為拉里 沃爾 larry wall 於1987年12月18日發表。現在的版本為perl 6,於2015年12月25日更新。perl借取了...
一文了解Perl語言
perl,一種功能豐富的計算機程式語言,執行在超過100種計算機平台上,適用廣泛,從大型機到便攜裝置,從快速原型建立到大規模可擴充套件開發。1 perl最初的設計者為拉里 沃爾 larry wall 於1987年12月18日發表。現在的版本為perl 6,於2015年12月25日更新。perl借取了...