分治法求最近點對問題

2021-06-18 22:58:17 字數 888 閱讀 8306

1)演算法描述:已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次

選擇一條垂線l,將s拆分左右兩部分為sl和sr,l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n/2,

(否則以其他方式劃分s,有

可能導致sl

和sr中點數目乙個為1,乙個為n-1,不利於演算法效率,要盡量保持樹的平衡性)

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

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

對於sl虛框範圍內的p點,在sr

虛框中與p點距離小於δ的頂多只有六個點,就是圖二右圖中的2個正方形的6的頂點。這個可以反推證明,如果右邊這2個正方形內有7個點與p點距離小於δ,例如q點,則q點與下面正方形的四個頂點距離小於δ,則和δ為sl和sr中的最小點對距離相矛盾。因此對於sl虛框中的p點,不需求出p點和右邊虛線框內所有點距離,只需計算sr中與p點y座標距離最近的6個點,就可以求出最近點對,節省了比較次數。

(否則的話,

最壞情形下,在s

r虛框中有可能會有n/2個點,對於s

l虛框中的p點

,每次要比較n/2次,浪費了演算法的效率)

**:

分治法求最近點對問題

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

分治法求最近點對

1 演算法描述 1.分割 將集合s進行以垂直於x軸的直線l進行平均劃分,並且保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有可能導致sl和sr中點數目乙個為1,乙個為n 1,不利於演算法效率,要盡量保持樹的平衡性 依次找出這兩部分中的最小點對距離 l和 r,記sl和sr中最小點對距離 m...

分治法求最近對問題

首先感謝博主讓我收穫很多,今天感覺很睏,狀態不佳,解析與講解會改天補上,註明 我這裡採用遞迴時是左閉右開區間,而博主採用的左閉右閉。還有感謝 nx 童鞋為我調好vs2017,之前因為環境問題一直裝不上,不過vs2017的除錯是真的好用啊,哈哈!code include include include...