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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[转] 最近点对距离问题

發(fā)布時(shí)間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转] 最近点对距离问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自:http://www.cnblogs.com/king1302217/archive/2010/07/08/1773413.html

?

求點(diǎn)集中的最近點(diǎn)對(duì)有以下兩種方法:

設(shè)p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n個(gè)點(diǎn)構(gòu)成的集合S,設(shè)計(jì)算法找出集合S中距離最近的點(diǎn)對(duì)。

?

1、蠻力法(適用于點(diǎn)的數(shù)目比較小的情況下)

???? 1)算法描述:已知集合S中有n個(gè)點(diǎn),一共可以組成n(n-1)/2對(duì)點(diǎn)對(duì),蠻力法就是對(duì)這n(n-1)/2對(duì)點(diǎn)對(duì)逐對(duì)進(jìn)行距離計(jì)算,通過(guò)循環(huán)求得點(diǎn)集中的最近點(diǎn)對(duì):

???? 2)代碼描述:

double MinDistance = double.maxvalue;? //設(shè)置一個(gè)MinDistance存儲(chǔ)最近點(diǎn)對(duì)的距離,初始值為無(wú)窮大

int PointIndex1,PointIndex2; //設(shè)置PointIndex1,PointIndex2分別存儲(chǔ)最近點(diǎn)對(duì)的兩個(gè)點(diǎn)編號(hào)

for (i=1; i< n; i++)??? //循環(huán)計(jì)算n(n-1)/2對(duì)點(diǎn)對(duì)的距離 {

???? for (j=i+1; j<=n; j++) ???? {

?????????? double PointDistance = Distance(S[i],S[j]);?? //求得point i和point j之間的距離

?????????? if PointDistance < MinDistance;? //如果當(dāng)前點(diǎn)對(duì)距離小于最小點(diǎn)對(duì)距離,則設(shè)置最小點(diǎn)對(duì)距離等于當(dāng)前點(diǎn)對(duì)距離

?????????? {

???????????????? MinDistance = PointDistance;

???????????????? PointIndex1 = i;

???????????????? PointIndex2 = j;

??????????? }

?????? }

}

????? }? ???? 3)算法時(shí)間復(fù)雜度:算法一共要執(zhí)行 n(n-1)/2次循環(huán),因此算法復(fù)雜度為O(n2)

?

2、分治法

???? 1)算法描述:已知集合S中有n個(gè)點(diǎn),分治法的思想就是將S進(jìn)行拆分,分為2部分求最近點(diǎn)對(duì)。算法每次選擇一條垂線L,將S拆分左右兩部分為SL和SR,L一般取點(diǎn)集S中所有點(diǎn)的中間點(diǎn)的x坐標(biāo)來(lái)劃分,這樣可以保證SL和SR中的點(diǎn)數(shù)目各為n/2

(否則以其他方式劃分S,有可能導(dǎo)致SL和SR中點(diǎn)數(shù)目一個(gè)為1,一個(gè)為n-1,不利于算法效率,要盡量保持樹(shù)的平衡性)

依次找出這兩部分中的最小點(diǎn)對(duì)距離:δLδR,記SL和SR中最小點(diǎn)對(duì)距離δ = min(δLδR),如圖1:

???

???? 以L為中心,δ為半徑劃分一個(gè)長(zhǎng)帶,最小點(diǎn)對(duì)還有可能存在于SL和SR的交界處如下圖2左圖中的虛線帶,p點(diǎn)和q點(diǎn)分別位于SL和SR的虛線范圍內(nèi),在這個(gè)范圍內(nèi),p點(diǎn)和q點(diǎn)之間的距離才會(huì)小于δ,最小點(diǎn)對(duì)計(jì)算才有意義。

????

?

?

?

?

?

Figure 2

?

?

????? 對(duì)于SL虛框范圍內(nèi)的p點(diǎn),在SR虛框中與p點(diǎn)距離小于δ的頂多只有六個(gè)點(diǎn),就是圖二右圖中的2個(gè)正方形的6的頂點(diǎn)。這個(gè)可以反推證明,如果右邊這2個(gè)正方形內(nèi)有7個(gè)點(diǎn)與p點(diǎn)距離小于δ,例如q點(diǎn),則q點(diǎn)與下面正方形的四個(gè)頂點(diǎn)距離小于δ,則和δSLSR的最小點(diǎn)對(duì)距離相矛盾。因此對(duì)于SL虛框中的p點(diǎn),不需求出p點(diǎn)和右邊虛線框內(nèi)所有點(diǎn)距離,只需計(jì)算SR與p點(diǎn)y坐標(biāo)距離最近的6個(gè)點(diǎn),就可以求出最近點(diǎn)對(duì),節(jié)省了比較次數(shù)。

(否則的話,最壞情形下,SR虛框中有可能會(huì)有n/2個(gè)點(diǎn),對(duì)于SL虛框中的p點(diǎn),每次要比較n/2次,浪費(fèi)了算法的效率

???? 代碼描述:

???? 1)對(duì)點(diǎn)集S的點(diǎn)x坐標(biāo)和y坐標(biāo)進(jìn)行升序排序,獲得點(diǎn)集Sx和Sy

???? 2)令δ=∞;?? //δ為最小點(diǎn)位距離

???? 3)Divide_conquer(Sx,Syδ)? //分治法

???????????? if (Sx.count=1) then δ=∞;?? //如果Sx中只有一個(gè)點(diǎn),則δ=

????????????????? return δ;

