1. 程式人生 > >黑馬程式設計師____實現求平面上最近點對複雜度為O(nlgn)的演算法

黑馬程式設計師____實現求平面上最近點對複雜度為O(nlgn)的演算法

                ----------------------android培訓java培訓、期待與您交流! ----------------------

一、實驗目的和要求

(1)進一步掌握遞迴演算法的設計思想以及遞迴程式的除錯技術;

(2)理解這樣一個觀點:分治與遞迴經常同時應用在演算法設計之中。

(3)分別用蠻力法和分治法求解最近對問題;

(4)分析演算法的時間效能,設計實驗程式驗證分析結論。

二、實驗內容

設p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n個點構成的集合S,設計演算法找出集合S中距離最近的點對。

三、實驗環境

MyEclipse 5.5.1 GA

java

四、實驗原理

1、蠻力法(適用於點的數目比較小的情況下)

1)演算法描述:已知集合S中有n個點,一共可以組成n(n-1)/2對點對,蠻力法就是對這n(n-1)/2對點對逐對進行距離計算,通過迴圈求得點集中的最近點對
     2
)演算法時間複雜度:演算法一共要執行 n(n-1)/2次迴圈,因此演算法複雜度為O(n2)

   2、分治法

    1)演算法描述:已知集合S中有n個點,分治法的思想就是將S進行拆分,分為2部分求最近點對。演算法每次選擇一條垂線L,將S拆分左右兩部分為SLSRL一般取點集S中所有點的中間點的x座標來劃分,這樣可以保證SL

SR中的點數目各為n/2否則以其他方式劃分S,有可能導致SLSR中點數目一個為1,一個為n-1,不利於演算法效率,要儘量保持樹的平衡性

依次找出這兩部分中的最小點對距離:δLδR,記SLSR中最小點對距離δ = minδLδR),如圖1

                                                           圖1 

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

                                                              圖2

對於SL虛框範圍內的p點,在SR虛框中與p點距離小於δ的頂多只有六個點,就是圖二右圖中的2個正方形的6的頂點。這個可以反推證明,如果右邊這2個正方形內有7個點與p點距離小於δ,例如q點,則q點與下面正方形的四個頂點距離小於δ,則和δSLSR中的最小點對距離相矛盾。因此對於SL虛框中的p,不需求出p點和右邊虛線框內所有點距離,只需計算SR中與py座標距離最近的6個點,就可以求出最近點對,節省了比較次數。否則的話,最壞情形下,在SR虛框中有可能會有n/2個點,對於SL虛框中的p點,每次要比較n/2次,浪費了演算法的效率

2)演算法時間複雜度:

首先對點集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(n2)要高效。

五、實驗資料

                                                                圖3  兩種演算法的時間複雜度對比

六、實驗結果

1)輸入點

2) 蠻力法

3)分治法

七、實驗總結

通過這次實驗,我深刻了解到分治法的實用性,有效性。當遇到規模較大的問題,用我們以前學過的方法就太不明智了。將原問題劃分成若干個較小規模的子問題,再繼續求解,劃分,能夠簡化問題。遞迴法,是一個很重要的方法,具有結構自相似的特性,剛開始學習編寫的時候遇到了很多問題,不知道要找邊界,不知道如何劃分問題。

         ---------------------- android培訓java培訓、期待與您交流! ----------------------