1.解析
1)蠻力演算法:
兩層遍歷,將每個點與其他點進行計算,求得最短的距離,複雜度較高,效率低。
2)分治演算法:
把點集p(點個數為n)按照x軸公升序排序。當n<=3時,使用蠻力演算法;當n>3時,將點集分為左右大小為⌈n/2⌉和⌊n/2⌋的子集pl和pr,通過遞迴呼叫每次將子集一分為二,求得子集中的最短距離,最後通過遞迴求得整個點集的最短距離。其中dl和dr分別表示在pl和pr中的最近對距離,並定義d=min(dl,dr)。
最近點對還可能在垂線兩側,需檢查是否存在這樣的點,應在寬度為2d的範圍中檢查。
2.設計
efficientclosestpair( p ){
if n<=3
返回蠻力演算法求得的最小距離
else
將p的前⌈n/2⌉個點複製到pl
將p中餘下的⌊n/2⌋個點複製到pr
dl=efficientclosestpair(pl)
dr=efficientclosestpair(pr)
m=p[⌈n/2⌉-1].x
將p中所有|x-m|3.分析
蠻力演算法:複雜度o(n2)
分治演算法:複雜度w(n)=2w(n/2)+o(n)
w(n)=o(nlogn)
最近對問題
有n個點,求距離最小的一對點。採用計算出所有點兩兩之間的距離,比較保留最小點距離就可以獲得。這樣時間複雜度為o n2 採用分治的思想來解決問題,可以發現這個問題的難點不在分,而在合併。以下對演算法步驟進行描述 1.找到一條線,將問題分解成兩個子集s1 s2 每個子集的大小為n 2 2.遞迴的發現s1...
最近對問題
設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面n上n個點構成的集合s,最近對問你就是找出集合s中距離最近的點對。暴力法 在蠻力法實現最近點對問題中,將問題簡化 距離最近的點對可能多於一對,找出一對即可,另外只考慮二維平面中的情況。用距離公式即可求 分治法 分治法思想解決此問題時,首先...
最近對問題
n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。分解對所有的點按照x座標 或者y 從小到大排序 排序方法時間複雜度o nlogn 根據下標進行分割,使得點集分為兩個集合。解決遞迴的尋找兩個集合中的最近點對。取兩個集合最近點對中的最小值min dis left dis right 合併最近距...