已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
算法設(shè)計(jì)與分析實(shí)驗(yàn)指導(dǎo)書本書是為配合算法分析與設(shè)計(jì)實(shí)踐教學(xué)大綱而編寫的上機(jī)指導(dǎo),其目的是使學(xué)生消化理論知識(shí),加深對(duì)講授內(nèi)容的理解,尤其是一些算法的實(shí)現(xiàn)及其應(yīng)用,培養(yǎng)學(xué)生獨(dú)立編程和調(diào)試程序的能力,使學(xué)生對(duì)算法的分析與設(shè)計(jì)有更深刻的認(rèn)識(shí)。上機(jī)實(shí)驗(yàn)一般應(yīng)包括以下幾個(gè)步驟:(1)、準(zhǔn)備好上機(jī)所需的程序。手編程序應(yīng)書寫整齊,并經(jīng)人工檢查無誤后才能上機(jī)。(2)、上機(jī)輸入和調(diào)試自己所編的程序。一人一組,獨(dú)立上機(jī)調(diào)試,上機(jī)時(shí)出現(xiàn)的問題,最好獨(dú)立解決。(3)、上機(jī)結(jié)束后,整理出實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)報(bào)告應(yīng)包括:題目、程序清單、運(yùn)行結(jié)果、對(duì)運(yùn)行情況所作的分析。目錄實(shí)驗(yàn)一 統(tǒng)計(jì)數(shù)字及字符編碼(2學(xué)時(shí))1實(shí)驗(yàn)二 蠻力法(2學(xué)時(shí))3實(shí)驗(yàn)三 遞歸與分治法(2學(xué)時(shí))5實(shí)驗(yàn)四 貪心算法(2學(xué)時(shí))8實(shí)驗(yàn)五 回溯算法(2學(xué)時(shí))10實(shí)驗(yàn)六 分支限界法(2學(xué)時(shí))12實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃算法(3學(xué)時(shí))15實(shí)驗(yàn)一 統(tǒng)計(jì)數(shù)字及字符編碼(2學(xué)時(shí))一、實(shí)驗(yàn)?zāi)康呐c要求1、掌握算法的計(jì)算復(fù)雜性概念。 2、掌握算法漸近復(fù)雜性的數(shù)學(xué)表述。 3、掌握用C+語言描述算法的方法。 4實(shí)現(xiàn)具體的編程與上機(jī)實(shí)驗(yàn)驗(yàn)證算法的時(shí)間復(fù)雜性函數(shù)二、實(shí)驗(yàn)內(nèi)容 1、統(tǒng)計(jì)數(shù)字問題 1)問題描述一本書的頁(yè)碼從自然數(shù)1 開始順序編碼直到自然數(shù)n。書的頁(yè)碼按照通常的習(xí)慣編排,每個(gè)頁(yè)碼都不含多余的前導(dǎo)數(shù)字0。例如,第6頁(yè)用數(shù)字6表示而不是06或006等。數(shù)字計(jì)數(shù)問題要求對(duì)給定書的總頁(yè)碼n計(jì)算出書的全部頁(yè)碼中分別用到多少次數(shù)字0、1、2、9。 2)編程任務(wù)給定表示書的總頁(yè)碼的10 進(jìn)制整數(shù)n (1n109) 。編程計(jì)算書的全部頁(yè)碼中分別用到多少次數(shù)字0、1、2、9。3)程序算法將頁(yè)碼數(shù)除以10,得到一個(gè)整數(shù)商和余數(shù),商就代表頁(yè)碼數(shù)減余數(shù)外有多少個(gè)19作為個(gè)位數(shù),余數(shù)代表有1余數(shù)本身這么多個(gè)數(shù)作為剩余的個(gè)位數(shù)。此外,商還代表1商本身這些數(shù)出現(xiàn)了10次,余數(shù)還代表剩余的沒有計(jì)算的商的大小的數(shù)的個(gè)數(shù)。把這些結(jié)果統(tǒng)計(jì)起來即可。2、字典序問題1)問題描述在數(shù)據(jù)加密和數(shù)據(jù)壓縮中常需要對(duì)特殊的字符串進(jìn)行編碼。給定的字母表A 由26 個(gè)小 寫英文字母組成A=a,b,z。該字母表產(chǎn)生的升序字符串是指字符串中字母按照從左到 右出現(xiàn)的次序與字母在字母表中出現(xiàn)的次序相同,且每個(gè)字符最多出現(xiàn)1 次。例如, a,b,ab,bc,xyz 等字符串都是升序字符串?,F(xiàn)在對(duì)字母表A 產(chǎn)生的所有長(zhǎng)度不超過6 的升序 字符串按照字典序排列并編碼如下。12262728abzabac對(duì)于任意長(zhǎng)度不超過6 的升序字符串,迅速計(jì)算出它在上述字典中的編碼。算法設(shè)計(jì):對(duì)于給定的長(zhǎng)度不超過6 的升序字符串,計(jì)算出它在上述字典中的編碼。 數(shù)據(jù)輸入:輸入數(shù)據(jù)由文件名為input.txt的文本文件提供。文件的第一行是一個(gè)正整數(shù)k,表示接 下來共有k行。接下來的k 行中,每行給出一個(gè)字符串。結(jié)果輸出:將計(jì)算結(jié)果輸出到文件output.txt中。文件共有k 行,每行對(duì)應(yīng)于一個(gè)字符串的編碼。實(shí)驗(yàn)二 蠻力法(2學(xué)時(shí))一、實(shí)驗(yàn)?zāi)康呐c要求1、 掌握蠻力法的基本思想2、 使用蠻力法解決具體問題(通常,問題規(guī)模比較小時(shí),此方法才有意義)二、實(shí)驗(yàn)內(nèi)容 1、用C+/C編寫程序?qū)崿F(xiàn)BF算法,進(jìn)行模式匹配。以下是該算法的偽代碼,請(qǐng)進(jìn)行調(diào)試。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編寫程序?qū)崿F(xiàn)KMP算法,進(jìn)行模式匹配。 求模式串T的Next數(shù)組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中分別設(shè)比較的起始下標(biāo)i和j; 2. 循環(huán)直到S中所剩字符長(zhǎng)度小于T的長(zhǎng)度或T中所有字符均比較完畢 2.1 如果Si=Tj,則繼續(xù)比較S和T的下一個(gè)字符;否則 2.2 將j向右滑動(dòng)到nextj位置,即j=nextj; 2.3 如果j=0,則將ii+1,j=1,準(zhǔn)備下一趟比較; 3. 如果T中所有字符均比較完畢,則返回匹配的起始下標(biāo);否則返回03、以源串“ababcabccabccacbab”和模式串”abccac”w為例,編寫程序,給出采用BF算法和KMP算法進(jìn)行串匹配過程中的字符比較次數(shù)。實(shí)驗(yàn)三 遞歸與分治法(2學(xué)時(shí))基本題一:基本遞歸算法一、實(shí)驗(yàn)?zāi)康呐c要求1、 熟悉C/C+語言的集成開發(fā)環(huán)境;2、 通過本實(shí)驗(yàn)加深對(duì)遞歸過程的理解二、實(shí)驗(yàn)內(nèi)容:掌握遞歸算法的概念和基本思想,分析并掌握“整數(shù)劃分”問題的遞歸算法。三、實(shí)驗(yàn)題任意輸入一個(gè)整數(shù),輸出結(jié)果能夠用遞歸方法實(shí)現(xiàn)整數(shù)的劃分。四、實(shí)驗(yàn)步驟1 理解算法思想和問題要求;2 編程實(shí)現(xiàn)題目要求;3 上機(jī)輸入和調(diào)試自己所編的程序;4 驗(yàn)證分析實(shí)驗(yàn)結(jié)果;5 整理出實(shí)驗(yàn)報(bào)告?;绢}二:棋盤覆蓋問題一、實(shí)驗(yàn)?zāi)康呐c要求1、掌握棋盤覆蓋問題的算法;2、初步掌握分治算法二、實(shí)驗(yàn)題: 盤覆蓋問題:在一個(gè)2k2k 個(gè)方格組成的棋盤中,恰有一個(gè)方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態(tài)的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個(gè)L型骨牌不得重疊覆蓋。三、實(shí)驗(yàn)提示void chessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) return; int t = tile+, / L型骨牌號(hào) s = size/2; / 分割棋盤 / 覆蓋左上角子棋盤 if (dr tr + s & dc tc + s) / 特殊方格在此棋盤中 chessBoard(tr, tc, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號(hào)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 號(hào)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 號(hào)L型骨牌覆蓋左上角 boardtr + stc + s = t; / 覆蓋其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s); 提高題一:二分搜索一、實(shí)驗(yàn)?zāi)康呐c要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、實(shí)驗(yàn)題1、設(shè)a0:n-1是一個(gè)已排好序的數(shù)組。請(qǐng)改寫二分搜索算法,使得當(dāng)搜索元素x不在數(shù)組中時(shí),返回小于x的最大元素的位置I和大于x的最小元素位置j。當(dāng)搜索元素在數(shù)組中時(shí),I和j相同,均為x在數(shù)組中的位置。2、設(shè)有n個(gè)不同的整數(shù)排好序后存放于t0:n-1中,若存在一個(gè)下標(biāo)I,0in,使得ti=i,設(shè)計(jì)一個(gè)有效的算法找到這個(gè)下標(biāo)。要求算法在最壞的情況下的計(jì)算時(shí)間為O(logn)。三、實(shí)驗(yàn)提示1、用I,j做參數(shù),且采用傳遞引用或指針的形式帶回值。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;提高題二: 用分治法實(shí)現(xiàn)元素選擇一、實(shí)驗(yàn)要求與目的1、了解分治法的基本思想,掌握遞歸程序編寫方法;2、使用分治法編程,求解線形序列中第k小元素。二、實(shí)驗(yàn)內(nèi)容1、 給定線形序列集中n個(gè)元素和一個(gè)整數(shù)k,1kn,輸出這n個(gè)元素中第k小元素的值及其位置。2、 簡(jiǎn)述該算法的原理、步驟。對(duì)該算法與直接排序查找進(jìn)行比較。3、 編寫并調(diào)試程序。測(cè)試要求:元素個(gè)數(shù)不少于100;分三種情況:k=1、k=n和k=中位數(shù)。實(shí)驗(yàn)四 貪心算法(2學(xué)時(shí))基本題一:多機(jī)調(diào)度問題一、實(shí)驗(yàn)?zāi)康呐c要求1、熟悉多機(jī)調(diào)度問題的算法;2、初步掌握貪心算法;二、實(shí)驗(yàn)題 要求給出一種作業(yè)調(diào)度方案,使所給的n個(gè)作業(yè)在盡可能短的時(shí)間內(nèi)由m臺(tái)機(jī)器加工處理完成。約定,每個(gè)作業(yè)均可在任何一臺(tái)機(jī)器上加工處理,但未完工前不允許中斷處理。作業(yè)不能拆分成更小的子作業(yè)。三、實(shí)驗(yàn)提示1、把作業(yè)按加工所用的時(shí)間從大到小排序2、如果作業(yè)數(shù)目比機(jī)器的數(shù)目少或相等,則直接把作業(yè)分配下去3、如果作業(yè)數(shù)目比機(jī)器的數(shù)目多,則每臺(tái)機(jī)器上先分配一個(gè)作業(yè),如下的作業(yè)分配時(shí),是選那個(gè)表頭上s最小的鏈表加入新作業(yè)。typedef struct Job int ID;/作業(yè)號(hào) int time;/作業(yè)所花費(fèi)的時(shí)間Job;typedef struct JobNode /作業(yè)鏈表的節(jié)點(diǎn) 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背包問題一、實(shí)驗(yàn)?zāi)康呐c要求1、掌握01背包問題的回溯算法;2、進(jìn)一步掌握回溯算法;二、實(shí)驗(yàn)題:給定n種物品和一背包。物品i的重量是wi,其價(jià)值為vi,背包的容量為C。問應(yīng)如何選擇裝入背包的物品,使得裝入背包中物品的總價(jià)值最大?三、實(shí)驗(yàn)提示templateTypep Knap:Bound(int i)/ 計(jì)算上界 Typew cleft = c - cw; / 剩余容量 Typep b = cp; / 以物品單位重量?jī)r(jià)值遞減序裝入物品 while (i = n & wi = cleft) cleft -= wi; b += pi; i+; / 裝滿背包 if (i H(1000); T *MinOut = new T n+1; / 計(jì)算MinOut = 離開頂點(diǎn)i的最小耗費(fèi)邊的耗費(fèi) T MinSum = 0; / 離開頂點(diǎn)i的最小耗費(fèi)邊的數(shù)目 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-節(jié)點(diǎn)初始化為樹根 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; / 其耗費(fèi)為0E.rcost = MinSum; T bestc = NoEdge; / 目前沒有找到旅行路徑 / 搜索排列樹 while (E.s n - 1) / 不是葉子 if (E.s = n - 2) / 葉子的父節(jié)點(diǎn) / 通過添加兩條邊來完成旅行 / 檢查新的旅行路徑是不是更好 if (aE.xn-2E.xn-1 != NoEdge & aE.xn-11 != NoEdge & (E.cc + aE.xn-2E.xn-1 + aE.xn-11 bestc | bestc = NoEdge) / 找到更優(yōu)的旅行路徑 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 / 產(chǎn)生孩子 for (int i = E.s + 1; i n; i+) if (aE.xE.sE.x != NoEdge) / 可行的孩子, 限定了路徑的耗費(fèi) 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 ) ; / 結(jié)束可行的孩子 delete E.x; / 對(duì)本節(jié)點(diǎn)的處理結(jié)束 try H.DeleteMin(E); / 取下一個(gè)E-節(jié)點(diǎn) catch (OutOfBounds) break; / 沒有未處理的節(jié)點(diǎn) if (bestc = NoEdge) return NoEdge; / 沒有旅行路徑 / 將最優(yōu)路徑復(fù)制到v1:n 中for (i = 0; i n; i+) vi+1 = E.x; while (true) /釋放最小堆中的所有節(jié)點(diǎn) delete E.x; try H.DeleteMin(E); catch (OutOfBounds) break; return bestc; 實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃算法(3學(xué)時(shí))基本題一:最長(zhǎng)公共子序列問題一、實(shí)驗(yàn)?zāi)康呐c要求1、熟悉最長(zhǎng)公共子序列問題的算法;2、初步掌握動(dòng)態(tài)規(guī)劃算法;二、實(shí)驗(yàn)題 若給定序列X=x1,x2,xm,則另一序列Z=z1,z2,zk,是X的子序列是指存在一個(gè)嚴(yán)格遞增下標(biāo)序列i1,i2,ik使得對(duì)于所有j=1,2,k有:zj=xij。例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相應(yīng)的遞增下標(biāo)序列為2,3,5,7。給定2個(gè)序列X和Y,當(dāng)另一序列Z既是X的子序列又是Y的子序列時(shí),稱Z是序列X和Y的公共子序列。給定2個(gè)序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最長(zhǎng)公共子序列。 三、實(shí)驗(yàn)提示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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度AI論文智能輔助生成軟件授權(quán)合同3篇
- 2025年度航空航天產(chǎn)業(yè)出資合同協(xié)議書4篇
- 二零二五年度整棟住宅樓租賃與智能家居安裝合同3篇
- 2025年度打印機(jī)租賃合同(含環(huán)保標(biāo)識(shí)認(rèn)證)3篇
- 二零二五年度綜合性黨政機(jī)關(guān)會(huì)議住宿服務(wù)合同4篇
- 2025年度現(xiàn)代風(fēng)格家居裝修個(gè)人房屋裝修合同協(xié)議書
- 2024贈(zèng)與合同贈(zèng)品交付補(bǔ)充協(xié)議
- 二零二四年度智能穿戴設(shè)備行業(yè)勞動(dòng)合同用戶數(shù)據(jù)保護(hù)與隱私權(quán)合同3篇
- 二零二五年度新型能源項(xiàng)目投資合作框架合同3篇
- 二零二五年度炊事員廚房事故預(yù)防與處理合同3篇
- 廣東省佛山市2025屆高三高中教學(xué)質(zhì)量檢測(cè) (一)化學(xué)試題(含答案)
- 人教版【初中數(shù)學(xué)】知識(shí)點(diǎn)總結(jié)-全面+九年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教案
- 2024-2025學(xué)年人教版七年級(jí)英語上冊(cè)各單元重點(diǎn)句子
- 2025新人教版英語七年級(jí)下單詞表
- 公司結(jié)算資金管理制度
- 2024年小學(xué)語文教師基本功測(cè)試卷(有答案)
- 未成年入職免責(zé)協(xié)議書
- 項(xiàng)目可行性研究報(bào)告評(píng)估咨詢管理服務(wù)方案1
- 5歲幼兒數(shù)學(xué)練習(xí)題
- 2024年全國(guó)體育單招英語考卷和答案
- 食品安全管理制度可打印【7】
評(píng)論
0/150
提交評(píng)論