最近點對問題

2021-10-04 09:37:16 字數 1858 閱讀 9605

//使用分治演算法來求解最近點對問題

//輸入:陣列p中儲存了平面上的n≥2個點,並且按照這些點的x軸座標公升序排列

// 陣列q中儲存了與p相同的點,只是它是按照這點的y軸座標公升序排列

//輸出:最近點對之間的歐幾里得距離

if n≤3

返回由蠻力演算法求出最小距離

else

將p的前[n/2]個點複製到p1

將q的前[n/2]個點複製到q1

將p中餘下的[n/2]個點複製到pr

將q中餘下的[n/2]個點複製到qr

d1 ← efficientclosestpair(p1,q1)

dr ← efficientclosestpair(pr,qr)

d ← min(d1,dr)

m ← p[[n/2]-1].x

將q中所有的|x-m|#include

#include

#include

#include

using

namespace std;

#define infinite_distance 65535

// 無限大距離

#define coordinate_range 100

// 橫縱座標範圍為[-100,100]

#ifndef closest_pair

typedef

struct point

point;

double

distance

(point a, point b)

bool

comparex

(point a, point b)

bool

comparey

(point a, point b)

double

min(

int a,

int b)

double

closestpair

(point p[

], point q,

int length, point &a, point &b)

else

if(length ==3)

if(distance

(p[2

], p[0]

)< dminsq)

return dminsq;

}else

else

double mid = p[

(length /2)

-1].x;

//中間下標值,即中位數

point *s =

new point[length]

;for

(i =

0,j=

0; i < length; i++)}

dminsq = d * d;

for(i =

0; i < j-

2; i++)}

}return

sqrt

(dminsq);}

}void

setpoints

(point *points,

int length)

}int

main()

system

("pause");

}#endif

// !closest_pair2

參考演算法設計與分析基礎 第3版_(美)anany levitin著;潘彥譯_北京:清華大學出版社p149 ↩︎

**借鑑原作者,稍加修改 ↩︎

最近點對問題

在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,每個子集中約有...

最近點對問題

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