最近對問題分治法

2021-10-22 23:58:34 字數 1564 閱讀 4620

問題描述

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