演算法導論學習筆記(五)計算機幾何之最近點對

2021-07-22 18:32:51 字數 1539 閱讀 5765

暴力搜尋所有點對的距離,時間複雜度為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 符號加絕對值表示法 ...