kdtree學習記錄

2022-03-26 04:15:12 字數 2470 閱讀 7922

這篇文章當做乙個記錄啦qwq

參考:《k-d tree在資訊學競賽中的應用》(n+e, 2016-07-31)

一棵二叉樹(類似於bst二叉排序樹)來維護乙個k維空間。每個節點表示的是乙個k維空間的區域。

每個節點還儲存這乙個具體的點,以它的某個座標來劃分出兩個k維的空間,為這個節點的兒子所代表的區域。

我們姑且稱這個具體的點為代表點

啥意思呢?

struct

node ;

d[k]表示這個節點的代表點。這個節點儲存的資訊是乙個k維空間:

第1維 [mi[0], mx[0]];第2維 [mi[1], mx[1]];...;第k維 [mi[k], mx[k]]

l和r儲存的是按照代表點的某個座標來進行劃分的兩個k維的空間。

為了使得區間平均,我們通常採用按照每個座標輪流劃分。

比如:平面,那麼就是2維空間,依次按照 橫、縱、橫、縱、……劃分

3維空間,依次按照 橫、縱、高、橫、縱、高、……劃分

這樣可以使得劃分出來的空間盡量平均。

比如乙個平面的劃分方案如下,右圖為對應的k-d tree

劃分的過程中,我們需要找到乙個代表點,這個代表點通常選取按用來劃分的座標排序的中位數這個點。

stl有乙個方便的nth_element可以實現這個功能。

構造應該比較簡單?不放**啦。

然後是插入乙個點。

從根往下比較,跟bst類似,就能找到插入的位置了。

下面是乙個二維的示範,up裡面可以維護資訊,「。。。」裡面就是把資訊扔到k-d tree的過程。

以下**如果沒有特別說明,ls為t[x].l;rs為t[x].r(預define了)

inline void insert(int &x, int

d)

if(tmp ==t[x])

if(tmp.d[d] < t[x].d[d]) insert(ls, d^1

);

else insert(rs, d^1

); up(x);

}

然後你需要查詢乙個k維空間的值,就看是否完全包含/完全不包含如果以上兩類都可以直接回答。否則遞迴。

inline int query(int x, int x1, int y1, int x2, int

y2)

上面是乙個二維的例子,「。。。」裡面可以自行維護需要的東西。

然後我們發現如果k-d tree的乙個區間被插入了好多次那麼複雜度會退化(bst沒有帶平衡)

解決這個問題的辦法有兩個:

乙個比較暴力,就是我的k-d tree的節點個數達到閾值size的整數倍的時候,就把k-d tree的節點拎出來,重構k-d tree即可。

閾值3000-10000(大概

這是乙個二維的例子,t裡存的是拎出來的舊節點。

inline int rebuild(int l, int r, int

d)

還有乙個辦法,就是

這個複雜度是對的,就是寫起來還要多維護乙個size,我這麼懶的人肯定是留著坑以後再說啊。。

(不過前面乙個複雜度也是對的吧)

對於一些問題的估價:

比如我要詢問(x,y)到平面上哪個點歐幾里得距離最小啊之類的。

距離最小:乙個點離當前域的最小距離(在域內為0)

距離最大:乙個點離當前域的最大距離

常見估價:(可以理解)

那麼詢問(x,y)離哪個點xx距離最小的話。。

就是看看估價,優先訪問估價低的。如果最小可能距離都比當前答案大,就不用取管了。

複雜度o(logn)(隨機),o(根號n)(構造)

kdtree估價例題:

反正。。挺優秀的。

k-d tree還可以代替很多類似什麼三維偏序啊之類的為題

k維k-d tree的查詢複雜度約為o(n^(1-1/k))

那麼可持久化樹套樹(三維空間的求值)就能在o(n^(5/3))的時間內求出來啊!

論寫優秀暴力的重要性。

好了大概講這麼多(去睡覺啦qwq

有空再更 

KD tree學習筆記

如上圖 a 我們先對待識別的物體的影象進行sift特徵點的檢測和特徵點的描述,然後得到了sift特徵點集合。接下來生成物體目標描述要做的就是對特徵點集合進行資料組織,形成一種特殊的表示,其作用是為了加速特徵點匹配的過程。所謂的特徵點匹配本質上是乙個通過距離函式 例如歐式距離 在高維向量之間進行相似性...

學習筆記 kd tree

kd tree用來維護n維空間中的點的一種資料結構。支援插入 刪除 查詢k臨近 包括最遠點對和最近點對 kd tree本質是一顆二叉樹。每一層選擇乙個維度,找到當前維度的中點 讓樹盡量平衡 經過這個點,在當前維度切割,分成左右兩個子樹。通常維度的選擇是順次迴圈的,較易實現。更優的方法是找到方差最大的...

KD Tree學習小記

最近進入了賽後養生模式,感覺身體被掏空,還要補課 學點養生資料結構。正交區域的精確定義我不知道 而一般來說,乙個空間內查詢乙個特定長方體裡面的資訊,乙個平面內查詢某個長方形的查詢都可以稱作正交區域查詢。而二維平面的不規則的區域查詢我們可以轉化為多個正交區域查詢的並。而許多資訊的查詢是可以轉化為正交區...