分治演算法求最近點對

2021-07-23 14:24:22 字數 888 閱讀 2834

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次,浪費了演算法的效率)

**:

分治演算法求最近點對

先說下題意,很簡單,給n個點的座標,求距離最近的一對點之間距離的一半。第一行是乙個數n表示有n個點,接下來n行是n個點的x座標和y座標,實數。這個題目其實就是求最近點對的距離。演算法導論 上有詳細講解,王曉東的書上也有 主要思想就是分治。先把n個點按x座標排序,然後求左邊n 2個和右邊n 2個的最近...

分治演算法求最近點對

先說下題意,很簡單,給n個點的座標,求距離最近的一對點之間距離的一半。第一行是乙個數n表示有n個點,接下來n行是n個點的x座標和y座標,實數。這個題目其實就是求最近點對的距離。演算法導論 上有詳細講解,王曉東的書上也有 主要思想就是分治。先把n個點按x座標排序,然後求左邊n 2個和右邊n 2個的最近...

分治演算法求最近點對

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!先說下題意,很簡單,給n個點的座標,求距離最近的一對點之間距離的一半。第一行是乙個數n表示有n個點,接下來n行是n個點的x座標和y座標,實數。這個題目其實就是求最近點對的距離。演算法導論 上有詳細講解,王曉東的書上也有 主要思想就是分治。先把n個點...