最近點對問題定義:已知上m個點的集合,找出對接近的一對點。
在二維空間裡,可用分治法求解最近點對問題。預處理:分別根據點的x軸和y軸座標進行排序,得到x和y,很顯然此時x和y中的點就是s中的點。
情況(1):點數小於等於三時:
情況(2):點數大於三時:
首先劃分集合s為sl和sr,使得sl中的每乙個點位於sr中每乙個點的左邊,並且sl和sr中點數相同。分別在sl和sr中解決最近點對問題,得到dl和dr,分別表示sl和sr中的最近點對的距離。令d=min(dl,dr)。如果s中的最近點對(p1,p2)。p1、p2兩點乙個在sl和乙個在sr中,那麼p1和p2一定在以l為中心的間隙內,以l-d和l+d為界,如下圖所示:
如果在sl中的點p和在sr中的點q成為最近點對,那麼p和q的距離必定小於d。因此對間隙中的每乙個點,在合併步驟中,只需要檢驗yp+d和yp-d內的點即可。
步驟1:根據點的y值和x值對s中的點排序。
步驟2:找出中線l將s劃分為sl和sr
步驟3:將步驟2遞迴的應用解決sl和sr的最近點對問題,並令d=min(dl,dr)。
步驟4:將l-d~l+d內的點以y值排序,對於每乙個點(x1,y1)找出y值在y1-d~y1+d內的所有點,計算距離為d'。 如果d'小於d,令d=d',最後的d值就是答案。
實驗1 遞迴與分治演算法
一,實驗目的和要求
(1)進一步掌握遞迴演算法的設計思想以及遞迴程式的除錯技術;
(2)理解這樣乙個觀點:分治與遞迴經常同時應用在演算法設計之中。
(3)分別用蠻力法和分治法求解最近對問題;
(4)分析演算法的時間效能,設計實驗程式驗證分析結論。
二,實驗內容
設p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。
三,實驗環境
turbo c 或vc++
四,實驗學時
2學時,必做實驗
五,資料結構與演算法
#include
#include
#define true 1
#define false 0
typedef struct node
node; //座標
typedef struct list
list;
typedef struct closenode
closenode;
int n; //點的數目
//輸入各點到list中
void create(list &l)
//求距離的平方
double square(node a,node b)
//蠻力法
void bruteforce(const list &l,closenode &cnode,int begin,int end)
} }
} //分治法中先將座標按x軸從小到大的順序排列
void paixu(list l)
//左右各距中線d的區域的最近對演算法
void middle(const list & l,closenode &cnode,int mid,double midx)
} --i; }
}//分治法求最近對
void divideconquer(const list &l,closenode &closenode,int begin,int end)
} void main()
平面最近點距離問題 分治法
演算法 0 把所有的點按照橫座標排序 1 用一條豎直的線l將所有的點分成兩等份 2 遞迴算出左半部分的最近兩點距離d1,右半部分的最近兩點距離d2,取d min d1,d2 3 算出 乙個在左半部分,另乙個在右半部分 這樣的點對的最短距離d3。4 結果 min d1,d2,d3 關鍵就是這第3步。貌...
分治法求解最近點距
最近點對問題很簡單,就是給定一堆點 這裡是二位座標下 求解最近的點的距離,該問題可以用窮舉法求解,雙重迴圈就夠了,就不說了,主要看一下分治法的 也很簡單,有注釋。如下 採用c 類模板編寫 編譯環境vs2015 include include include math.h include using ...
分治法求解最近點對問題
問題 設p1 x1,y1 p2 x2,y2 p3 x3,y3 p4 x4,y4 是平面上n個雜湊點構成的集合s,最近對問題就是找出集合s中距離最近的點對。解析設s中的點為平面上的點,它們都有2個座標值x和y。為了將平面上點集s線性分割為大小大致相等的2個子集s1和s2,我們選取一垂直線l x m來作...