最近對問題遞歸與分治算法_第1頁
最近對問題遞歸與分治算法_第2頁
最近對問題遞歸與分治算法_第3頁
最近對問題遞歸與分治算法_第4頁
最近對問題遞歸與分治算法_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗1 遞歸與分治算法一,實驗?zāi)康暮鸵螅?)進(jìn)一步掌握遞歸算法的設(shè)計思想以及遞歸程序的調(diào)試技術(shù);(2)理解這樣一個觀點:分治與遞歸經(jīng)常同時應(yīng)用在算法設(shè)計之中。(3)分別用蠻力法和分治法求解最近對問題;(4)分析算法的時間性能,設(shè)計實驗程序驗證分析結(jié)論。 二,實驗內(nèi)容設(shè)p1=(x1, y1), p2=(x2, y2), , pn=(xn, yn)是平面上n個點構(gòu)成的集合s,設(shè)計算法找出集合s中距離最近的點對。三,實驗環(huán)境 turbo c 或vc+四,實驗學(xué)時 2學(xué)時,必做實驗五,數(shù)據(jù)結(jié)構(gòu)與算法#include#include#define true 1#define false 0typede

2、f struct node double x; double y;node; /坐標(biāo)typedef struct list node* data; /點 int count; /點的個數(shù)list;typedef struct closenode node a; node b; /計算距離的兩個點 double space; /距離平方closenode;int n; /點的數(shù)目/輸入各點到list中void create(list &l) coutn; l.count=n; l.data = new nodel.count; /動態(tài)空間分配 cout輸入各點坐標(biāo) :x_y):endl; for

3、(int i=0;il.datai.xl.datai.y;/求距離的平方double square(node a,node b) return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);/蠻力法void bruteforce(const list &l,closenode &cnode,int begin,int end) for(int i=begin;i=end;+i) for(int j=i+1;j=end;+j) double space=square(l.datai,l.dataj); if(spacecnode.space) cnode.a=l

4、.datai; cnode.b=l.dataj; cnode.space=space; /冒泡排序void bubblesort(node r,int length)int change,n;n=length;change=true;double b,c;for(int i=0;in-1&change;+i)change=false;for(int j=0;jrj+1.x)b=rj.x;c=rj.y;rj.x=rj+1.x;rj.y=rj+1.y;rj+1.x=b;rj+1.y=c; change=true;/分治法中先將坐標(biāo)按x軸從小到大的順序排列void paixu(list l) bub

5、blesort(l.data,l.count); /調(diào)用冒泡排序/左右各距中線d的區(qū)域的最近對算法void middle(const list & l,closenode &cnode,int mid,double midx) int i,j; /分別表示中線左邊,右邊的點 double d=sqrt(cnode.space); i=mid; while(i=0&l.datai.x=(midx-d) /在左邊的d區(qū)域內(nèi) j=mid; while(l.data+j.x=(midx+d)&j=l.count) /在右邊的d區(qū)域內(nèi) if(l.dataj.y(l.datai.y+d) /判斷縱坐標(biāo)是否

6、在左邊某固定點的2d區(qū)域內(nèi) continue; double space = square(l.datai,l.dataj); if(cnode.spacespace) /在滿足條件的區(qū)域內(nèi)依次判斷 cnode.a=l.datai; cnode.b=l.dataj; cnode.space=space; -i; /分治法求最近對void divideconquer(const list &l,closenode &closenode,int begin,int end)if(begin!=end) int mid = (begin+end)/2; /排列后的中間的那個點 double midx

7、 = l.datamid.x; divideconquer(l,closenode,begin,mid); /繼續(xù)在左半邊用分治法求最近對 divideconquer(l,closenode,mid+1,end); /繼續(xù)在右半邊用分治法求最近對 middle(l,closenode,mid,midx); /判斷左右各距中線d的區(qū)域,是否有最近對void main() /初始化 list list; closenode closenode; closenode.space = 10000; /最近點的距離 create(list); /輸入各點到nlist中 cout各點坐標(biāo)為:endl; f

8、or(int i=0;ilist.count;+i) coutx=list.datai.x y=list.datai.yn; bruteforce(list,closenode,0,list.count-1); cout用蠻力法求最近對:endl; cout最近對為點 (closenode.a.x,closenode.a.y)和點(closenode.b.x,closenode.b.y)n最近距離為: sqrt(closenode.space)endl; coutendlendl; cout用分治法求最近對:endl; paixu(list); cout經(jīng)過排序后的各點:endl; for(i

9、nt j=0;jlist.count;+j) coutx=list.dataj.x y=list.dataj.yn; divideconquer(list,closenode,0,list.count-1); cout最近對為點 (closenode.a.x,closenode.a.y)和點(closenode.b.x,closenode.b.y)n最近距離為: sqrt(closenode.space)=0&l.datai.x=(midx-d) /在左邊的d區(qū)域內(nèi) j=mid; while(l.data+j.x=(midx+d)&j=l.count) /在右邊的d區(qū)域內(nèi) if(l.dataj

10、.y(l.datai.y+d) /判斷縱坐標(biāo)是否在左邊某固定點的2d區(qū)域內(nèi) continue; double space = square(l.datai,l.dataj); if(cnode.spacespace) /在滿足條件的區(qū)域內(nèi)依次判斷 cnode.a=l.datai; cnode.b=l.dataj; cnode.space=space; -i; /分治法求最近對void divideconquer(const list &l,closenode &closenode,int begin,int end)if(begin!=end) int mid = (begin+end)/2; /排列后的中間的那個點 double midx = l.datamid.x; divideconquer(l,closenode,begin,mid); /繼續(xù)在左半邊用分治法求最近對 divideconquer(l,closenode,mid+1,end); /繼續(xù)在右半邊用分治法求最近對 middle(l,closenode,mid,midx); /判斷左右各距中線d的區(qū)域,是否有最近對七,實驗結(jié)果八,實驗體會通過這次實驗,我深刻了解到分治法的實用性,有效性。當(dāng)遇到規(guī)模較大的問題,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論