演算法設計與分析 分治法和暴力 最近對問題

2021-09-23 23:54:11 字數 2669 閱讀 2981

設 p1(x1,y1),p2(x2,y2), …… ,pn(xn,yn)是平面上n個點構成的集合s,最近對問題就是找出集合s中距離最近的點對。

分治法總體來說分為三個步驟:劃分、求解子問題、合併這題的思路是,將集合s分為左右兩個子集s1和s2,兩個子集分別含有n/2個點,先在每個子集中遞迴地求其最接近的點對,再求最近的兩點分別在兩個集合中的點對,最後比較得出對短距離。

最近對問題的演算法效率取決於劃分點m的選取

如果選取m =(max+min)/2,則有可能因集合s中點分布的不均勻而造成子集s1和s2的不平衡,如果使用各中點座標的中位數(即s的中值)作為分割點,則會得到乙個平衡的分割點,使得子集s1和s2中有個數大致相同的點。

暴力法**:

#include

#include

#include

#include

#include

#include

#include

#include

voidbf(

const vector

& v)}}

cout<<

"n^2暴力列舉的蠻力法:\n"

; cout<<

"最近的兩個點為:"

<

<<

"和"<

<

cout<<

"最近對的距離為:"

<

}int

main()

bf(points)

;return0;

}

分治法**:

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int maxn =

0x3f3f3f3f

;struct point

bool operator <

(const point& rhs)

const};

ostream & operator <<

(ostream & out,

const point& p)

bool cmp

(const point&a,

const point&b)

//按x座標排序

bool cmp2

(const point&a,

const point&b)

//按y座標排序

double

dis(point a,point b)

double

min(

double a,

double b,

double c)

double

closestpoint

(vector points,

int m,

int n)

//左閉右開

if(n-m==3)

int mid =

(m+n)/2

;int mm = points[mid]

.x;double d1 =

closestpoint

(points,m,mid)

;// 左邊區域最短距離

double d2 =

closestpoint

(points,mid,n)

;// 右邊區域最短距離

double minn =

min(d1,d2)

; vector left,right;

for(

int i=m;i

++i)

for(

int i=mid;i

++i)

sort

(right.

begin()

,right.

end(

),cmp2)

;//按y座標排序

double mindist =

100000

;for

(int i=

0;i<

(int

)left.

size()

;i++

)//遍歷左邊所有點求與右邊最短距離}}

return

min(minn,mindist);}

intmain()

sort

(points.

begin()

,points.

end(

),cmp)

;for

(int i=

0;i) cout <<

"分治法求得的答案為:"

<<

closestpoint

(points,

0,points.

size()

)<< endl ;

return0;

}

結果圖為:

演算法設計與分析基礎 分治法

1.將乙個問題劃分為同一型別的若干子問題,子問題最好規模相同 2.對子問題求解 一般使用遞迴方法 3.有必要的話,合併子問題的解,得到原始問題的答案 下圖描述的是將乙個問題劃分為兩個較小子問題的例子,也是最常見的情況 1.主要思想 對於乙個需要排序的陣列a 0 n 1 將其一分為二 a 0 n 2 ...

演算法設計與分析複習 分治法演算法描述

分治 劃分 解子問題 組合 每個遞迴演算法均可以轉換為迭代演算法 include include 尋找最大最小元素,最大比較次數 3 n 2 2 minmax low,high if high low 1 if arr low arr high return arr low arr high els...

演算法設計與分析 分治法(js實現)

特徵能否利用分治法完全取決於問題是否具有這條特徵,如果具備了前兩條特徵,而不具備第三條特徵,則可以考慮貪心演算法或動態規劃。偽 divide and conquer p if p n0 adhoc p 解決小規模的問題 divide p into smaller subinstances pl,p....