解讀最近對問題 分治法

2021-10-03 20:41:42 字數 2533 閱讀 4826

照著書上和老師講解,理解了使用分治法解決最大對問題,並用**實現了一下

/*快速排序

*/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...