KD Tree學習筆記

2021-09-28 15:52:32 字數 1857 閱讀 9321

kdtree是一種用於分割k維資料空間的資料結構,主要應用於多維空間關鍵資料的搜尋。例如:範圍搜尋和最近鄰搜尋

kdtree的每個節點表示k維空間的乙個點

每次空間劃分按照輪轉法劃分,即如果這次選擇了在第i維上劃分,則下一次就在(i+1)%k上劃分

int id, n, k, c;

struct p

} p[maxn];

struct tr tr[maxn << 2];

void build(int rt, int l, int r, int o)

toj 3072

#include using namespace std;

#define lc (rt << 1)

#define rc (rt << 1 | 1)

const int maxn = 1e5 + 5;

const int inf = 0x3f3f3f3f;

int id;

struct point

point(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {}

bool operator ==(const point a) const

bool operator <(const point a) const

else

}} p[maxn];

struct tr tr[maxn];

paircoodinate[maxn];

inline bool in(point a, point p1, point p2)

inline bool is(point p1, point p2, point p3, point p4)

void pushup(int rt)

void build(int rt, int l, int r, int o)

int ans;

void query(int rt, int l, int r, point pl, point pr)

if (in(tr[rt].po, pl, pr) && ans < tr[rt].v) ans = tr[rt].v;

int mid = (l + r) >> 1;

if (is(pl, pr, point(tr[lc].xl, tr[lc].yl, 0), point(tr[lc].xr, tr[lc].yr, 0)))

query(rt << 1, l, mid, pl, pr);

if (is(pl, pr, point(tr[rc].xl, tr[rc].yl, 0), point(tr[rc].xr, tr[rc].yr, 0)))

query(rt << 1 | 1, mid + 1, r, pl, pr);

}void update(int rt, int l, int r, point v)

id = tr[rt].o; int mid = (l + r) >> 1;

if (v < tr[rt].po) update(rt << 1, l, mid, v);

else update(rt << 1 | 1, mid + 1, r, v);

tr[rt].mx = tr[rt].v;

tr[rt].mx = max(max(tr[lc].mx, tr[rc].mx), tr[rt].mx);

}int main()

build(1, 0, n, 0);

int m; scanf("%d", &m);

while (m--) }}

}

KD tree學習筆記

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

學習筆記 kd tree

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

K D Tree 學習筆記

又是乙個不需要證明的東西,複雜度基本玄學。具體來說 k d tree 是解決高維問題的乙個資料結構 其實一般是二維 k d tree 本質上是一棵二叉搜尋樹,其的基本思想就是遍歷整個狀態空間加剪枝。設問題維度是k,其單次查詢的複雜度大概是 o n 我們一般採用每次隨機找乙個維度,以這個維度排序,且以...