給定平面上的n個點,求距離最近的兩個點的距離。
限制條件:
1<=n<=10000
思路:假設我們把所有點按x座標分成了左右兩半,那麼最近點對的距離就是下面二者的最小值:
(1)2點p和q同屬於左半邊或右半邊時點對(p,q)的距離;
(2)2點p和q屬於不同區域時點對(p,q)的距離;
首先,對於(1)可以通過遞迴計算;對於(2),我們可以利用(1)部分的最小值,不妨記為d,再考慮下面的(2『):
(2『)2點p和q屬於不同區域時,距離小於d的點對(p,q)的距離;
接下來,我們考慮x座標:假設將點劃分為左右兩半的直線為l,其x座標為x0,那麼根據(2『),到直線l的距離大於等於d的點就沒有必要考慮了,我們只需要考慮x座標滿足x0-d每個點,都只需要考慮與那些y座標不比自己大的點組成的點對(或比自己大的)(單方向考慮,避免重複計算點對),也就是說,對於y座標為yp的點,我們只需要考慮y座標滿足yp-d綜上所述,我們要檢查的點都在x0-d時間複雜度:遞迴的深度為o(logn),而每一層有o(n)個操作,所以總的複雜度是o(nlogn);
**:
typedef pairp;//first儲存x座標,second儲存y座標
//輸入
int n;
p a[max_n];
//用於按y座標歸併的比較函式
bool compare_y(p a,p b)
b.push_back(a[i]);
}retuen d;
}void solve()
最近點對問題
在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,每個子集中約有...
最近點對問題
最近點對問題,是分治法的乙個典型應用,可以作為分治法入門的乙個切入點。最近點對問題的描述比較簡單,在二維平面中,給定一堆點,求距離最近的一對點,思路是,講這一堆點分為兩部分,左域與右域,如何劃分左域右域呢?我們知道,這一堆點,每乙個點都有其橫座標,假如有十個點,對應十個橫座標,我們就取其中間數,然後...