問題:在空間中有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...