平面中最近的兩點(分治法)

2022-02-14 13:51:02 字數 1156 閱讀 6791

設平面上的點按x排序好了,這樣最多增加o(n*logn),這再整個演算法來看並沒有增加複雜度級別。

排好序後,可以劃一條垂線,把點集分成兩半:pl和pr。於是最近點對或者在pl中,或者在pr中,或者pl,pr各有一點。

把三種距離情況定義為dl, dr, dc.

其中dl, dr可以遞迴求解,於是問題就變為計算dc。 根據上面紅色字解釋,由於我們希望得到o(n*logn)的解,因此必須能夠僅僅多花o(n)的附加工作計算dc。

另s=min(dl, dr). 通過觀察能得出結論:如果dc否則不可能滿足dc

如果是均勻分布的點集,則能證明出在該帶中平均只有o(sqrt(n))個點,(注:書上這麼寫的,我也不會證,先記下這個理論吧)。因此,對這些點運用蠻力法可以在o(n)時間內完成。

#include

#include

#include

#include

#define mm 100020

using namespace std;

struct note

pt[mm];

int _sort1[mm];

int _sort2[mm];

double min(double& x,double& y)

int cmp_x(const void *a,const void *b)

int cmp_y(const void *a,const void *b)

double distan(note a,note b)

double neardis(int first,int ends)

for(int i=mid+1;i,pt[mid])<=dota;i++)

//統計在分界線兩邊的點的情況;

double min_dis=dota;

for(int i=0;i<_end1>

}//計算在分界線兩邊的點的距離,與最小距離比較。

return min_dis;

}int main()

return 0;

}

平面幾何最近兩點(分治 sort)

本題是問station和agent之間最近的兩個,不妨先想想如果是x y平面內最近的兩點怎麼算呢。先按x座標公升序排,如果x相同,那麼y小的排到前面 之後就開始分治了 divide l,r l,r 區間內的最近點對。問題可以再縮小,考慮d1 l,mid 內的最近點對 和d2 mid 1,r 內的最近...

分治法求解平面n點中距離最近的兩點

最近點對問題定義 已知上m個點的集合,找出對接近的一對點。在二維空間裡,可用分治法求解最近點對問題。預處理 分別根據點的x軸和y軸座標進行排序,得到x和y,很顯然此時x和y中的點就是s中的點。情況 1 點數小於等於三時 情況 2 點數大於三時 首先劃分集合s為sl和sr,使得sl中的每乙個點位於sr...

關於平面最近兩點問題

最簡單的思想是直接進行遍歷,也就是n n 1 的複雜度 如果採用分治的思想會簡單很多 看了好幾篇blog,發現都不怎麼講人話,其實本質上是通過一維分治推出來的 對於一維數軸下找最近兩點,可以按照座標點進行分治 直接遞迴二分區域,使得細分為左右各有乙個點或者兩個點的區域 但是有可能發生以上的情況 左半...