最近點對問題,是分治法的乙個典型應用,可以作為分治法入門的乙個切入點。
最近點對問題的描述比較簡單,在二維平面中,給定一堆點,求距離最近的一對點,思路是,講這一堆點分為兩部分,左域與右域,如何劃分左域右域呢?我們知道,這一堆點,每乙個點都有其橫座標,假如有十個點,對應十個橫座標,我們就取其中間數,然後分別對其左右域求最小值,關於如何對左右域求最小值問題上,別人採用的一般都是類似於快速排序的遞迴模型,我這裡採用的是dfs方法來對其進行遞迴,分別求得其左右域的最小值,我們求得左右域的最小值後,還要考慮一點,假設此時的最小值為x,然而還有乙個可能,左域裡面,最靠近分界線的乙個點,和右域裡面最靠近分界線的乙個點,其距離小於x,這樣最小距離就並非x了,所以,還要考慮一段以分界線為中位線,左右長度各位x/2的矩形面積裡面,是否有一對點距離小於x,然後便可以找到其最近點對。
#include #include #include #include #include using namespace std;
const int max=10000;
const int time=8;
float minlength=65535;
typedef struct
node;
node a[max]=,,,,,,,};
bool cmp(const node &a,const node & b )
*/ //輸入完畢
sort(a,a+time,cmp);
closestpair(0,time/2-1);
closestpair(time/2,time-1);
//minlength為求得左右兩個區間的最近點對的距離
solve();
cout<
最近點對問題
在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,每個子集中約有...
最近點對問題
在二維平面上的n個點中,如何快速的找出最近的一對點,就是最近點對問題。一種簡單的想法是暴力列舉每兩個點,記錄最小距離,顯然,時間複雜度為o n 2 在這裡介紹一種時間複雜度為o nlognlogn 的演算法。其實,這裡用到了分治的思想。將所給平面上n個點的集合s分成兩個子集s1和s2,每個子集中約有...