演算法分析與實踐 作業5

2021-10-06 10:03:16 字數 1796 閱讀 4928

在包含有n個點的集合s中,找出距離最近的兩個點。設 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面的n個點。 嚴格地講,最近點對可能不止一對,此例輸出一對即可。

利用分治求解

首先對所有的點按照x座標(或者y)從小到大排序(排序方法時間複雜度o(nlogn)o(nlogn)o(nlogn)),根據下標進行分割,使得點集分為兩個集合。

然後遞迴的尋找兩個集合中的最近點對,取兩個集合最近點對中的最小值min(dis(left),dis(right))

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e3+5;

struct point

bool

operator

<

(const point& rhs)

const};

int n;

bool

cmp_x

(struct point& a,

struct point& b)

bool

cmp_y

(struct point& a,

struct point& b)

double

dis(point a, point b)

double

closestpoint

(vector points,

int left,

int right)

if(right - left ==3)

int mid =

(right + left)/2

;int mm = points[mid]

.x;double dl =

closestpoint

(points, left, mid)

;//左邊區域最短距離

double dr =

closestpoint

(points, mid, right)

;//右邊區域最短距離

因此整體的時間複雜度為o(nlogn)。

演算法分析與實踐 作業5

n個點在公共空間中,求出所有點對的距離最小值。對所有的點按照x座標從小到大排序。根據下標進行分割,使得點集分為兩個集合。遞迴的尋找兩個集合中的最近點對。取兩個集合最近點對中的最小值min dis left,dis right 最近距離不一定存在於兩個集合中,可能乙個點在集合a,乙個點在集合b,而這兩...

演算法分析與實踐 大作業

給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的原序列。一般而言我們會想到這種做法 但是這種只是其中一種,我們並沒有考慮完全,還有一些如 小球本來可以放到兩個大球的中間,不增加長度的 這個就類似於最短路的問題,由此我們想到了回溯演算法。開始時設a r1,r2,rn ...

演算法分析與實踐 作業13

讀後感 由於參與了我院acm實驗室的緣故,我有幸閱讀了 演算法競賽 高階指南 這本書。儘管並沒有能完全地滲透這一本書,但是還是在這本書上學習一些比較有用的演算法。演算法可以說是基礎,很多問題倘若我們使用暴力的方法去解決,複雜度甚至可以達到o n 但是當我們使用了一些演算法去優化,複雜度可以降到o n...