最近點對問題

2021-10-14 02:53:49 字數 1775 閱讀 1704

問題描述

n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。

分解對所有的點按照x座標(或者y)從小到大排序(排序方法時間複雜度o ( n l o g n )。

根據下標進行分割,使得點集分為兩個集合。

解決遞迴的尋找兩個集合中的最近點對。

取兩個集合最近點對中的最小值m i n ( d i s l e f t , d i s r i g h t )。

合併最近距離不一定存在於兩個集合中,可能乙個點在集合a,乙個點在集合b,而這兩點間距離小於dis。

有已mid為中心,

// divideandconquer.cpp : 定義控制台應用程式的入口點。

//#include

"stdafx.h"

struct point p[

100]

;double

distance

(point p1, point p2)

bool

cmp1

(point p1, point p2)

bool

cmp2

(point p1, point p2)

//分治法

double

nearest_pair

(point s,

int left,

int right)

if(right - left ==2)

int m =

(right + left)/2

;double d1 =

nearest_pair

(s, left, m)

;double d2 =

nearest_pair

(s, m +

1, right)

;//sort(s+right, s+left, cmp2);

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++;sort

(s + l, s + r +

1, cmp2)

;double d3;

for(

int i = l; i <= r; i++

)else}}

return d;

}int

_tmain

(int argc, _tchar* ar**)

sort

(p +

1, p + n +

1, cmp1)

;for

(int i =

1; i <= n; i++

)double m2 =

nearest_pair

(p,1

, n)

; cout << m2 << endl;

system

("pause");

return0;

}

最近點對問題

在n n 1 個點的集合中尋找最近點對。即求任意兩點的歐幾里得距離的最小值。1 最簡單的暴力搜尋演算法,時間複雜對為o n n 2 這裡主要考慮分治演算法,執行時間的遞迴式為t n 2 t n 2 o n 時間複雜度為o n lgn 演算法思想 將集合中的點按x座標排序,我們可以想象一條垂直的直線將...

最近點對問題

在二維平面上的n個點中,如何快速的找出最近的一對點,就是最近點對問題。一種簡單的想法是暴力列舉每兩個點,記錄最小距離,顯然,時間複雜度為o n 2 在這裡介紹一種時間複雜度為o nlognlogn 的演算法。其實,這裡用到了分治的思想。將所給平面上n個點的集合s分成兩個子集s1和s2,每個子集中約有...

最近點對問題

最近點對問題,是分治法的乙個典型應用,可以作為分治法入門的乙個切入點。最近點對問題的描述比較簡單,在二維平面中,給定一堆點,求距離最近的一對點,思路是,講這一堆點分為兩部分,左域與右域,如何劃分左域右域呢?我們知道,這一堆點,每乙個點都有其橫座標,假如有十個點,對應十個橫座標,我們就取其中間數,然後...