???????????? else if(Sx.count=2 and d(Sx.[0],Sx.[1])<δ//如果Sx中只有2個(gè)點(diǎn),則δ為兩點(diǎn)之間距離

?????????????????? δ=d(Sx.[0],)Sx.[1]);?

?????????????????? return δ;

???????????? else??? //如果Sx中多于2個(gè)點(diǎn),則Sx,Sy分治,以中心點(diǎn)畫(huà)線,將Sx分為左右兩部分SxLSxRSy分為SyLSyR

?????????????????? j1=1,j2=1,k1=1,k2=1;

?????????????????? mid = Sx.count/2;? //midSx中的中間點(diǎn)點(diǎn)號(hào)

?????????????????? L = Sx.[mid].x;???? //LSx中的中間點(diǎn)x坐標(biāo)

?????????????????? for(i=1,i<Sx.count,i++)

?????????????????? {

???????????????????????? if(i<=mid)??? //將Sx中間線以左地方的點(diǎn)存入到SxL,新數(shù)組保持原來(lái)的升序性質(zhì)

??????????????????????????????? SxL[k1] = Sx[i]?? k1++;

???????????????????????? else?? //將Sx中間線以右的地方的點(diǎn)存入到SxR數(shù)組保持原來(lái)的升序性質(zhì)

??????????????????????????????? SxR.count[k2] = Sx[i]?? k2++;

???????????????????????? if(Sy[i].x <L)?? //將Sy中間線以左地方的點(diǎn)存入到SyL數(shù)組保持原來(lái)的升序性質(zhì)

??????????????????????????????? SyL[j1] = Sx[i]?? j1++;

?

???????????????????????? else?? //將Sy中間線以右地方的點(diǎn)存入到SyR數(shù)組保持原來(lái)的升序性質(zhì)

?

??????????????????????????????? SyR[j2] = Sx[i]?? j2++;

?

?

?????????????????? }

????????????? δL = Divide_conquer(SxL,SyLδ);??? //獲取Sx中的的最小點(diǎn)位距離δL

?

????????????? δR = Divide_conquer(SxR,SyRδ);?? //獲取Sy中的的最小點(diǎn)位距離δR

????????????? δ= min (δL,δR);

????????????? δ=merge(SyL,SyRδ);?? //獲SxSy交界處的最小點(diǎn)位距離,并綜合 δLδR 求出點(diǎn)集的最小點(diǎn)位距離δ

????? return δ;

?

????? 函數(shù)merge(SyL,SyRδ)

????? merge(SyL,SyRδ)

????? {

????????? i1=1,i2=1;

????????? for(i=1,i<SyL.count,i++)?? //獲取SyL中在左邊虛框(距離小于δ)內(nèi)的點(diǎn),存入到S'yL數(shù)組保持原來(lái)的升序性質(zhì)

????????? {

????????????? if(SyL[i].x>L-δ)

????????????????? then S'yL[i1]= SyL[i], i1++,

?????????? }

????????? for(i=1,i<SyR.count,i++)? //獲取SyR中在右邊虛框(距離小于δ)內(nèi)的點(diǎn),存入到S'yR數(shù)組保持原來(lái)的升序性質(zhì)

????????? {

????????????? if(SyR[i].x<L+δ)

????????????? then S'yR[i2]= SyR[i], i2++,

????????? }

?

????????? t=1;

????????? for(i=1,i<S'yL.count,i++)

?????????? {?????

??????????????? while(S'yR[t].y< S'yL[t].y and t < SyR.count)? //獲取點(diǎn)集S'yR內(nèi)距離點(diǎn)S'yL[t]y坐標(biāo)最接近的點(diǎn)號(hào)

??????????????? { t++; }

??????????????? for( j= max(1,t-3), j<=min(t+3,S'yR.count),j++)?? //計(jì)算S'yR中的點(diǎn)與S'yL[t]y坐標(biāo)相鄰的六個(gè)點(diǎn)的距離

??????????????? {

????????????????????? if(d(S'yL[i],S'yL[j])<δ)??? //如果前兩點(diǎn)之間距離小于δ

????????????????????? then δ = d(S'yL[i],S'yL[j]);?? //則最小點(diǎn)位距離δ為當(dāng)前兩點(diǎn)之間距離

??????????????? }

????????? return δ

????? }

?

3)算法時(shí)間復(fù)雜度:

????? 首先對(duì)點(diǎn)集S的點(diǎn)x坐標(biāo)和y坐標(biāo)進(jìn)行升序排序,需要循環(huán)2nlogn次,復(fù)雜度為O(2nlogn)

????? 接下來(lái)在分治過(guò)程中,對(duì)于每個(gè)S'yL中的點(diǎn),都需要與S'yR中的6個(gè)點(diǎn)進(jìn)行比較

??????????? O(n)= 2O(n/2) + (n/2)*6? (一個(gè)點(diǎn)集劃分為左右兩個(gè)點(diǎn)集,時(shí)間復(fù)雜度為左右兩個(gè)點(diǎn)集加上中間區(qū)域運(yùn)算之和)

????? 其解為O(n)< O(3nlogn)

???? 因此總的時(shí)間復(fù)雜度為O(3nlogn),比蠻力法的O(n2)要高效。

?

?

例題:http://acm.hdu.edu.cn/showproblem.php?pid=1007

參考代碼:http://www.cnblogs.com/hate13/p/4160111.html

轉(zhuǎn)載于:https://www.cnblogs.com/hate13/p/4160056.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的[转] 最近点对距离问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。