問題描述
n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。
分治法求解
對所有的點按照x座標(或者y)從小到大排序(排序方法時間複雜度o(nlogn)
o(nlogn))。
根據下標進行分割,使得點集分為兩個集合。
解決
遞迴的尋找兩個集合中的最近點對。
取兩個集合最近點對中的最小值min(disleft,disright)
min(disleft,disright)。
合併
最近距離不一定存在於兩個集合中,可能乙個點在集合a,乙個點在集合b,而這兩點間距離小於dis。
**
#include
#include
#include
#define min(x,y) (x#define max 100
struct positionz[max]
;double
distance
(position z1,position z2)
double
dac(position s,
int left,
int right)
if(right - left ==2)
int m =
(right+left)/2
;int i,j;
double d1 =
dac(s,left, m)
;double d2 =
dac(s, m+
1,right)
;double d =
min(d1, d2)
;int l = left, r = right;
while
(s[l]
.x < s[m]
.x - d && l <= right)
; l++
;while
(s[r]
.x > s[m]
.x + d && r>=left)
r--;double d3;
for(i = l; i <=r; i++
)else}}
return d;
}int
main()
}}for(i=
0;i)printf
("\n最近點對最小距離為 %lf\n"
,dac
(z,0
,n-1))
;}
時間複雜度
在分解和合併時,可能存在按照x軸、y軸進行排序的預處理o(nlogn)o(nlogn),該問題在解決階段只做提取的操作為θ(n)θ(n),遞推式為:
t(n)={12t(n2)+o(n)n<=3n>3t(n)={12t(2n)+o(n)n<=3n>3
計算後得到整體時間複雜度為:o(nlogn)
github原始碼
最近對問題(分治法)
include stdafx.h include include using namespace std struct point double distance point a,point b 宣告函式,否則在c 中會出現 找不到標示符 的錯誤 double closestdistance poi...
分治法求最近對問題
首先感謝博主讓我收穫很多,今天感覺很睏,狀態不佳,解析與講解會改天補上,註明 我這裡採用遞迴時是左閉右開區間,而博主採用的左閉右閉。還有感謝 nx 童鞋為我調好vs2017,之前因為環境問題一直裝不上,不過vs2017的除錯是真的好用啊,哈哈!code include include include...
解讀最近對問題 分治法
照著書上和老師講解,理解了使用分治法解決最大對問題,並用 實現了一下 快速排序 void quicksort point po,int left,int right po left po i po i temp quicksort po,left,i 1 quicksort po,i 1,right...