尋找最近點對

2021-06-29 15:06:17 字數 1814 閱讀 4412

問題:在空間中有n個點,尋找空間中最近的2個點。

法一:遍歷,o(n^2)

法二:分治演算法:

將點分為左右兩半,分別找到最近的2個點,然後考慮交叉位置的點對中的最小距離,在這3者中取最小的那個。o(nlogn)。

步驟:

1. 按照x軸排序

2. 找到中間點,分別進行處理

3. 2邊處理完成,將進行「merge」過程,先將點按照y軸公升序,然後向上找7個點算距離比較即可,如果只看另一側的話應該只有4個點,但是我們並沒有進行分側,故要算7個點才能保證把另一側的算完 ,在乙個邊長為a的正方形內最多有4個點相互的距離大於等於a

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

using

namespace cv;

#define inf 100000000

struct cp;

point a[1000];

point b[1000];

point res[1000];

float calc_dis(point a, point b)

struct cp mindiscp(point *x, point *y, int start, int end)

else

else

return temp_cp;

}if (end - start + 1 == 2)

int mid = (start + end) / 2;

point mid_p = x[mid];

cp left_cp = mindiscp(x, y, 0, mid);

cp right_cp = mindiscp(x, y, mid + 1, end);

temp_cp = left_cp.dis < right_cp.dis ? left_cp : right_cp;

point in_dis_point[1000];

int k = 0;

//找分界線距離在temp_cp.dis以內的點,並按y座標公升序

for (int i = 0; i < end - start + 1; i++)

if ((y[i].x - mid_p.x <= temp_cp.dis) || (mid_p.x - y[i].x <= temp_cp.dis))

//向上找7個點算距離比較即可,如果只看另一側的話應該只有4個點,但是我們並沒有進行分側,故要算7個點才能保證把另一側的算完

//在乙個邊長為a的正方形內最多有4個點相互的距離大於等於a

尋找最近點對

一維的數很簡單,先排序,再掃瞄已排好的數,相鄰兩個進行比較即可,時間複雜度為o n log2n n o n log2n 兩維的話 把平面上n個點分成兩部分left和right。假設分別求出left和right兩部分最短距離mindistleft和mindistright,還有一種情況就是點對中乙個點...

尋找最近點對

給定平面上n個點的座標,找出距離最近的兩個點。根據水平方向的座標把平面上的n個點分成兩部分left和right。假設分別求出了left和right兩部分中距離最近的點對之最短距離mindist left 和mindist right 還有一種情況沒有考慮,那就是點對中乙個點來自於left部分,另乙個...

尋找最近點對

演算法導論上乙個經典演算法,講解可看 ac 的複雜度為 n lgn lgn,演算法導論上講還可以通過 預排序 不用每次都按照y排序,複雜度可下降為n lgn。上可以ac。include include include using namespace std define max 100005 def...