蛮力算法求解最近对
蠻力算法最近對
問題描述:
一個包含n個點的集合中,找出距離最近的兩個點。
問題分析:
假設所考慮的點是以標準的笛卡爾坐標形式( x ,y )給出的,兩個點pi = ( xi ,yi )和 pj =( xj,yj )之間的距離是標準的歐幾里得距離
顯然求解該問題的蠻力算法應該是:分別計算每一對點之間的距離,然后找出距離最小的那一堆。當然為了提高算法的效率,我們并不希望同一對點計算兩次距離,所以我們只考慮 i < j 的那些對( pi , pj)。
算法
BruteForceClosePoints( p )
//使用蠻力算法求平面中距離最近的兩個點
//輸入:一個 n (n >= 2)個點的列表 p , p1 = ( x1,y1 ),… pn = ( xn, yn )
//輸出:兩個最近點的距離
d <-- ∞
for i <–1 to n -1 do
for j <-- i + 1 to n do
d <-- min( d, sqrt( xi - xj )2 + ( yi - yj )2
return d
算法優化
該算法的基本操作就是計算平方根,,整數的平方根大多是無理數,只能對它們近似求解,而計算這些近似數也不是一件輕松的事。實際上,我們可以避免求平方根,只比較其值的本省。因為如果被開方數越小,它的平方根也越小,平方根函數是嚴格遞增的
核心代碼
代碼實現
/*最近對問題*/ #include<stdio.h>struct Postion{double x;double y; }P[100];void BruteForceClosePoints(Postion P[], int n, int *index1, int *index2){double min = 10000;double d;for(int i = 0; i < n - 1; i++){for(int j = i + 1; j < n; j++){d = (P[i].x - P[j].x)*(P[i].x - P[j].x) + (P[i].y - P[j].y)*(P[i].y - P[j].y);if(d < min){min = d;*index1 = i;*index2 = j;}}}printf("第%d個點到%d個點距離最短為%lf", *index1 + 1, *index2 + 1, min); }int main(){int n, index1,index2;printf("請輸入點個數\n");scanf("%d", &n);for(int i = 0; i < n; i++){printf("請輸入第%d個點的xy值\n", i+1);scanf("%lf%lf", &P[i].x, &P[i].y);} BruteForceClosePoints(P, n, &index1, &index2); }運行結果
代碼分析
算法的時間復雜度為 C(n)= O(n2)
雖然加快了算法執行內層循環的速度,但對算法運行時間的提升只是微乎其微的,并不能改變其漸進效率類型。
總結
寫博客是為了一是整理所學知識,親生寫代碼的經驗,而是為了總結經典算法,三是督促自己努力,懂得越多,越知道自己知識的淺薄,四是希望和他人多多交流,有什么不對的地方大佬們多多指點
總結
- 上一篇: C51实现电子时钟
- 下一篇: 使用elementUI中的date-pi