在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,每個子集中約有...