演算法導論上乙個經典演算法,講解可看
ac**的複雜度為 n*lgn*lgn,演算法導論上講還可以通過「預排序」,不用每次都按照y排序,複雜度可下降為n*lgn。
上可以ac。
#include#include#include
using
namespace
std;
#define max 100005
#define inf 2e20
struct
point ;
point a[max];
point tmp[max];
intcmpx(point a, point b)
intcmpy(point a, point b)
double dis(point* a, int i, int
j) double mindis(int left, int
right)
if (left + 2 ==right)
int mid = left + (right - left) / 2
;
double minleft =mindis(left, mid);
double minright = mindis(mid + 1
, right);
d =min(minleft, minright);
int k = 0
;
for (int i = left; i <= right; i++)
}sort(tmp, tmp +k, cmpy);
for (int i = 0; i < k; i++) }}
returnd;}
intmain()
sort(a, a +n, cmpx);
double res = mindis(0, n - 1
); printf(
"%.2lf\n
", res / 2
); }
return0;
}
尋找最近點對
一維的數很簡單,先排序,再掃瞄已排好的數,相鄰兩個進行比較即可,時間複雜度為o n log2n n o n log2n 兩維的話 把平面上n個點分成兩部分left和right。假設分別求出left和right兩部分最短距離mindistleft和mindistright,還有一種情況就是點對中乙個點...
尋找最近點對
問題 在空間中有n個點,尋找空間中最近的2個點。法一 遍歷,o n 2 法二 分治演算法 將點分為左右兩半,分別找到最近的2個點,然後考慮交叉位置的點對中的最小距離,在這3者中取最小的那個。o nlogn 步驟 1.按照x軸排序 2.找到中間點,分別進行處理 3.2邊處理完成,將進行 merge 過...
尋找最近點對
給定平面上n個點的座標,找出距離最近的兩個點。根據水平方向的座標把平面上的n個點分成兩部分left和right。假設分別求出了left和right兩部分中距離最近的點對之最短距離mindist left 和mindist right 還有一種情況沒有考慮,那就是點對中乙個點來自於left部分,另乙個...