版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上武漢輕工大學(xué)數(shù)學(xué)與計算機(jī)學(xué)院算法分析實驗報告指導(dǎo)老師: 湯小月 專 業(yè): 信息管理與信息系統(tǒng) 班 級: 信管1201班 學(xué) 號: 姓 名: 實驗一 分治與遞歸(2學(xué)時)基本題一:基本遞歸算法一、實驗?zāi)康呐c要求1、 熟悉C/C+語言的集成開發(fā)環(huán)境;2、 通過本實驗加深對遞歸過程的理解二、實驗內(nèi)容:掌握遞歸算法的概念和基本思想,分析并掌握“整數(shù)劃分”問題的遞歸算法。三、實驗題任意輸入一個整數(shù),輸出結(jié)果能夠用遞歸方法實現(xiàn)整數(shù)的劃分。具體程序代碼如下:#include<iostream>using namespace std;int q(int n,int m)
2、/正整數(shù)n的最大加數(shù)m的劃分?jǐn)?shù)if(n<1)|(m<1) return 0; /n,m需>1if(n=1)|(m=1) return 1; /正整數(shù)或者最大加數(shù)=1時,只有一種劃分情況if(n<m) return q(n,n); /最大加數(shù)實際不能大于正整數(shù)本身if(n=m) return q(n,m-1)+1; /遞歸,n的劃分由其q(n,m-1)和n1=n組成return q(n,m-1)+q(n-m,m); /正整數(shù)n的最大加數(shù)n1不大于m的劃分由n1=m的劃分和n1=m-1的劃分組成void main()int n,m;cout<<"請輸入
3、一個整數(shù)n(-1退出):"<<endl;cin>>n;while(n>=1)cout<<"請輸入一個最大加數(shù)m:"<<endl;cin>>m;cout<<"正整數(shù)n的最大加數(shù)m的劃分?jǐn)?shù)為"<<q(n,m)<<endl;cout<<"請輸入一個整數(shù)n(-1退出):"<<endl;cin>>n;進(jìn)行編譯如下:運行結(jié)果如下:四、實驗步驟1 理解算法思想和問題要求;2 編程實現(xiàn)題目要求;3 上機(jī)輸
4、入和調(diào)試自己所編的程序;4 驗證分析實驗結(jié)果;5 整理出實驗報告。 基本題二:棋盤覆蓋問題一、實驗?zāi)康呐c要求1、掌握棋盤覆蓋問題的算法;2、初步掌握分治算法二、實驗題: 盤覆蓋問題:在一個2k×2k 個方格組成的棋盤中,恰有一個方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態(tài)的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。三、實驗提示void chessBoard(int tr, int tc, int dr, int dc, int siz
5、e) if (size = 1) return; int t = tile+, / L型骨牌號 s = size/2; / 分割棋盤 / 覆蓋左上角子棋盤 if (dr < tr + s && dc &l
6、t; tc + s) / 特殊方格在此棋盤中 chessBoard(tr, tc, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋右下角
7、60; boardtr + s - 1tc + s - 1 = t; / 覆蓋其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s); / 覆蓋右上角子棋盤 if (dr < tr + s && dc >= tc +
8、s) / 特殊方格在此棋盤中 chessBoard(tr, tc+s, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋左下角boardtr + s - 1tc + s = t; &
9、#160; / 覆蓋其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s); / 覆蓋左下角子棋盤 if (dr >= tr + s && dc < tc + s)
10、60; / 特殊方格在此棋盤中 chessBoard(tr+s, tc, dr, dc, s); else / 用 t 號L型骨牌覆蓋右上角 boardtr + stc + s - 1 = t; / 覆蓋其余方格
11、160; chessBoard(tr+s, tc, tr+s, tc+s-1, s); / 覆蓋右下角子棋盤 if (dr >= tr + s && dc >= tc + s) / 特殊方格在此棋盤中 chess
12、Board(tr+s, tc+s, dr, dc, s); else / 用 t 號L型骨牌覆蓋左上角 boardtr + stc + s = t; / 覆蓋其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s);
13、0; 編寫程序代碼如下:#include <iostream> using namespace std; int board6565,tile; /* tile 為紙片編號*/ void chessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) return; int t = tile+, / L型骨牌號 s = size/2; / 分割棋盤 / 覆蓋左上角子棋盤 if (dr < tr + s && dc < tc + s) / 特殊方格在此棋盤中 chessBoa
14、rd(tr, tc, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋右下角 boardtr + s - 1tc + s - 1 = t; / 覆蓋其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s); / 覆蓋右上角子棋盤 if (dr < tr + s && dc >= tc + s) / 特殊方格在此棋盤中 chessBoard(tr, tc+s, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋左下角 boardtr + s - 1tc + s = t;
15、/ 覆蓋其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s); / 覆蓋左下角子棋盤 if (dr >= tr + s && dc < tc + s) / 特殊方格在此棋盤中 chessBoard(tr+s, tc, dr, dc, s); else / 用 t 號L型骨牌覆蓋右上角 boardtr + stc + s - 1 = t; / 覆蓋其余方格 chessBoard(tr+s, tc, tr+s, tc+s-1, s); / 覆蓋右下角子棋盤 if (dr >= tr + s && dc >= t
16、c + s) / 特殊方格在此棋盤中 chessBoard(tr+s, tc+s, dr, dc, s); else / 用 t 號L型骨牌覆蓋左上角 boardtr + stc + s = t; / 覆蓋其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s); /輸出最終的結(jié)果void result(int b65,int n) int i,j; for(i=1;i<=n;i+) for(j=1;j<=n;j+) cout<<bij<<" " cout<<endl; int main() int
17、 size,dr,dc; cout<<"選擇輸入4種不同形態(tài)的L型骨牌中的一種(4/8/16/64): "<<endl;cin>>size;cout<<"請輸入特殊的塊的位置(x,y): "<<endl;cin>>dr>>dc;cout<<"結(jié)果如下:"<<endl; boarddrdc=-1; tile+; chessBoard(1,1,dr,dc,size); result(board,size); 運行調(diào)試結(jié)果如下:試運行
18、結(jié)果如下: 提高題一:二分搜索一、實驗?zāi)康呐c要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、實驗題1、設(shè)a0:n-1是一個已排好序的數(shù)組。請改寫二分搜索算法,使得當(dāng)搜索元素x不在數(shù)組中時,返回小于x的最大元素的位置I和大于x的最小元素位置j。當(dāng)搜索元素在數(shù)組中時,I和j相同,均為x在數(shù)組中的位置。2、設(shè)有n個不同的整數(shù)排好序后存放于t0:n-1中,若存在一個下標(biāo)I,0in,使得ti=i,設(shè)計一個有效的算法找到這個下標(biāo)。要求算法在最壞的情況下的計算時間為O(logn)。三、實驗提示1、用I,j做參數(shù),且采用傳遞引用或指針的形式帶回值。bool BinarySearch(int a,
19、int n,int x,int& i,int& j) int left=0; int right=n-1; while(left<right) int mid=(left+right)/2; if(x=amid)
20、 i=j=mid; return true; if(x>amid) left=mid+1; &
21、#160; else right=mid-1;2 i=right; j=left; return false;int SearchTag(int a,int n,int x) int left=0; int right=n-1;
22、0; while(left<right) int mid=(left+right)/2; if(x=amid) return mid; if(x>amid) right=mid-1; &
23、#160; else left=mid+1; return -1;實驗題1代碼編寫如下:#include<iostream> using namespace std; void BubbleSort(int* pData,int Count) /冒泡排序的函數(shù),pData中從0位置處存了Count個數(shù),該函數(shù)將數(shù)組中元素排序 int iTemp; for
24、(int i=1;i<Count;i+) for(int j=Count-1;j>=i;j-) if(pDataj<pDataj-1) iTemp = pDataj-1; pDataj-1 = pDataj; pDataj = iTemp; bool BinarySearch(int a,int n,int x,int& i,int& j) /數(shù)組a大小為n,數(shù)組中存放了已經(jīng)排好序(升序)的數(shù)列 int left=0; int right=n-1; int mid=0; while(left<right) mid=(left+right)/2; if(x
25、=amid) i=j=mid; return true; if(x>amid) left=mid+1; else right=mid-1; i=right; j=left; return false; int SearchTag(int a,int n,int x) int left=0; int right=n-1; while(left<right) int mid=(left+right)/2; if(x=amid) return mid; if(x>amid) right=mid-1; else left=mid+1; return -1; int main() in
26、t a100; cout<<"請輸入數(shù)組中數(shù)的個數(shù),小于100:" int num=0; cin>>num; cout<<"請輸入數(shù)組中的數(shù):"<<endl; for(int i=0;i<num;i+) cin>>ai; /下面將數(shù)組a排成升序 BubbleSort(a,num); cout<<"下面輸出排序后的數(shù)組:"<<endl; for(i=0;i<num;i+) printf("%4d",ai); cout<
27、;<endl; cout<<"請輸入要查找的數(shù):" int x=0; cin>>x; int j=0; if(BinarySearch(a,num,x,i,j) cout<<"找到了,位置為"<<i<<endl; else cout<<"沒找到,小于該數(shù)的最大元素位置為"<<i<<"大于該數(shù)的最小元素的位置為"<<j<<"(第一個元素的位置為0)"<<endl
28、; return 0; 試運行調(diào)試結(jié)果如下:運行結(jié)果如下圖所示:實驗題2編寫代碼如下:#include<iostream> using namespace std; /*根據(jù)題目中的隱含要求,現(xiàn)在將問題進(jìn)行簡化,假設(shè)數(shù)組中存放的數(shù)全部為整數(shù)*/ void BubbleSort(int* pData,int Count) /冒泡排序的函數(shù),pData中從0位置處存了Count個數(shù), 該函數(shù)將數(shù)組中元素排升序 int iTemp; for(int i=1;i<Count;i+) for(int j=Count-1;j>=i;j-) if(pDataj<pDataj-1
29、) iTemp = pDataj-1; pDataj-1 = pDataj; pDataj = iTemp; bool BinaryFind_iei(int a,int n,int& i) /數(shù)組a大小為n,數(shù)組中存放了已經(jīng)排好序(升序)的數(shù)列 int left=0; int right=n-1; int mid=0; while(left<right) mid=(left+right)/2; if(mid=amid) i=mid; return true; /找到了 else if(mid>amid) left=mid; else right=mid; return fa
30、lse; int main() int a100; cout<<"請輸入數(shù)組中數(shù)的個數(shù),小于100:" int num=0; cin>>num; cout<<"請輸入數(shù)組中的數(shù):"<<endl; for(int ii=0;ii<num;ii+) cin>>aii; /下面將數(shù)組a排成升序 BubbleSort(a,num); cout<<"下面輸出排序后的數(shù)組:"<<endl; for(int i=0;i<num;i+) printf(&q
31、uot;%4d",ai); cout<<endl; int j=0; if(BinaryFind_iei(a,num,j) cout<<"找到了,位置為"<<j<<endl; else cout<<"不存在符合第i個位置等于i的元素。"<<endl; return 0; 試運行調(diào)試結(jié)果如下:運行結(jié)果如下:結(jié)果分析:利用分治策略求解時,所需時間取決于分解后子問題的個數(shù)、子問題的規(guī)模大小等素,而二分法,由于其劃分的簡單和均勻的特點,是經(jīng)常采用的一種有效的方法,例如二分法檢索。&
32、#160;提高題二: 用分治法實現(xiàn)元素選擇一、實驗要求與目的1、了解分治法的基本思想,掌握遞歸程序編寫方法;2、使用分治法編程,求解線形序列中第k小元素。二、實驗內(nèi)容1、 給定線形序列集中n個元素和一個整數(shù)k,1kn,輸出這n個元素中第k小元素的值及其位置。2、 簡述該算法的原理、步驟。對該算法與直接排序查找進(jìn)行比較。3、 編寫并調(diào)試程序。測試要求:元素個數(shù)不少于100;分三種情況:k=1、k=n和k=中位數(shù)。編寫程序代碼如下所示:#include<stdlib.h> #include<time.h> #include<stdio.h>#include<
33、;malloc.h>int partition(int a,int p,int r) int z=p,x=r+1; int y=ap; int t; while(1) while(a+z<y&&z<r);/空循環(huán),不符合條件時向下執(zhí)行 while(a-x>y); if(z>=x) break; t=az; az=ax; ax=t; ap=ax; ax=y; return x;void quicksort(int a,int p,int r) int q; if(p<r) q=partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); int main() for(;)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB12T 598.5-2015 天津市建設(shè)項目用地控制指標(biāo) 第5部分:市政基礎(chǔ)設(shè)施項目
- 中職校長在新學(xué)期教職工大會上的講話稿(8篇)
- 個人自我小結(jié)
- 報關(guān)實務(wù)-教學(xué)課件 第四章 海關(guān)稅收
- 航空航天用帶沉頭窩的MJ螺紋減小型角形托板自鎖螺母 征求意見稿
- 老師培訓(xùn)課件教學(xué)課件
- 骨科的課件教學(xué)課件
- 怎么修改課件教學(xué)
- 2025 高考語文總復(fù)習(xí) 第三部分 語言文字運用(含解析)
- 關(guān)于項目工程實測實量質(zhì)量獎罰辦法的通知g
- 中醫(yī)院門診患者就診流程圖
- 外來文件管理規(guī)定
- 流體力學(xué)第二李玉柱范明順習(xí)題詳解
- 光伏大棚方案(共15頁)
- T梁架設(shè)及加固措施1
- 設(shè)備驗收報告
- 帶狀皰疹后神經(jīng)痛動物模型及其相關(guān)病理機(jī)制研究進(jìn)展
- 測量系統(tǒng)分析MSA表格
- (完整版)律師事務(wù)所律師辦理非訴訟業(yè)務(wù)規(guī)則
- 2019統(tǒng)編人教版高中物理必修第一冊第一章《運動的描述》全章節(jié)教案教學(xué)設(shè)計
- 煤礦開采學(xué)第六章采煤工作面礦山壓力規(guī)律
評論
0/150
提交評論