最接近點對問題

2021-07-08 14:20:17 字數 1471 閱讀 9567

一維最臨近點對

假設我們用x軸上某個點m將s劃分為2個子集s1和s2 ,基於平衡子問題的思想,用s中各點座標的中位數來作分割點。

遞迴地在s1和s2上找出其最接近點對和,並設d=min,s中的最接近點對或者是,或者是,或者是某個,其中p3∈s1且q3∈s2。如果s的最接近點對是,即|p3-q3|

由於在s1中,每個長度為d的半閉區間至多包含乙個點(否則必有兩點距離小於d),並且m是s1和s2的分割點,因此(m-d,m]中至多包含s中的乙個點。由圖可以看出,如果(m-d,m]中有s中的點,則此點就是s1中最大點。因此,我們用線性時間就能找到區間(m-d,m]和(m,m+d]中所有點,即p3和q3。從而我們用線性時間就可以將s1的解和s2的解合併成為s的解。關鍵的問題是如何實現分治法中的合併步驟,即由s1和s2的最接近點對,如何求得原集合s中的最接近點對。如果組成s的最接近點對的2個點都在s1中或都在s2中,則問題很容易解決。但是,如果這2個點分別在s1和s2中,則仍需做n2/4次計算和比較才能確定。

二維的情形:

選取一垂直線l:x=m來作為分割直線。其中m為s中各點x座標的中位數。 s1=   s2=      , s=s1∪s2

遞迴地在s1和s2上解最接近點對問題,我們分別得到s1和s2中的最小距離δl和δ2。現設δ=min(δl,δ2)。

若s的最接近點對(p,q)之間的距離d(p,q)< δ,則p和q必分屬於sl和s2。

設p∈s1,q∈s2那麼,p和q距直線l的距離均小於δ。因此,我們若用p1和p2分別表示直線l左邊和右邊的寬為δ的2個垂直長條,則p∈p1,q∈p2,   如下圖所示

考慮p1中任意一點p,它若與p2中的點q 構成最接近點對的候選者,則必有d(p,g)< δ。這樣的點一定落在乙個δ×2δ的矩形r中,如圖所示

由δ的意義可知,p2中任何兩個s中的點的距離都不小於δ.由此矩形r中最多只有6 個s中的點.如圖

證明:將矩形r的長為2d的邊3等分,將它的長為d的邊2等分,由此匯出6個(d/2)×(2d/3)的矩形。若矩形r中有多於6個s中的點,則由鴿舍原理易知至少有乙個(d/2)×(2d/3)的小矩形中有2個以上s中的點。設u,v是位於同一小矩形中的2個點,則

最接近的點對問題

一 問題描述 給定平面上n個點,找其中一對點,使得在n個點組成的所有點對中,該點對間的距離最小。二 演算法描述 偽 double cpair point p,int left int right n p.size if n 2 return 0x3f3f3f3f 1 int mid left rig...

平面最接近點對問題 分治

主要思想就是分治。先把n個點按x座標排序,然後求左邊n 2個和右邊n 2個的最近距離,最後合併。合併要重點說一下,比較麻煩。首先,假設點是n個,編號為1到n。我們要分治求,則找乙個中間的編號mid,先求出1到mid點的最近距離設為d1,還有mid 1到n的最近距離設為d2。這裡的點需要按x座標的順序...

hdu 1007最接近點對問題 nlogn複雜度

include include include include using namespace std define inf 100000000 int n struct point else int tmp 100005 point p 100005 int cmp int a,int b dou...