kd tree學習筆記 最近鄰域查詢

2022-05-06 14:42:10 字數 3221 閱讀 7303

kd樹在演算法競賽中主要用來做各種各樣的平面區域查詢,包含則累加直接返回,相交則繼續遞迴,相離的沒有任何貢獻也直接返回。可以處理圓,三角形,矩形等判斷起來相對容易的平面區域內的符合加法性質的操作。

比如查詢平面內歐幾里得距離最近的點的距離。

kdtree其實有點像搜尋,暴力+剪枝。

它是通過橫一刀,豎一刀,橫一刀再豎一刀將平面進行分割,建立二叉樹。

查詢複雜度呢? 據第二個鏈結的部落格說最壞是o( sqrt(n) ) 的。並不會分析查詢複雜度。

hdu2966 裸kdtree

題意:給平面圖上n(1 ≤ n ≤100000)

個點,對每個點,找到其他 歐幾里德距離 離他最近的點,輸出他們之間的距離。保證沒有重點。

1 #include 2

#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 }

view code

bzoj2648

題意:給出n個點,接下來m個操作,每次插入乙個點,或者詢問離詢問點的最近曼哈頓距離。

1 #include 2

#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 }

view code

bzoj3053

題意:k維座標系下的最近的m個點。直接對於每乙個詢問都在kdtree中詢問m次最近點,每次找到乙個最近點對需要把它記錄下來,用堆維護即可。

1 #include 2

#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 }

view code

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...