演算法設計與分析之最近對問題

2021-08-19 06:57:31 字數 2385 閱讀 6614

設p1=(x1,y1),p2=(x2,y2),…,pn=(xn,yn)是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。

(1) 進一步掌握遞迴演算法的設計思想以及遞迴程式的除錯技術;

(2) 理解這樣乙個觀點:分治與遞迴經常同時應用在演算法設計之中。

(1) 分別用蠻力法和分治法求解最近對問題;

(2) 分析演算法的時間效能,設計實驗程式驗證分析結論。

(1)基本思想

蠻力法求解最近對問題的過程是:分別計算每一對點之間的距離,然後找出距離最小的那一對,為了避免對同一對點計算兩次距離,只考慮

i<

j i

<

j的那些點對(pi,pj)。

(2)演算法設計

struct point    

;

double closepoints(int n,point a,int &index1,int &index2)

}

} return dist;

}

(3)複雜度分析

演算法的基本操作是計算兩個點的歐幾里得距離。注意到在求歐幾里得距離時,避免了求平方根操作,其原因是:如果被開方的數越小,則它的平方根也越小。所以,演算法的基本操作就是求平方,其執行次數為: t(

n)=∑

i=1n

−1∑j

=i+1

n2=2

∑i=1

n−1(

n−i)

=n(n

−1)=

o(n2

) t(n

)=∑i

=1n−

1∑j=

i+1n

2=2∑

i=1n

−1(n

−i)=

n(n−

1)=o

(n2)

(1)基本思想

我們用分治法解決最近對問題,就是將集合s分成兩個子集s1和s2,每個子集中有n/2個點。然後在每個子集中遞迴的求其最接近的點對,在求出每個子集的最接近點對後,關鍵問題是如何實現分治法中的合併步驟,如果組成s的最接近點對的2個點都在s1中或都在s2中,則問題很容易解決。但是,如果這2個點分別在s1和s2中,則對於s1中任一點p,s2中最多只有n/2個點與它構成最接近點對的候選者,仍需計算才能得到準確結果。

(2)演算法設計

double divpoints(point p,int begin,int end)

double left=divpoints(p,begin,m);

double right=divpoints(p,m+1,end);

double d=min(left,right);

int k,l,flag=0;

//找到以m為中心的與m橫座標距離小於sqrt(d)的點

for(i=begin;i<=end;i++)

if((p[i].x-p[m].x) <= sqrt(d))

l=i;

}for (i=k;i<=m;i++)

}return d;

}

(3)複雜度分析

應用分治法求解含有n個點得最近對問題,其時間複雜性可由下面的遞推式表示:t(

n)=2

t(n/

2)+f

(n) t(n

)=2t

(n/2

)+f(

n)

合併子問題的解的時間f(

n)=o

(1) f(n

)=o(

1)

,由通用分治遞推式的主定理得, t(

n)=o

(nlo

g2n)

t (n

)=o(

nlog

2n

)隨機生成一定數量的點,分別用蠻力法和分治法求解最近對問題,統計演算法執行的時間。

點的個數

蠻力法求解時間

分治法求解時間

503.36422e-005s

8.86672e-005s

1000.000122309s

0.000157377s

5000.0029819s

0.00102267s

1000

0.0124858s

0.00237634s

5000

0.289743s

0.0132567s

從實驗結果可以看出,在點數規模較小時,蠻力法效率較高,當點數規模較大後,分治法效率明顯比蠻力法要高。

演算法分析與設計 最近點對問題

問題描述 最近對問題要求在包含有n個點的集合s中,找出距離最近的兩個點。設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面的n個點。嚴格地將,最近點對可能不止一對,此例輸出一對即可。基本演算法思想 暴力法 在蠻力法實現最近點對問題中,將問題簡化 距離最近的點對可能多於一對,找出一對即可...

演算法分析與設計 最近點對問題

問題分析 這個題目目前對於大家會有點難度,有興趣的同學可以研究一下,這種題目才是分治的精髓所在。前段時間 partychen 到吳涇去買東西,發現在步行街有乙個賭博遊戲,乙個商人在地面上擺放了很多的小禮品,然後準備了很多大小相同的圓環,玩家可以到商人處花 5 塊錢買乙個圓環。然後站在一根白線外使用圓...

演算法分析分治法之最近點對問題

分治法 將乙個難以解決的問題,分成多個規模較小的問題逐個擊破,並將解決的子問題進行合併得到母問題的解決方案。最近點對問題 1.題目描述 給定二維平面上n個點,找其中的一對點,使得在n個點組成的所有點對中,該點對間的距離最小 2.輸入描述 n3.輸出描述 最近點對距離,結果保留2位小數 4.輸入樣例 ...