kd樹在演算法競賽中主要用來做各種各樣的平面區域查詢,包含則累加直接返回,相交則繼續遞迴,相離的沒有任何貢獻也直接返回。可以處理圓,三角形,矩形等判斷起來相對容易的平面區域內的符合加法性質的操作。
比如查詢平面內歐幾里得距離最近的點的距離。
kdtree其實有點像搜尋,暴力+剪枝。
它是通過橫一刀,豎一刀,橫一刀再豎一刀將平面進行分割,建立二叉樹。
查詢複雜度呢? 據第二個鏈結的部落格說最壞是o( sqrt(n) ) 的。並不會分析查詢複雜度。
hdu2966 裸kdtree
題意:給平面圖上n(1 ≤ n ≤100000)
個點,對每個點,找到其他 歐幾里德距離 離他最近的點,輸出他們之間的距離。保證沒有重點。
1 #include 2view code#define ll long long
3using
namespace
std;
4#define n 200010
5const ll inf =1e18;
6int
n,i,id[n],root,cmp_d;
7int
x, y;
8struct nodet[n];
9bool cmp(const node&a,const node&b)
10void umax(int&a,int b)
11void umin(int&a,int b)
12void up(int
x)19
if(t[x].r)25}
26int build(int l,int r,int d,int
f)38
39ll dis(ll x1, ll y1, ll x, ll y)
43 ll dis(int p, ll x, ll y)
51ll ans;
52void query(int
p)62
else66}
6768
intmain()
76int rt = build(1, n, 0, 0
);77
for(int i = 1; i <= n; i++)83}
84return0;
85 }
bzoj2648
題意:給出n個點,接下來m個操作,每次插入乙個點,或者詢問離詢問點的最近曼哈頓距離。
1 #include 2view code#define ll long long
3using
namespace
std;
4#define n 1000010
5const ll inf =1e18;
6int
n,m,i,id[n],root,cmp_d,rt;
7int
x, y;
8struct nodet[n];
9bool cmp(const node&a,const node&b)
10void umax(int&a,int b)
11void umin(int&a,int b)
12void up(int
x)19
if(t[x].r)25}
26int build(int l,int r,int d,int
f)38
39ll dis(ll x1, ll y1, ll x, ll y)
44 ll dis(int p, ll x, ll y)
53ll ans;
54void ins(int now, int k, int
x)60
else
64up(now);65}
66void query(int
p)76
else80}
8182
intmain()
97else
102}
103return0;
104 }
bzoj3053
題意:k維座標系下的最近的m個點。直接對於每乙個詢問都在kdtree中詢問m次最近點,每次找到乙個最近點對需要把它記錄下來,用堆維護即可。
1 #include 2view code#define ll long long
3#define mp make_pair45
using
namespace
std;
6#define n 50010
7const ll inf =1e18;
8int
n,m,k,i,id[n],root,cmp_d,rt;
9int
x, y, num;
10struct nodet[n];
11bool cmp(const node&a,const node&b)
12void umax(int&a,int b)
13void umin(int&a,int b)
14void up(int
x)20
if(t[x].r)24}
25}26int build(int l,int r,int d,int
f)39
int qx[5
];40 ll dis(int p)
48return
ans;49}
50 ll getdis(int
p)56
void ins(int now, int k, int
x)62
else
66up(now);67}
68ll ret;
69 multiset< pair >ans;
70void query(int
p)78 ret = (*ans.rbegin()).first;
79if(t[p].l) dl =dis(t[p].l);
80if(t[p].r) dr =dis(t[p].r);
81if(dl
85else89}
9091
intmain()
97 rt = build(1, n, 0, 0
);98 scanf("
%d", &m);
99while(m--)
111}
112}
113return0;
114 }
KD tree學習筆記
如上圖 a 我們先對待識別的物體的影象進行sift特徵點的檢測和特徵點的描述,然後得到了sift特徵點集合。接下來生成物體目標描述要做的就是對特徵點集合進行資料組織,形成一種特殊的表示,其作用是為了加速特徵點匹配的過程。所謂的特徵點匹配本質上是乙個通過距離函式 例如歐式距離 在高維向量之間進行相似性...
學習筆記 kd tree
kd tree用來維護n維空間中的點的一種資料結構。支援插入 刪除 查詢k臨近 包括最遠點對和最近點對 kd tree本質是一顆二叉樹。每一層選擇乙個維度,找到當前維度的中點 讓樹盡量平衡 經過這個點,在當前維度切割,分成左右兩個子樹。通常維度的選擇是順次迴圈的,較易實現。更優的方法是找到方差最大的...
KD Tree學習筆記
kdtree是一種用於分割k維資料空間的資料結構,主要應用於多維空間關鍵資料的搜尋。例如 範圍搜尋和最近鄰搜尋 kdtree的每個節點表示k維空間的乙個點 每次空間劃分按照輪轉法劃分,即如果這次選擇了在第i維上劃分,則下一次就在 i 1 k上劃分 int id,n,k,c struct p p ma...