




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)1 遞歸與分治算法一,實(shí)驗(yàn)?zāi)康暮鸵螅?)進(jìn)一步掌握遞歸算法的設(shè)計(jì)思想以及遞歸程序的調(diào)試技術(shù);(2)理解這樣一個(gè)觀點(diǎn):分治與遞歸經(jīng)常同時(shí)應(yīng)用在算法設(shè)計(jì)之中。(3)分別用蠻力法和分治法求解最近對問題;(4)分析算法的時(shí)間性能,設(shè)計(jì)實(shí)驗(yàn)程序驗(yàn)證分析結(jié)論。 二,實(shí)驗(yàn)內(nèi)容設(shè)p1=(x1, y1), p2=(x2, y2), , pn=(xn, yn)是平面上n個(gè)點(diǎn)構(gòu)成的集合S,設(shè)計(jì)算法找出集合S中距離最近的點(diǎn)對。三,實(shí)驗(yàn)環(huán)境 Turbo C 或VC+四,實(shí)驗(yàn)學(xué)時(shí) 2學(xué)時(shí),必做實(shí)驗(yàn)五,數(shù)據(jù)結(jié)構(gòu)與算法#include<iostream.h>#include<cmath>#def
2、ine TRUE 1#define FALSE 0typedef struct Node double x; double y;Node; /坐標(biāo)typedef struct List Node* data; /點(diǎn) int count; /點(diǎn)的個(gè)數(shù)List;typedef struct CloseNode Node a; Node b; /計(jì)算距離的兩個(gè)點(diǎn) double space; /距離平方CloseNode;int n; /點(diǎn)的數(shù)目/輸入各點(diǎn)到List中void create(List &L) cout<<"請輸入平面上點(diǎn)的數(shù)目:n" cin>
3、;>n; L.count=n; L.data = new NodeL.count; /動態(tài)空間分配 cout<<"輸入各點(diǎn)坐標(biāo) :x_y):"<<endl; for(int i=0;i<L.count;+i) cin>>L.datai.x>>L.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,CloseNod
4、e &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(space<cnode.space) cnode.a=L.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=
5、0;i<n-1&&change;+i)change=FALSE;for(int j=0;j<n-i-1;+j)if(rj.x>rj+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) BubbleSort(L.data,L.count); /調(diào)用冒泡排序/左右各距中線d的區(qū)域的最近對算法void middle(const List & L,CloseNode &cnode,
6、int mid,double midX) int i,j; /分別表示中線左邊,右邊的點(diǎn) 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)|L.dataj.y>(L.datai.y+d) /判斷縱坐標(biāo)是否在左邊某固定點(diǎn)的2d區(qū)域內(nèi) continue; doub
7、le space = square(L.datai,L.dataj); if(cnode.space>space) /在滿足條件的區(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; /排列后的中間的那個(gè)點(diǎn) double midX = L.datamid.x;
8、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; /最近點(diǎn)的距離 create(list); /輸入各點(diǎn)到NList中 cout<<"各點(diǎn)坐標(biāo)為:"<
9、;<endl; for(int i=0;i<list.count;+i) cout<<"X="<<list.datai.x<<" Y="<<list.datai.y<<"n" BruteForce(list,closenode,0,list.count-1); cout<<"用蠻力法求最近對:"<<endl; cout<<"最近對為點(diǎn) ("<<closenode.a.x<
10、<","<<closenode.a.y<<")和點(diǎn)("<<closenode.b.x<<","<<closenode.b.y<<")n"<<"最近距離為: "<<sqrt(closenode.space)<<endl; cout<<endl<<endl; cout<<"用分治法求最近對:"<<endl; paixu(
11、list); cout<<"經(jīng)過排序后的各點(diǎn):"<<endl; for(int j=0;j<list.count;+j) cout<<"X="<<list.dataj.x<<" Y="<<list.dataj.y<<"n" DivideConquer(list,closenode,0,list.count-1); cout<<"最近對為點(diǎn) ("<<closenode.a.x<&
12、lt;","<<closenode.a.y<<")和點(diǎn)("<<closenode.b.x<<","<<closenode.b.y<<")n"<<"最近距離為: "<<sqrt(closenode.space)<<endl;六,核心源代碼 /左右各距中線d的區(qū)域的最近對算法void middle(const List & L,CloseNode &cnode,int mid,
13、double midX) int i,j; /分別表示中線左邊,右邊的點(diǎn) 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)|L.dataj.y>(L.datai.y+d) /判斷縱坐標(biāo)是否在左邊某固定點(diǎn)的2d區(qū)域內(nèi) continue; double space
14、 = square(L.datai,L.dataj); if(cnode.space>space) /在滿足條件的區(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; /排列后的中間的那個(gè)點(diǎn) double midX = L.datamid.x; DivideConquer(L,closenode,begin,mid); /繼續(xù)在左半邊用分治法求最近對 DivideConquer(L,closenode,mid+1,end); /繼續(xù)在右半邊用分治法求最近對 middle(L,closenode,mid,midX); /判斷左右各距中線d
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)種植綜合實(shí)踐勞動計(jì)劃
- 玻璃制造原料投入計(jì)劃及保證措施
- 裝修工程勞動力時(shí)間安排計(jì)劃
- 湘少版三年級英語上冊課后輔導(dǎo)計(jì)劃
- 小學(xué)三年級第二學(xué)期班主任溝通技巧計(jì)劃
- 湘教版七年級下冊數(shù)學(xué)素養(yǎng)培養(yǎng)計(jì)劃
- 道德與法治模塊重點(diǎn)復(fù)習(xí)計(jì)劃
- 消毒供應(yīng)室院內(nèi)感染培訓(xùn)計(jì)劃
- 小學(xué)六年級數(shù)學(xué)分層輔差教學(xué)計(jì)劃
- 五年級生態(tài)環(huán)境保護(hù)教學(xué)計(jì)劃
- 2025年醫(yī)保知識考試題庫及答案:醫(yī)保信息化建設(shè)應(yīng)用法律法規(guī)試題
- 環(huán)境現(xiàn)場采樣培訓(xùn)
- 陜西省專業(yè)技術(shù)人員繼續(xù)教育2025公需課《黨的二十屆三中全會精神解讀與高質(zhì)量發(fā)展》20學(xué)時(shí)題庫及答案
- JC∕T 1083-2008 水泥與減水劑相容性試驗(yàn)方法
- 食品工程原理(李云飛)第二章ppt 傳熱
- 二氧化碳?xì)怏w保護(hù)焊.ppt
- 深圳市裝配式建筑住宅項(xiàng)目建筑面積獎(jiǎng)勵(lì)實(shí)施細(xì)則
- ADL常用評定量表
- 2019年北京市中考數(shù)學(xué)試題(含答案)
- 廣東某高層小區(qū)屋面飄板模板工程專項(xiàng)施工方案
- IPC-A-610F通用焊接標(biāo)準(zhǔn)(經(jīng)典實(shí)用)
評論
0/150
提交評論