之前的最近點計算,是使用暴力搜尋的,所需的時間讓人不可接受
利用雜湊演算法,將單位正方形分成乙個網格,設定乙個鍊錶的二維陣列,每個網格正方形對應乙個表,選擇的網格足夠精巧,與已知距離為d之內的所有點或落於統一網格內,或落於鄰接網格內!
解讀:就是將距離雜湊化,對應的座標落在某乙個格仔裡面,每個格仔都有乙個頭指標,儲存對映到其內的座標,相鄰的座標之差都是比1來得小的,所以只需要與周圍的8個格仔內的座標及其當前格仔內的座標進行比較即可
補充:二維陣列的建立:
link **malloc2d(int r,int c)
二維陣列的刪除:
void free(link **tmp,int row)
free(tmp);
}
注:t[i][j]已經就是對對應指標所指向的元素的訪問,而(*t[i])與之是等價的。
**:
#include #include #include typedef struct point
point;
float randfloat()
float distance(point a,point b)
typedef struct node* link;
struct node
;link **malloc2d(int r,int c)
void free(link **tmp,int row)
free(tmp);
}link **grid;
int g;
float d;
int cnt = 0;
void gridinsert(float x,float y)
} }t->next = grid[x][y];
grid[x][y] = t;
}int main()
計算幾何 最近點對入門
解題思路 算最近點對距離的一半即可。參考 include using namespace std define local 提交的時候一定注釋 define for i,a,b for int i a i b i define rep i,a,b for int i a i b i define p...
最近點問題
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...
二維幾何 平面最近點對
存個模板 是用分治寫的時間複雜度 nlogn 但是本題好像還有一種玄學做題法 我們充分發揚人類智慧型 將所有點全部繞原點旋轉同乙個角度,然後按x座標排序 根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠 所以我們只取每個點向後的5個點來計算答案 這樣速度快得飛起,在n 100000...