日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蛮力算法求解最近对

發布時間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蛮力算法求解最近对 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

蠻力算法最近對

問題描述
一個包含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

算法優化
該算法的基本操作就是計算平方根,,整數的平方根大多是無理數,只能對它們近似求解,而計算這些近似數也不是一件輕松的事。實際上,我們可以避免求平方根,只比較其值的本省。因為如果被開方數越小,它的平方根也越小,平方根函數是嚴格遞增的
核心代碼

void FindClosest(Postion P[], int n){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;}}} }

代碼實現

/*最近對問題*/ #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)
雖然加快了算法執行內層循環的速度,但對算法運行時間的提升只是微乎其微的,并不能改變其漸進效率類型。

總結
寫博客是為了一是整理所學知識,親生寫代碼的經驗,而是為了總結經典算法,三是督促自己努力,懂得越多,越知道自己知識的淺薄,四是希望和他人多多交流,有什么不對的地方大佬們多多指點

總結

以上是生活随笔為你收集整理的蛮力算法求解最近对的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。