《DSAA》 10.2.2 最近點問題

設平面上有N個點,要找出其中兩個相距最近的點,被稱爲最近點問題。如果簡單地用蠻力解決:N個點存在N × (N - 1) / 2 條邊,我們可以檢查所有的邊找出其中最短者,但是這樣的時間界是O(N ^ 2),比較浪費時間,還應該有更巧妙的辦法,比如分治算法。

我們在平面中間畫一條豎線,則點集p也被分成兩半pL和pR,那麼最近的一對點將會:

1)都在pL中,設其距離爲dL

2)都在pR中,設其距離爲dR

3)一個在pL中,另一個字pR中,設其距離爲dC

dL和dR可以遞歸地求得,問題是如何得到dC,令dT = min(dL, dR),我們在中心線的兩側距中心線dT的畫兩條豎線,只有當左右兩個點都落在兩條豎線之間的區域時,它們的距離纔有可能小於dT,這樣我們就大大縮小了點集的範圍,可以用蠻力搞定了。

實現的時候爲了方便,我用點集中的中間點的x座標代替了中間線(希望不會有問題,呵呵):

1)把點集存入一個數組,並按照x座標排序

2)用分治算法遞歸求dL和dR,直到本區域只剩下:一個點,返回一個最大值,或兩個點,返回其距離

3)令dT = min(dL, dR), 挑出x座標距中間點小於dT的點,用蠻力求出dC,最後返回min(dT, dC)

下面是對原書中示例的求解,運行結果如下:




發佈了31 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章