照著書上和老師講解,理解了使用分治法解決最大對問題,並用**實現了一下
/*快速排序
*/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);}
/* 排序引數
*/bool
comp
(const point &p1,
const point &p2)
/* 計算距離函式
*/double
distance
(point a, point b)
/* 分治法求解
*/double
closest
(point po,
int low,
int high)
//遞迴求解子問題
double d;
double d1, d2;
int mid =
(low + high)/2
; d1 =
closest
(po, low, mid)
; d2 =
closest
(po, mid +
1, high);if
(d1 <= d2) d = d1;
else d = d2;
point p[
100]
;//x座標在-d~+d之間的點併入乙個集合
int index =1;
for(
int i = mid;
(i >= low)
&&(po[mid]
.x - po[i]
.x)< d; i--
) p[index++
]= po[i]
;for
(int i = mid +1;
(i <= high)
&&(po[i]
.x - po[mid]
.x)< d; i++
) p[index++
]= po[i]
;//y座標公升序排序
sort
(&p[1]
,&p[index -1]
, comp)
;//在x集合內迴圈 找x y座標差值都小於d的點 計算距離d
for(
int i =
1; i < index; i++
)for
(int j = i +
1; j < index; j++)if
((p[j]
.y - p[i]
.y)>= d)
break
;else
return d;}/*
主函式*/
intmain()
時間複雜度分析:
【演算法分析】當求a[0…n-1]中n個點的最近點時,設執行時間為t(n),求左右部分中最近點對的時間為t(n/2),求中間部分的時間為o(n),則:
t(n)=o(1) 當n<4
t(n)=2t(n/2)+o(n) 其他情況
從而推出演算法的時間複雜度為o(nlog2n)。
記錄一下遇到的問題
1.對各點x座標進行快速排序的時候 如果少於4個點 直接ruturn 如果left>right 直接return
後者通過除錯之後才看清錯誤
2.思考並理解鴿舍定理,如何轉化成**實現
3.測試了幾個資料,感覺應該是沒有問題
最近對問題(分治法)
include stdafx.h include include using namespace std struct point double distance point a,point b 宣告函式,否則在c 中會出現 找不到標示符 的錯誤 double closestdistance poi...
最近對問題分治法
問題描述 n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。分治法求解對所有的點按照x座標 或者y 從小到大排序 排序方法時間複雜度o nlogn o nlogn 根據下標進行分割,使得點集分為兩個集合。解決 遞迴的尋找兩個集合中的最近點對。取兩個集合最近點對中的最小值min disleft...
分治法求最近對問題
首先感謝博主讓我收穫很多,今天感覺很睏,狀態不佳,解析與講解會改天補上,註明 我這裡採用遞迴時是左閉右開區間,而博主採用的左閉右閉。還有感謝 nx 童鞋為我調好vs2017,之前因為環境問題一直裝不上,不過vs2017的除錯是真的好用啊,哈哈!code include include include...