暴力搜尋所有點對的距離,時間複雜度為o(n^2),在資料規模較為龐大的情況下,並不能很好的執行。以下將利用分治的方法,將時間複雜度降為o(n (lg n)^2 )。
1.將主問題按座標劃分成兩個子問題——以直線l:x=k為中心,使得兩邊的點數相同。2.當子問題求解完畢後,設ε為已經求解出的最小距離,然後以 l1:x=k-ε 和 l2:x=k+ε 為界,選取該區域的所有點,並按y軸,從小到大排序。
3.按順序選擇乙個點,並分別計算改點往後7個點的距離,選擇最小的距離返回。
merge( a, left, right )
if left == right
return ∞
else if left + 1 == right
return get_distance( a[left], a[right] )
mid = (left + right)/2
dis1 = merge( a, left, mid )
dis2 = merge( a, mid+1, right )
dis = min( dis1, dis2 )
let tmp is an array
for i=left to right
if | a[i].x-a[mid].x | < dis
tmp.insert(a[i])
for i=0 to tmp.size
for j=1 to 7
if i+j >= tmp.size
break
if dis < get_distance( tmp[i], tmp[i+j] )
dis = get_distance( tmp[i], tmp[i+j]
return dis
get_colsest_distance( a )
a.sort() with a[i].x < a[j] and i < j
return merge( a, 0, a.size-1 )
#include #include const double double_infinite = 1e50;
struct point
;bool cmpx( point a, point b )
bool cmpy( point a, point b )
double getdistance( point a, point b )
void getclosestdistance( point* points, point* tmp, int left, int right, double &mindistance )
std::sort( tmp, tmp+length,cmpy );
double distance = double_infinite;
for(int i=0;i雖然最近點對有時間複雜度為 o(n lg n )的演算法,但是實現其演算法時,常數過於巨大,使得執行效率比o(n (lg n)^2 )更低。
演算法導論學習筆記(五)計算幾何之尋找凸包
定義 點集q的凸包是乙個最小的凸多邊形p,滿足q中的每個點都在p的邊界上或在p的內部。通過排序所有點,選擇乙個一定是凸包中的點作為基點,再在剩餘點中按相對於基點的極角排序,最後依次遍歷所有點,將不符合凸多邊形定義的點去除,剩下的點集便是凸包中的點。graham scan q q.sort 0,1,2...
電腦科學導論學習筆記
定義乙個基於圖靈模型的計算機。圖靈模型假設各種各樣的運算都能夠通過一種特殊的機器來完成,圖靈機的模型是基於各種運算過程的。圖靈模型把運算的過程從計算機器中分離開來,相對於之前的專業機器既包括計算又包括實際功能 縫紉機,票數計算 定義乙個基於馮 諾伊曼模型的計算機 馮 諾伊曼模型定義了計算機的組成,它...
電腦科學導論筆記
第三章 資料儲存 1.整數的儲存方式 無符號表示法 正常儲存,可以表示2的n次方 1 二進位制補碼表示法 負數的補碼就是對反碼加1,而正數不變 也是分成兩半,常規交換 0000 0001 0010 0011 0010 0011 0000 0001 0 1 2 3 2 1 0 1 符號加絕對值表示法 ...