要找到最接近M的點,我們需要基於平面切割進行點的二元消除。需要對輸入點進行一些預處理,然後我們可以在O(lgn)時間內找到最接近任何給定點M的點。
- 計算(如果沒有給出)在(R,θ)格式點的極座標表示,其中r是從中心和θ的距離爲x軸範圍(-180,180]的角度。
- 排序的所有N個點,從x軸增加其角度的順序。
需要注意的是簡單的二進制搜索最接近於M點不會在這裏工作,比如,
- 如果給定的點排序使得θ=(-130,-100 ,-90,-23,-15,0,2,14,170),那麼對於θ= -170的點M,二分搜索將給出-130(40度距離)作爲最近點,而170(距離20度)是最接近M的點。
- 如果我們在排序時忽略了符號(認爲它會產生正確的輸出),我們新的排序數組將看起來像θ=(0,2,14,15,23,90,100,130,170),二進制搜索θ= -6的點M將產生結果應該是2或14,而0在這種情況下是最接近M的點。
要使用平面切口執行搜索操作時,
- 查找平面切割線穿過圓的中心並垂直於連接所述圓與點中心的線M.
- 消除取決於平面M的哪一半位於圓形平面的一半[90 +θ,-90 +θ)或[-90 +θ,90 +θ)。
- 將平面切割平行於第一個切口並穿過前一個平面中間的點,並消除距離M較遠的平面一半中的所有點,直到在平面的較接近一半處沒有剩餘點,在這種情況下,消除飛機的近一半。
- 保持在切割平面上,直到我們留下一個點。該點最接近M.總操作需要O(lgn)步驟。
在情況下,數據是歪斜,並在圓不能均勻地擴散,我們可以優化我們的平面切口,使得每個切口穿過其離開這些點的中值(根據角度)在搜索操作中。
這似乎是一個稍微開放式的問題。候選人可能會問一兩個問題。那麼你有什麼想法? – Beta 2013-02-21 03:49:27
既然Log(N)是必需的,我覺得在某種比較中,我應該能夠至少減少一半的點數。否則,我無法接近解決問題的辦法。 – yuvi 2013-02-21 03:55:56
提示:考慮一條線上的N個點和線上的一個點M。是否有日誌(N)解決方案? – Beta 2013-02-21 03:58:59