演算法分析與實踐 作業5

2022-08-19 00:24:12 字數 1916 閱讀 3080

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 #include5

using

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...