n個點在公共空間中,求出所有點對的距離最小值。
① 對所有的點按照x座標從小到大排序。根據下標進行分割,使得點集分為兩個集合。
② 遞迴的尋找兩個集合中的最近點對。取兩個集合最近點對中的最小值min(dis_left,dis_right)。
③ 最近距離不一定存在於兩個集合中,可能乙個點在集合a,乙個點在集合b,而這兩點間距離小於dis。這其中如何合併是關鍵。根據遞迴的方法可以計算出劃分的兩個子集中所有點對的最小距離dis= min(dis_left,dis_right)。那麼乙個點在集合a,乙個在集合b中的情況,可以針對此情況,用之前分解的標準值,即按照x座標從小到大排序後的中間點的x座標作為mid,劃分乙個[mid−dis,mid+dis]區域,如果存在最小距離點對,必定存在這個區域中。
之後只需要根據[mid−dis,mid]左邊區域的點來遍歷右邊區域[mid,mid+dis]的點,即可找到是否存在小於dis距離的點對。
1 #include2 #include3 #include4 #include5using
namespace
std;
6const
int maxn = 1000 + 10;7
struct
point
10bool
operator
< (const point& rhs)const
13};
14int
n;15
bool cmp(struct point& a, struct point& b)
18bool cmp2(struct point& a, struct point& b)
21double
dis(point a, point b)
2425
double closestpoint(vectorpoints, int left, int
right)
30if (right - left == 3
) 36
int mid = (right + left) / 2;37
int mm =points[mid].x;
38double dl = closestpoint(points, left, mid); //
左邊區域最短距離
39double dr = closestpoint(points, mid, right); //
右邊區域最短距離
因此整體的時間複雜度為o(nlogn)。
演算法分析與實踐 作業5
在包含有n個點的集合s中,找出距離最近的兩個點。設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面的n個點。嚴格地講,最近點對可能不止一對,此例輸出一對即可。利用分治求解 首先對所有的點按照x座標 或者y 從小到大排序 排序方法時間複雜度o nlogn o nlogn o nlogn ...
演算法分析與實踐 大作業
給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的原序列。一般而言我們會想到這種做法 但是這種只是其中一種,我們並沒有考慮完全,還有一些如 小球本來可以放到兩個大球的中間,不增加長度的 這個就類似於最短路的問題,由此我們想到了回溯演算法。開始時設a r1,r2,rn ...
演算法分析與實踐 作業13
讀後感 由於參與了我院acm實驗室的緣故,我有幸閱讀了 演算法競賽 高階指南 這本書。儘管並沒有能完全地滲透這一本書,但是還是在這本書上學習一些比較有用的演算法。演算法可以說是基礎,很多問題倘若我們使用暴力的方法去解決,複雜度甚至可以達到o n 但是當我們使用了一些演算法去優化,複雜度可以降到o n...