p為笛卡爾平面上n>1個點構成的集合,求最近的兩個點的距離(n=2k)
蠻力演算法:
將每個點與其他點進行計算,求得最短的距離
但需要兩層遍歷,複雜度較高
分治演算法:
把點集p(點個數為n)按照x軸從小到大排列
當n<=3時,使用蠻力演算法
當n>3時,將點集分為左右大小為⌈n/2⌉和⌊n/2⌋的子集pl和pr,通過遞迴呼叫每次將子集一分為二,求得子集中的最短距離,最後通過遞迴求得整個點集的最短距離。
需要注意的是,最近點對可能在分割線兩側,還需額外檢查。
efficientclosestpair(p,q,n){
if n<=3
返回蠻力演算法求得的最小距離
else
將p的前⌈n/2⌉個點複製到pl
將q的前⌈n/2⌉個點複製到ql
將p中餘下的⌊n/2⌋個點複製到pr
將q中餘下的⌊n/2⌋個點複製到qr
dl=efficientclosestpair(pl,ql)
dr=efficientclosestpair(pr,qr)
m=p[⌈n/2⌉-1].x
將q中所有|x-m|蠻力演算法:
複雜度o(n2)
分治演算法:
複雜度w(n)=2w(n/2)+o(n)
w(n)=o(nlogn)
演算法分析與設計5最近點對
在含有n個點的集合p中找出最近的兩個點的距離 採取分治策略,利用遞迴將問題反覆拆分為兩個子集,再對每個子集分別進行計算分析,然後合併比較得出最近點對間的距離 if n 2 mid high low 2 dist1 closestpoint p,low,mid dist2 closestpoint p...
演算法分析與設計實踐 作業5 分治最近對問題
有n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。歐幾里得距離計算公式 將集合s分成兩個子集s1和s2,根據平衡子問題原則,每個子集中的點數大致都為n 2。這樣分治後,最近點對將會出現三種情況 在s1中,在s2中或者最近點對分別在集合s1和s2中。利用遞迴分析法分別計算前兩種情況,第三種方...
演算法分析與實踐 作業5
在包含有n個點的集合s中,找出距離最近的兩個點。設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面的n個點。嚴格地講,最近點對可能不止一對,此例輸出一對即可。利用分治求解 首先對所有的點按照x座標 或者y 從小到大排序 排序方法時間複雜度o nlogn o nlogn o nlogn ...