在2023年acm icpc青島站的比賽中,一道k-d樹問題成為了金銀牌的分界線,最後由我們隊乙個強力隊友寫出了該題,其實那題本來該由我負責的,都怪我學藝不精。
k-d樹(k-dimensional樹的簡稱),是一種分割k維資料空間的資料結構。主要應用於多維空間關鍵資料的搜尋(如:範圍搜尋和最近鄰搜尋)。
應用背景
sift演算法中做特徵點匹配的時候就會利用到k-d樹。而特徵點匹配實際上就是乙個通過距離函式在高維向量之間進行相似性檢索的問題。針對如何快速而準確地找到查詢點的近鄰,現在提出了很多高維空間索引結構和近似查詢的演算法,k-d樹就是其中一種。
索引結構中相似性查詢有兩種基本的方式:一種是範圍查詢(range searches),另一種是k近鄰查詢(k-neighbor searches)。範圍查詢就是給定查詢點和查詢距離的閾值,從資料集中找出所有與查詢點距離小於閾值的資料;k近鄰查詢是給定查詢點及正整數k,從資料集中找到距離查詢點最近的k個資料,當k=1時,就是最近鄰查詢(nearest neighbor searches)。
例項
先以乙個簡單直觀的例項來介紹k-d樹演算法。假設有6個二維資料點,資料點位於二維空間內(如圖1中黑點所示)。k-d樹演算法就是要確定圖1中這些分割空間的分割線(多維空間即為分割平面,一般為超平面)。下面就要通過一步步展示k-d樹是如何確定這些分割線的。
圖1 二維資料k-d樹空間劃分示意圖
k-d樹演算法可以分為兩大部分,一部分是有關k-d樹本身這種資料結構建立的演算法,另一部分是在建立的k-d樹上如何進行最鄰近查詢的演算法。
再附上hdu2966我的**:
#include #include #include #include #include #include #include #include #include #include #include #include #includeusing namespacestd;typedef
long long
ll;const
int
n=100050;struct
pointp[n],ori[n];int
split[20],cur,dim;bool
cmp(const
point&a,const
point&b)#define lson l, m - 1, depth + 1#define rson m + 1, r, depth + 1
template
<
classt>t sqr(t x)
constll inf=0x7777777777777777ll;ll dist(
constpoint&x,
constpoint&y)
returnret?ret:inf;
}voidbuild(
const
int&l,
const
int&r,
const
int&depth)ll find(
constpoint&x,
const
int&l,
const
int&r,
const
int&depth)
intm=l+r>>1;ll ret=dist(x,p[m]),tmp;
if(x.x[cur] <p[m].x[cur])
}else
}returnmin(ret,tmp);
}int
main
() p[i] =ori[i];
}build(0,n-1,0);
for(
inti=0;i<n;i++)
}return0;
}
A 演算法的一些總結
看拓撲狀態監控的一篇文章時發現提到了a 演算法,他的目的是提取拓撲中的重要拓撲資訊來進行監控,進而減少控制資訊消耗。覺得這個想法不錯,但具體a 演算法是怎麼樣的呢?於是找了一下資料,覺得下面這篇帶著例項講的不錯,比較直觀,雖說博主也是借他山之石吧,但還是總結歸納的不錯,排版也很清晰,點讚。理解a 演...
一些演算法的總結
各種排序演算法 穩定 直二冒歸基 插入排序 直接插入排序 左邊都是排好序的,右邊的依次和左邊的比較,插入到左邊合適的位置。它的基本思想是將乙個記錄插入到已經排好序的有序表中。當待排序陣列是有序時,是最優的情況,只需當前數跟前乙個數比較一下就可以了 最壞的情況是待排序陣列是逆序。歸併排序 二路歸併 將...
對SPEA演算法的一些總結
spea以及spea2也算是和nsgaii 可以說得上並列的有名的多目標問題的優化演算法了。並且nsgaii,spea,以及spea2會經常拿來和自己的演算法來做對比,在寫 的時候。今天特意複習了下spea,下面總結一下這個演算法,主要是描述一下流程,如果到最後還有啥沒說全的就再補充下 1 首先初始...