**改進
**示例
1.主要思路
輸入預處理
遞迴查詢輸出
2.遞迴分析
選取中線將平面內的點劃分為兩個部分
這樣就會產生距離最短兩種情況
兩個點都在中線兩邊,這個好辦用分治遞迴處理
兩個點分別在中線兩邊,這個是演算法的難點
針對第二種情況進行分析
d = min(左邊最短的距離,右邊最短的距離)
p1為左邊的點
p2為右邊的點
與分割線l的距離超過d的排除
p1,p2縱座標之差小於d。
因此在這種情況下對每個p1來說滿足條件的最多6個點
這樣時間效率就會相對提高
相關**
//分離出離中線距離小於d的點
for(i = left; i <= right; i++
)//對y排序
sort
(mpt, mpt + k, cmpy)
;//線性掃瞄
for(i =
0; i < k; i++
)}
要做到預處理也就是在main函式的時候就優先對x與y排序
節省後續在每次執行分治的時候重複排序
簡單的預處理
在主函式中僅僅優先對x排序,不加深對y的排序
在分治函式中再對y進行排序
最終這個演算法的時間複雜度是t(n)=o(nlog2n)加深預處理
在main中排序時將x與y拆分排序
在分治拆分的時候在將y選擇性併入兩個不同子集
最終這個演算法的時間複雜度是t(n)=o(nlogn)
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
double inf =
1e20
;const
int maxn =
100005
;struct point
point[maxn]
;int n, mpt[maxn]
;//x為基準排序,在x相同的情況下排y
bool
cmpxy
(const point& a,
const point& b)
//對y進行排序
bool
cmpy
(const
int& a,
const
int& b)
//尋找最小值
double
min(
double a,
double b)
//距離計算
double
dis(
int i,
int j)
//最近點匹配(傳入當前最左和最右)
double
closest_pair
(int left,
int right)
sort
(mpt, mpt + k, cmpy)
;//線性掃瞄
for(i =
0; i < k; i++)}
return d;
}//隨機生成點
void
createpoints()
}printf
("(%.2lf, %.2lf)\t"
, point[i]
.x, point[i]
.x);if(
(i+1)%
5==0||i==n-1)
}}intmain()
//生成n對x/y的值
createpoints()
;//對x/y排序
sort
(point, point + n, cmpxy)
;//利用分治,輸出最小距離
printf
("最小距離:%.2lf\n"
,closest_pair(0
, n -1)
/2);
}return0;
}
輸出效果圖
icp點雲匹配迭代最近鄰演算法
一 含義 1.icp演算法能夠使兩個不同座標系下的點集匹配到乙個座標系中,這個過程就是配準,配準的操作就是找到從座標系1變換到座標系2的剛性變換。2.icp的本質就是配準,但有不同的配準方案,icp演算法本質是基於最小二乘的最優配準方法。該方法重複進行選擇對應關係對,計算最優剛體變換,直到滿足正確配...
最近點對分治演算法
對於平面上給定的 n nn 個點,給出所有點的座標,即輸入是平面上的 n nn 個點,輸出是 n nn 點中具有最短距離的兩點。法一 暴力,時間複雜度 o n 2 o n 2 o n2 法二 分支,時間複雜度 o n log n o nlog n o nlog n 當然,此部落格 二。對於乙個點我們...
關鍵點匹配演算法
基於模型的方法以cootes在1995年提出的asm方法最為代表,asm方法將數十個臉部特徵點的紋理和位置關係約束一起考慮來進行計算出乙個引數模型。從區域性特徵中檢測到所求的關鍵點,但是這種方法對雜訊非常敏感。asm也是開先河的經典之作,也是後面被follow最多方法。也是cootes等人提出的aa...