《算法設計與分析》實驗指導書.doc_第1頁
《算法設計與分析》實驗指導書.doc_第2頁
《算法設計與分析》實驗指導書.doc_第3頁
《算法設計與分析》實驗指導書.doc_第4頁
《算法設計與分析》實驗指導書.doc_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

算法設計與分析實驗指導書本書是為配合算法分析與設計實踐教學大綱而編寫的上機指導,其目的是使學生消化理論知識,加深對講授內容的理解,尤其是一些算法的實現及其應用,培養學生獨立編程和調試程序的能力,使學生對算法的分析與設計有更深刻的認識。上機實驗一般應包括以下幾個步驟:(1)、準備好上機所需的程序。手編程序應書寫整齊,并經人工檢查無誤后才能上機。(2)、上機輸入和調試自己所編的程序。一人一組,獨立上機調試,上機時出現的問題,最好獨立解決。(3)、上機結束后,整理出實驗報告。實驗報告應包括:題目、程序清單、運行結果、對運行情況所作的分析。目錄實驗一 統計數字及字符編碼(2學時)1實驗二 蠻力法(2學時)3實驗三 遞歸與分治法(2學時)5實驗四 貪心算法(2學時)8實驗五 回溯算法(2學時)10實驗六 分支限界法(2學時)12實驗七 動態規劃算法(3學時)15實驗一 統計數字及字符編碼(2學時)一、實驗目的與要求1、掌握算法的計算復雜性概念。 2、掌握算法漸近復雜性的數學表述。 3、掌握用C+語言描述算法的方法。 4實現具體的編程與上機實驗驗證算法的時間復雜性函數二、實驗內容 1、統計數字問題 1)問題描述一本書的頁碼從自然數1 開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多余的前導數字0。例如,第6頁用數字6表示而不是06或006等。數字計數問題要求對給定書的總頁碼n計算出書的全部頁碼中分別用到多少次數字0、1、2、9。 2)編程任務給定表示書的總頁碼的10 進制整數n (1n109) 。編程計算書的全部頁碼中分別用到多少次數字0、1、2、9。3)程序算法將頁碼數除以10,得到一個整數商和余數,商就代表頁碼數減余數外有多少個19作為個位數,余數代表有1余數本身這么多個數作為剩余的個位數。此外,商還代表1商本身這些數出現了10次,余數還代表剩余的沒有計算的商的大小的數的個數。把這些結果統計起來即可。2、字典序問題1)問題描述在數據加密和數據壓縮中常需要對特殊的字符串進行編碼。給定的字母表A 由26 個小 寫英文字母組成A=a,b,z。該字母表產生的升序字符串是指字符串中字母按照從左到 右出現的次序與字母在字母表中出現的次序相同,且每個字符最多出現1 次。例如, a,b,ab,bc,xyz 等字符串都是升序字符串。現在對字母表A 產生的所有長度不超過6 的升序 字符串按照字典序排列并編碼如下。12262728abzabac對于任意長度不超過6 的升序字符串,迅速計算出它在上述字典中的編碼。算法設計:對于給定的長度不超過6 的升序字符串,計算出它在上述字典中的編碼。 數據輸入:輸入數據由文件名為input.txt的文本文件提供。文件的第一行是一個正整數k,表示接 下來共有k行。接下來的k 行中,每行給出一個字符串。結果輸出:將計算結果輸出到文件output.txt中。文件共有k 行,每行對應于一個字符串的編碼。實驗二 蠻力法(2學時)一、實驗目的與要求1、 掌握蠻力法的基本思想2、 使用蠻力法解決具體問題(通常,問題規模比較小時,此方法才有意義)二、實驗內容 1、用C+/C編寫程序實現BF算法,進行模式匹配。以下是該算法的偽代碼,請進行調試。int BF(char S , char T ) i=0; j=0; while (istrlen(S) & j=strlen(T) return (i-j); else return 0;2、用C+/C編寫程序實現KMP算法,進行模式匹配。 求模式串T的Next數組void GetNext(char T , int next ) next1=0; j=1; k=0; while (jT0) if (k= =0)| |(Tj= =Tk) j+; k+; nextj=k; else k=nextk; KMP算法偽代碼1. 在串S和串T中分別設比較的起始下標i和j; 2. 循環直到S中所剩字符長度小于T的長度或T中所有字符均比較完畢 2.1 如果Si=Tj,則繼續比較S和T的下一個字符;否則 2.2 將j向右滑動到nextj位置,即j=nextj; 2.3 如果j=0,則將ii+1,j=1,準備下一趟比較; 3. 如果T中所有字符均比較完畢,則返回匹配的起始下標;否則返回03、以源串“ababcabccabccacbab”和模式串”abccac”w為例,編寫程序,給出采用BF算法和KMP算法進行串匹配過程中的字符比較次數。實驗三 遞歸與分治法(2學時)基本題一:基本遞歸算法一、實驗目的與要求1、 熟悉C/C+語言的集成開發環境;2、 通過本實驗加深對遞歸過程的理解二、實驗內容:掌握遞歸算法的概念和基本思想,分析并掌握“整數劃分”問題的遞歸算法。三、實驗題任意輸入一個整數,輸出結果能夠用遞歸方法實現整數的劃分。四、實驗步驟1 理解算法思想和問題要求;2 編程實現題目要求;3 上機輸入和調試自己所編的程序;4 驗證分析實驗結果;5 整理出實驗報告。基本題二:棋盤覆蓋問題一、實驗目的與要求1、掌握棋盤覆蓋問題的算法;2、初步掌握分治算法二、實驗題: 盤覆蓋問題:在一個2k2k 個方格組成的棋盤中,恰有一個方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。三、實驗提示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) / 特殊方格在此棋盤中 chessBoard(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 = tc + s) / 特殊方格在此棋盤中 chessBoard(tr, tc+s, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋左下角boardtr + s - 1tc + s = t; / 覆蓋其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s); / 覆蓋左下角子棋盤 if (dr = tr + s & dc = tr + s & dc = tc + 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); 提高題一:二分搜索一、實驗目的與要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、實驗題1、設a0:n-1是一個已排好序的數組。請改寫二分搜索算法,使得當搜索元素x不在數組中時,返回小于x的最大元素的位置I和大于x的最小元素位置j。當搜索元素在數組中時,I和j相同,均為x在數組中的位置。2、設有n個不同的整數排好序后存放于t0:n-1中,若存在一個下標I,0in,使得ti=i,設計一個有效的算法找到這個下標。要求算法在最壞的情況下的計算時間為O(logn)。三、實驗提示1、用I,j做參數,且采用傳遞引用或指針的形式帶回值。bool BinarySearch(int a,int n,int x,int& i,int& j) int left=0; int right=n-1; while(leftamid) 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(leftamid) right=mid-1; else left=mid+1; return -1;提高題二: 用分治法實現元素選擇一、實驗要求與目的1、了解分治法的基本思想,掌握遞歸程序編寫方法;2、使用分治法編程,求解線形序列中第k小元素。二、實驗內容1、 給定線形序列集中n個元素和一個整數k,1kn,輸出這n個元素中第k小元素的值及其位置。2、 簡述該算法的原理、步驟。對該算法與直接排序查找進行比較。3、 編寫并調試程序。測試要求:元素個數不少于100;分三種情況:k=1、k=n和k=中位數。實驗四 貪心算法(2學時)基本題一:多機調度問題一、實驗目的與要求1、熟悉多機調度問題的算法;2、初步掌握貪心算法;二、實驗題 要求給出一種作業調度方案,使所給的n個作業在盡可能短的時間內由m臺機器加工處理完成。約定,每個作業均可在任何一臺機器上加工處理,但未完工前不允許中斷處理。作業不能拆分成更小的子作業。三、實驗提示1、把作業按加工所用的時間從大到小排序2、如果作業數目比機器的數目少或相等,則直接把作業分配下去3、如果作業數目比機器的數目多,則每臺機器上先分配一個作業,如下的作業分配時,是選那個表頭上s最小的鏈表加入新作業。typedef struct Job int ID;/作業號 int time;/作業所花費的時間Job;typedef struct JobNode /作業鏈表的節點 int ID; int time; JobNode *next;JobNode,*pJobNode;typedef struct Header /鏈表的表頭 int s; pJobNode next;Header,pHeader;int SelectMin(Header* M,int m) int k=0; for(int i=1;im;i+) if(Mi.shalf)|(t*(t-1)/2-counthalf) return; if (tn) sum+; else for (int i=0;i2;i+) p1t=i; count+=i; for (int j=2;j=t;j+) pjt-j+1=pj-1t-j+1pj-1t-j+2; count+=pjt-j+1; Backtrack(t+1); for (int j=2;j=t;j+) count-=pjt-j+1; count-=i; 基本題二:01背包問題一、實驗目的與要求1、掌握01背包問題的回溯算法;2、進一步掌握回溯算法;二、實驗題:給定n種物品和一背包。物品i的重量是wi,其價值為vi,背包的容量為C。問應如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?三、實驗提示templateTypep Knap:Bound(int i)/ 計算上界 Typew cleft = c - cw; / 剩余容量 Typep b = cp; / 以物品單位重量價值遞減序裝入物品 while (i = n & wi = cleft) cleft -= wi; b += pi; i+; / 裝滿背包 if (i H(1000); T *MinOut = new T n+1; / 計算MinOut = 離開頂點i的最小耗費邊的耗費 T MinSum = 0; / 離開頂點i的最小耗費邊的數目 for (int i = 1; i = n; i+) T Min = NoEdge; for (int j = 1; j = n; j+) if (aj != NoEdge & (aj Min | Min = NoEdge) Min = aj;if (Min = NoEdge) return NoEdge; / 此路不通 MinOut = Min; MinSum += Min; / 把E-節點初始化為樹根 MinHeapNode E; E.x = new int n; for (i = 0; i n; i+) E.x = i + 1; E.s = 0; / 局部旅行路徑為x 1 : 0 E.cc = 0; / 其耗費為0E.rcost = MinSum; T bestc = NoEdge; / 目前沒有找到旅行路徑 / 搜索排列樹 while (E.s n - 1) / 不是葉子 if (E.s = n - 2) / 葉子的父節點 / 通過添加兩條邊來完成旅行 / 檢查新的旅行路徑是不是更好 if (aE.xn-2E.xn-1 != NoEdge & aE.xn-11 != NoEdge & (E.cc + aE.xn-2E.xn-1 + aE.xn-11 bestc | bestc = NoEdge) / 找到更優的旅行路徑 bestc = E.cc + aE.xn-2E.xn-1 + aE.xn-11; E.cc = bestc; E.lcost = bestc; E . s + + ; H . I n s e r t ( E ) ; else delete E.x; else / 產生孩子 for (int i = E.s + 1; i n; i+) if (aE.xE.sE.x != NoEdge) / 可行的孩子, 限定了路徑的耗費 T cc = E.cc + aE.xE.sE.x; T rcost = E.rcost - MinOutE.xE.s; T b = cc + rcost; /下限if (b bestc | bestc = NoEdge) / 子樹可能有更好的葉子 / 把根保存到最大堆中 MinHeapNode N; N.x = new int n; for (int j = 0; j n; j+) N.xj = E.xj; N.xE.s+1 = E.x; N.x = E.xE.s+1; N.cc = cc; N.s = E.s + 1; N.lcost = b; N.rcost = rcost; H . I n s e r t ( N ) ; / 結束可行的孩子 delete E.x; / 對本節點的處理結束 try H.DeleteMin(E); / 取下一個E-節點 catch (OutOfBounds) break; / 沒有未處理的節點 if (bestc = NoEdge) return NoEdge; / 沒有旅行路徑 / 將最優路徑復制到v1:n 中for (i = 0; i n; i+) vi+1 = E.x; while (true) /釋放最小堆中的所有節點 delete E.x; try H.DeleteMin(E); catch (OutOfBounds) break; return bestc; 實驗七 動態規劃算法(3學時)基本題一:最長公共子序列問題一、實驗目的與要求1、熟悉最長公共子序列問題的算法;2、初步掌握動態規劃算法;二、實驗題 若給定序列X=x1,x2,xm,則另一序列Z=z1,z2,zk,是X的子序列是指存在一個嚴格遞增下標序列i1,i2,ik使得對于所有j=1,2,k有:zj=xij。例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相應的遞增下標序列為2,3,5,7。給定2個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。給定2個序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最長公共子序列。 三、實驗提示include stdlib.h#include string.hvoid LCSLength(char *x ,char *y,int m,int n, int *c, int *b) int i ,j; for (i = 1; i = m; i+) ci0 = 0; for (i = 1; i = n; i+) c0i = 0; for (i = 1; i = m; i+) for (j = 1; j =cij-1) cij=ci-1j; bij=2; else cij=cij-1; bij=3; void LCS(int

溫馨提示

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

評論

0/150

提交評論