最近點對問題

2021-06-04 16:27:42 字數 2168 閱讀 7046

在n(n>1) 個點的集合中尋找最近點對。即求任意兩點的歐幾里得距離的最小值。

1)最簡單的暴力搜尋演算法,時間複雜對為o(n*n)。

2)這裡主要考慮分治演算法,執行時間的遞迴式為t(n) = 2*t(n/2)+o (n),時間複雜度為o(n*lgn)。

演算法思想:

將集合中的點按x座標排序,我們可以想象一條垂直的直線將集合劃分為左右兩部分,對於每一部分,我們可以遞迴的求出最小距離,最終得到的兩個值(dl, dr)並不一定是解,因為忽略了跨越垂線的亮點的距離(d)。所以我們必須再搜尋一遍兩部分的點。但不需要全部搜尋,那樣無疑就是第一種演算法了。假設md = min (dl, dr,),搜尋的點要滿足座標x的值

與中間座標x值的差小於md。對於搜尋出的這些點也不是都必須計算距離,如果彼此y座標的值已經大於md的話,就不需要計算了。說的模模糊糊的,看**吧:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define for(i,a,b) for(i = (a); i < (b); ++i)

#define fore(i,a,b) for(i = (a); i <= (b); ++i)

#define ford(i,a,b) for(i = (a); i > (b); --i)

#define forde(i,a,b) for(i = (a); i >= (b); --i)

#define max(a,b) ((a) > (b)) ? (a) : (b)

#define min(a,b) ((a) < (b)) ? (a) : (b)

#define clr(a,b) memset(a,b,sizeof(a))

#define pb(x) push_back(x)

typedef long long ll;

typedef vectorvi;

const int maxn = 100009;

const int maxm = 0;

const int hash_size = 25000002;

const int inf = 0x7f7f7f7f;

mapmp;

map::iterator it;

typedef struct point;

typedef struct tpoint;

point px[maxn];

int n;

double ans;

void closest(tpoint py, int low, int high);

void closest_pair();

double dist(point a, point b);

int comparex(point a, point b);

int comparey(tpoint a, tpoint b);

int main(void)

return 0;

}void closest_pair()

sort(py, py+n, comparey); // 對y陣列進行遞增排序

closest(py, 0, n-1); // 求親密點對

ans = sqrt(ans);

delete py;

}void closest(tpoint py, int low, int high)

else

else

else

}closest(sl, low, m); // 計算左邊子集的最近點對

closest(sr, m+1, high);// 計算右邊子集的最近點對

point *z = new point[high-low+10];

k = 0;

for( i=0; i<=high -low; i++){ // 收集距離中線距離小於d的元素,儲存到陣列z(因y陣列按y座標遞增排序,z陣列也一樣)

if(fabs(px[m].x - py[i].x)

最近點對問題

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

最近點對問題

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

最近點對問題

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