尋找最近點對

2021-06-17 21:00:33 字數 602 閱讀 9538

一維的數很簡單,先排序,再掃瞄已排好的數,相鄰兩個進行比較即可,時間複雜度為o(n*log2n+n)= o(n*log2n)。

兩維的話:把平面上n個點分成兩部分left和right。假設分別求出left和right兩部分最短距離mindistleft和mindistright,還有一種情況就是點對中乙個點來自於left部分,另乙個點來自於right部分,設min=min(mindistleft,mindistright)。只需要考慮[m-min,m+min]這個帶狀區域。在計算帶狀區域的最小點對時,可以按y座標,對帶狀區域內的頂點進行排序。如果乙個點對的距離小於min,那麼它們一定在min*(2*min)的區域內,而在

左右兩個

min*min

正方形區域內(可以想象),最多只能含有4個點,就是正方形四個角,每個角乙個點。因此min*(2*min)的區域內最多有8個點。因此對於任意乙個帶狀區域的頂點,只要考察它與按y

座標排序且

緊接著的

7個點之間的距離就可以了。(值得注意的是:我們可以用歸併排序法將帶狀區域的點按y座標排序,歸併排序的過程與計算最近點對的演算法結合在一起)。時間複雜度為f(n)=2*f(n/2)+o(n)(n>2),為o(n*log

2n)。

尋找最近點對

問題 在空間中有n個點,尋找空間中最近的2個點。法一 遍歷,o n 2 法二 分治演算法 將點分為左右兩半,分別找到最近的2個點,然後考慮交叉位置的點對中的最小距離,在這3者中取最小的那個。o nlogn 步驟 1.按照x軸排序 2.找到中間點,分別進行處理 3.2邊處理完成,將進行 merge 過...

尋找最近點對

給定平面上n個點的座標,找出距離最近的兩個點。根據水平方向的座標把平面上的n個點分成兩部分left和right。假設分別求出了left和right兩部分中距離最近的點對之最短距離mindist left 和mindist right 還有一種情況沒有考慮,那就是點對中乙個點來自於left部分,另乙個...

尋找最近點對

演算法導論上乙個經典演算法,講解可看 ac 的複雜度為 n lgn lgn,演算法導論上講還可以通過 預排序 不用每次都按照y排序,複雜度可下降為n lgn。上可以ac。include include include using namespace std define max 100005 def...