一文了解M Tree(M樹)

2021-10-11 00:01:35 字數 2447 閱讀 5513

這篇部落格分析了**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借取了...