最近點對問題

2021-09-19 12:02:53 字數 814 閱讀 6884

給定的二維平面上有n個點,找其中的一對點,使得在n個點的所有點對中,該點對的距離最小;
1.將平面上的點集s按x座標排序後,若只有1個點,則返回;若有兩個點,則直接計算兩點距離為最近距離;若有三個點,則兩兩計算出距離,得到最近距離。

2.若大於三個點,則將其線性分割成大小大致相等的2個子集s1,s2。

3.最近點對只會出現在以下三種情況中:①點對在子集s1中;②點對在子集s2中;③乙個點在s1中,另乙個點在s3中。

4.遞迴地在s1,s2上解最近點對問題,分別得到s1,s2中的最小距離d1,d2,取d1,d2中的最小距離d和點對。再找出跨越s1,s2的最近點對:合併s1,s2找到點集中x座標在區間[mid-d,mid+d]範圍內的所有點。

5.按y座標不減排序,迴圈每個點,找它後面7個點的最小距離,與d比較,比d小則更新d。最後即求得最近點對距離

#includeusing namespace std;

struct point

p[100005],temp[100005];

//x軸排序

bool cmpx(point a,point b)

//對y座標排序

sort(temp,temp+k,cmpy);

//迴圈每個點,找它後面7個點的最小距離,與d比較,比d小則更新d

for(int i=0;i=d)break;

d=min(dis(temp[i],temp[j]),d);}}

return d;

}int main()

}

最近點對問題

在n n 1 個點的集合中尋找最近點對。即求任意兩點的歐幾里得距離的最小值。1 最簡單的暴力搜尋演算法,時間複雜對為o n n 2 這裡主要考慮分治演算法,執行時間的遞迴式為t n 2 t n 2 o n 時間複雜度為o n lgn 演算法思想 將集合中的點按x座標排序,我們可以想象一條垂直的直線將...

最近點對問題

在二維平面上的n個點中,如何快速的找出最近的一對點,就是最近點對問題。一種簡單的想法是暴力列舉每兩個點,記錄最小距離,顯然,時間複雜度為o n 2 在這裡介紹一種時間複雜度為o nlognlogn 的演算法。其實,這裡用到了分治的思想。將所給平面上n個點的集合s分成兩個子集s1和s2,每個子集中約有...

最近點對問題

最近點對問題,是分治法的乙個典型應用,可以作為分治法入門的乙個切入點。最近點對問題的描述比較簡單,在二維平面中,給定一堆點,求距離最近的一對點,思路是,講這一堆點分為兩部分,左域與右域,如何劃分左域右域呢?我們知道,這一堆點,每乙個點都有其橫座標,假如有十個點,對應十個橫座標,我們就取其中間數,然後...