作業5 分治演算法之最近對問題

2021-10-04 13:38:14 字數 1596 閱讀 5996

最近對問題

令p為笛卡爾平面上n>1個點構成的集合。簡單起見,假設集合中每個點都不一樣。我們還假設這些點是按照其x周座標公升序排列的。為了更加方便,我們還按照點的y軸座標在另乙個列表中進行公升序排列,分別記為px,py。當2<=n<=3時,通過蠻力求解出d。當n>3時,可以利用點集在方向上的中位數mid,在該處作一條垂線,將點集分成大小分別為ceil(n/2) 和int(n/2)兩個子集px1和px然後通過遞迴求解。但是,這樣的d不一定是整個p中的最近對距離,因為距離最近的兩個點可別位於中線mid的兩側。因此,在合併較小子問題的解時,需要檢查是否存在這樣的點。顯然,我們可以在關注以分割帶為對稱的,寬度為2d的垂直帶中的點,因為任何其它點對的距離都至少為d。是來自py,位於分割線2d寬度範圍內的垂直帶的點的列表。由於py的特點,因為s是按照y軸公升序的。我們掃瞄該列表,當遇到更近的點對時,更新目前為止的d。初始情況下,dmin=d,但接下來dminint efficientclosestpair(px,py,pointnum,dmin)

}無論將問題劃分為兩個規模減半的子問題,還是合併子問題的解,該演算法都只需要線性時間。因此,假設n是2的冪,我們得到演算法執行時間的遞迴式:

t(n) = 2t(n/2) + f(n)

其中f(n) ∈o(n).應用主定理,t(n) = o(nlogn).

#include

#include

#include

struct point

;void

swap

(int x,

int y)

intdirect

(point p,

int n)

}return dmin;

}int

efficientclosestpair

(point px[

],point py,

int n,

int dmin)

else

int dmin1 =

efficientclosestpair

(px1, py1,mid,dmin)

;int dmin2 =

efficientclosestpair

(px2, py2,n/

2,dmin)

; dmin = dmin1 < dmin2 ? dmin1 : dmin2;

point s[10]

;int k =0;

for(

int i =

0; i < n; i++)}

for(

int i =

0; i < n; i++)}

return dmin;}}

intmain()

point px[10]

, py[10]

;for

(int i =

0; i < n; i++)}

}for

(int i =

0; i < n; i++)}

}printf

("%d"

,efficientclosestpair

(px, py, n,dmin));

return0;

}

演算法分析與設計實踐 作業5 分治最近對問題

有n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。歐幾里得距離計算公式 將集合s分成兩個子集s1和s2,根據平衡子問題原則,每個子集中的點數大致都為n 2。這樣分治後,最近點對將會出現三種情況 在s1中,在s2中或者最近點對分別在集合s1和s2中。利用遞迴分析法分別計算前兩種情況,第三種方...

演算法分析分治法之最近點對問題

分治法 將乙個難以解決的問題,分成多個規模較小的問題逐個擊破,並將解決的子問題進行合併得到母問題的解決方案。最近點對問題 1.題目描述 給定二維平面上n個點,找其中的一對點,使得在n個點組成的所有點對中,該點對間的距離最小 2.輸入描述 n3.輸出描述 最近點對距離,結果保留2位小數 4.輸入樣例 ...

最近點對問題 UVa 10245 (分治)

給定平面上的n個點,求距離最近的兩個點的距離。限制條件 1 n 10000 思路 假設我們把所有點按x座標分成了左右兩半,那麼最近點對的距離就是下面二者的最小值 1 2點p和q同屬於左半邊或右半邊時點對 p,q 的距離 2 2點p和q屬於不同區域時點對 p,q 的距離 首先,對於 1 可以通過遞迴計...