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