分治法求最近點對

2021-09-02 02:10:41 字數 2048 閱讀 9963

1)演算法描述:

1.分割

:將集合s進行以垂直於x軸的直線l進行平均劃分,並且保證sl和sr中的點數目各為n/2,

(否則以其他方式劃分s,有可能導致sl和sr中點數目乙個為1,乙個為n-1,不利於演算法效率,要盡量保持樹的平衡性)

依次找出這兩部分中的最小點對距離:δl和δr,記sl和sr中最小點對距離δ = min(δl,δr),如圖1:

2.查詢邊界附近距離小於δ的點對

: 以l為中心,δ為半徑劃分乙個長帶,最小點對還有可能存在於sl和sr的交界處,如下圖2左圖中的虛線帶,p點和q點分別位於sl和sr的虛線範圍內,在這個範圍內,p點和q點之間的距離才會小於δ,最小點對計算才有意義。

又因為虛線內的點可能比較多,因此不可能全部進行距離比較,因此對資料的y軸也進行劃分,兩條垂直於y軸的直線距離p為+-δ,這樣就得到了乙個矩形,只需將p與矩形內的點進行比較即可(矩形外的點與p的距離一定大於δ,沒有比較的意義),且可以證明,矩形內的點最多為6個,因此點p最多與sr中的點比較6次即可。(因為最小距離為δ,要使矩形內的點的數量最多,則只有分布於兩個正方形的六個頂點上,其他情況的點數全都一定小於6)

2) **描述:

1)對點集s的點x座標和y座標進行公升序排序,獲得點集sx和sy

2)令δ

=∞;   //δ為最小點位距離

3)divide_conquer(sx,sy,δ

)  //分治法

if (sx.count=1) then δ

=∞;   

//如果sx中只有乙個點,則δ=∞

return δ;

else if(sx.count=2 and d(sx.[0],

sx.[1])

) //如果sx中只有2個點,則δ為兩點之間距離

δ=d(sx.[0],)sx.[1]); 

return δ;

else    //如果sx中多於2個點,則將sx

,sy分治,以中心點畫線,將sx

分為左右兩部分sxl和sxr,sy分為syl和

syr

j1=1,j2=1,k1=1,k2=1;

mid = sx.count/2;  

//mid為sx中的中間點點號

l = sx.[mid].x;     

//l為sx中的中間點x座標

for(i=1,i

δl = divide_conquer(sxl,syl,δ)

;    //獲取sx中的的最小點位距離δl

δr = divide_conquer(sxr,syr,δ)

;   //獲取sy中的的最小點位距離δr

δ= min (δl,δr);

δ=merge(syl,syr,δ);   

//獲sx中sy交界處的最小點位距離,並綜合 δl和δr 求出點集的最小點位距離δ

return δ;

函式merge(syl,syr,δ)

merge(syl,syr

,δ)

for(i=1,i//獲取syr

中在右邊虛框(距離小於δ)

內的點,存入到

s'yr

中,新陣列保持原來的公升序性質

t=1;

for(i=1,i

for( j= max(1,t-3), j<=min(t+3,s'yr.count),j++)   //計算s'yr中的點與s'yl[t]y座標相鄰的六個點的距離

return δ}

3)演算法時間複雜度:

首先對點集s的點x座標和y座標進行公升序排序,需要迴圈2nlogn次,複雜度為o(2nlogn)

接下來在分治過程中,對於每個s'yl中的點,都需要與s'yr中的6個點進行比較

o(n)= 2o(n/2) + (n/2)*6  (乙個點集劃分為左右兩個點集,時間複雜度為左右兩個點集加上中間區域運算之和)

其解為o(n)< o(3nlogn)

因此總的時間複雜度為o(3nlogn),比蠻力法的o(n

2)要高效。

分治法求最近點對問題

分治法 1 演算法描述 已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次 選擇一條垂線l,將s拆分左右兩部分為sl和sr l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有 可能導致sl 和sr中點數...

分治法求最近點對問題

1 演算法描述 已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次 選擇一條垂線l,將s拆分左右兩部分為sl和sr,l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有 可能導致sl 和sr中點數目乙個為...

分治法求最近點對實驗

對於平面上給定的n個點,給出所有點對的最短距離,即,輸入是平面上的n個點,輸出是n點中具有最短距離的兩點。要求隨機生成n個點的平面座標,應用蠻力法程式設計計算出所有點對的最短距離。要求隨機生成n個點的平面座標,應用分治法程式設計計算出所有點對的最短距離。首先明確分治法的一大特點就是大化小,不知道從 ...