算法設(shè)計與分析復習題目及答案_第1頁
算法設(shè)計與分析復習題目及答案_第2頁
算法設(shè)計與分析復習題目及答案_第3頁
算法設(shè)計與分析復習題目及答案_第4頁
算法設(shè)計與分析復習題目及答案_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

分治法1、二分搜索算法是利用(?分治策略)實現(xiàn)的算法。9.實現(xiàn)循環(huán)賽日程表利用的算法是(分治策略)27、Strassen矩陣乘法是利用(分治策略?)實現(xiàn)的算法。34.實現(xiàn)合并排序利用的算法是(分治策略)。實現(xiàn)大整數(shù)的乘法是利用的算法(?分治策略)。17.實現(xiàn)棋盤覆蓋算法利用的算法是(分治法)。29、使用分治法求解不需要滿足的條件是(子問題必須是一樣的)。不可以使用分治法求解的是(0/1背包問題)。動態(tài)規(guī)劃下列不是動態(tài)規(guī)劃算法基本步驟的是(構(gòu)造最優(yōu)解)下列是動態(tài)規(guī)劃算法基本要素的是(子問題重疊性質(zhì))。下列算法中通常以自底向上的方式求解最優(yōu)解的是(動態(tài)規(guī)劃法?)備忘錄方法是那種算法的變形。(動態(tài)規(guī)劃法)最長公共子序列算法利用的算法是(?動態(tài)規(guī)劃法)。矩陣連乘問題的算法可由(動態(tài)規(guī)劃算法B)設(shè)計實現(xiàn)。實現(xiàn)最大子段和利用的算法是(??動態(tài)規(guī)劃法??)。貪心算法能解決的問題:單源最短路徑問題,最小花費生成樹問題,背包問題,活動安排問題,

不能解決的問題:N皇后問題,0/1背包問題是貪心算法的基本要素的是(貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì))。回溯法回溯法解旅行售貨員問題時的解空間樹是(排列樹)。剪枝函數(shù)是回溯法中為避免無效搜索采取的策略回溯法的效率不依賴于下列哪些因素(確定解空間的時間)分支限界法最大效益優(yōu)先是(?分支界限法)的一搜索方式。分支限界法解最大團問題時,活結(jié)點表的組織形式是(?最大堆)。分支限界法解旅行售貨員問題時,活結(jié)點表的組織形式是(最小堆) 優(yōu)先隊列式分支限界法選取擴展結(jié)點的原則是(結(jié)點的優(yōu)先級)在對問題的解空間樹進行搜索的方法中,一個活結(jié)點最多有一次機會成為活結(jié)點的是(分支限界法).

從活結(jié)點表中選擇下一個擴展結(jié)點的不同方式將導致不同的分支限界法,以下除(棧式分支限界法)之外都是最常見的方式.

(1)隊列式(FIFO)分支限界法:按照隊列先進先出(FIFO)原則選取下一個節(jié)點為擴展節(jié)點。(2)優(yōu)先隊列式分支限界法:按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的節(jié)點成為當前擴展節(jié)點。(最優(yōu)子結(jié)構(gòu)性質(zhì))是貪心算法與動態(tài)規(guī)劃算法的共同點。貪心算法與動態(tài)規(guī)劃算法的主要區(qū)別是(?貪心選擇性質(zhì)??)?;厮菟惴ê头种藿绶ǖ膯栴}的解空間樹不會是(無序樹).14.哈弗曼編碼的貪心算法所需的計算時間為(???B????)。A、O(n2n) B、O(nlogn) C、O(2n) D、O(n)21、下面關(guān)于NP問題說法正確的是(B)

ANP問題都是不可能解決的問題

BP類問題包含在NP類問題中

CNP完全問題是P類問題的子集

DNP類問題包含在P類問題中40、背包問題的貪心算法所需的計算時間為(??B?????)A、O(n2n)????B、O(nlogn)???C、O(2n)?????D、O(n)42.0-1背包問題的回溯算法所需的計算時間為(??A?????)A、O(n2n) B、O(nlogn) C、O(2n) D、O(n).47.背包問題的貪心算法所需的計算時間為(???B????)。A、O(n2n) B、O(nlogn) C、O(2n) D、O(n)53.采用貪心算法的最優(yōu)裝載問題的主要計算量在于將集裝箱依其重量從小到大排序,故算法的時間復雜度為(B)。A、O(n2n) B、O(nlogn) C、O(2n) D、O(n)56、算法是由若干條指令組成的有窮序列,而且滿足以下性質(zhì)(D)輸入:有0個或多個輸入輸出:至少有一個輸出確定性:指令清晰,無歧義有限性:指令執(zhí)行次數(shù)有限,而且執(zhí)行時間有限A(1)(2)(3)B(1)(2)(4)C(1)(3)(4)D(1)(2)(3)(4)57、函數(shù)32n+10nlogn的漸進表達式是(B).

A.2nB.32nC.nlognD.10nlogn

59、用動態(tài)規(guī)劃算法解決最大字段和問題,其時間復雜性為(B).

A.lognB.nC.n2D.nlogn

61、設(shè)f(N),g(N)是定義在正數(shù)集上的正函數(shù),如果存在正的常數(shù)C和自然數(shù)N0,使得當N≥N0時有f(N)≤Cg(N),則稱函數(shù)f(N)當N充分大時有下界g(N),記作f(N)∈○(g(N)),即f(N)的階(A)g(N)的階.

A.不高于B.不低于C.等價于D.逼近

二、填空題2、程序是算法??用某種程序設(shè)計語言的具體實現(xiàn)。3、算法的“確定性”指的是組成算法的每條指令是清晰的,無歧義的。6、算法是指解決問題的一種方法或一個過程。7、從分治法的一般設(shè)計模式可以看出,用它設(shè)計出的程序一般是遞歸算法。11、計算一個算法時間復雜度通??梢杂嬎阊h(huán)次數(shù)、基本操作的頻率或計算步。14、解決0/1背包問題可以使用動態(tài)規(guī)劃、回溯法和分支限界法,其中不需要排序的是動態(tài)規(guī)劃,需要排序的是回溯法,分支限界法。

15、使用回溯法進行狀態(tài)空間樹裁剪分支時一般有兩個標準:約束條件和目標函數(shù)的界,N皇后問題和0/1背包問題正好是兩種不同的類型,其中同時使用約束條件和目標函數(shù)的界進行裁剪的是0/1背包問題,只使用約束條件進行裁剪的是N皇后問題。30.回溯法是一種既帶有系統(tǒng)性又帶有跳躍性的搜索算法。33.回溯法搜索解空間樹時,常用的兩種剪枝函數(shù)為約束函數(shù)和限界函數(shù)。34.任何可用計算機求解的問題所需的時間都與其規(guī)模有關(guān)。35.快速排序算法的性能取決于劃分的對稱性。36.Prim算法利用貪心策略求解最小生成樹問題,其時間復雜度是O(n2)。37.圖的m著色問題可用回溯法求解,其解空間樹中葉子結(jié)點個數(shù)是mn,解空間樹中每個內(nèi)結(jié)點的孩子數(shù)是m。4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},請給出序列X和Y的一個最長公共子序列{BABCD}或{CABCD}或{CADCD}。5.用回溯法解問題時,應(yīng)明確定義問題的解空間,問題的解空間至少應(yīng)包含一個(最優(yōu))解8.0-1背包問題的回溯算法所需的計算時間為__o(n*2n)__,用動態(tài)規(guī)劃算法所需的計算時間為___o(min{nc,2n}_。二、綜合題(50分)1.寫出設(shè)計動態(tài)規(guī)劃算法的主要步驟。①問題具有最優(yōu)子結(jié)構(gòu)性質(zhì);②構(gòu)造最優(yōu)值的遞歸關(guān)系表達式;3最優(yōu)值的算法描述;④構(gòu)造最優(yōu)解;流水作業(yè)調(diào)度問題的johnson算法的思想。①令N1={i|ai<bi},N2={i|ai>=bi};②將N1中作業(yè)按ai的非減序排序得到N1’,將N2中作業(yè)按bi的非增序排序得到N2’;③N1’中作業(yè)接N2’中作業(yè)就構(gòu)成了滿足Johnson法則的最優(yōu)調(diào)度。若n=4,在機器M1和M2上加工作業(yè)i所需的時間分別為ai和bi,且(a1,a2,a3,a4)=(4,5,12,10),(b1,b2,b3,b4)=(8,2,15,9)求4個作業(yè)的最優(yōu)調(diào)度方案,并計算最優(yōu)值。步驟為:N1={1,3},N2={2,4};N1’={1,3},N2’={4,2};最優(yōu)值為:38使用回溯法解0/1背包問題:n=3,C=9,V={6,10,3},W={3,4,4},其解空間有長度為3的0-1向量組成,要求用一棵完全二叉樹表示其解空間(從根出發(fā),左1右0),并畫出其解空間樹,計算其最優(yōu)值及最優(yōu)解。解空間為{(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1),(1,1,0),(1,1,1)}。解空間樹為:AABCFEDGKJIHONML11100001011010該問題的最優(yōu)值為:16最優(yōu)解為:(1,1,0)設(shè)S={X1,X2,···,Xn}是嚴格遞增的有序集,利用二叉樹的結(jié)點來存儲S中的元素,在表示S的二叉搜索樹中搜索一個元素X,返回的結(jié)果有兩種情形,(1)在二叉搜索樹的內(nèi)結(jié)點中找到X=Xi,其概率為bi。(2)在二叉搜索樹的葉結(jié)點中確定X∈(Xi,Xi+1),其概率為ai。在表示S的二叉搜索樹T中,設(shè)存儲元素Xi的結(jié)點深度為Ci;葉結(jié)點(Xi,Xi+1)的結(jié)點深度為di,則二叉搜索樹T的平均路長p為多少?假設(shè)二叉搜索樹T[i][j]={Xi,Xi+1,···,Xj}最優(yōu)值為m[i][j],W[i][j]=ai-1+bi+···+bj+aj,則m[i][j](1<=i<=j<=n)遞歸關(guān)系表達式為什么?二叉樹T的平均路長P=+m[i][j]=W[i][j]+min{m[i][k]+m[k+1][j]}(1<=i<=j<=n,m[i][i-1]=0)m[i][j]=0(i>j)m[i][j]=W[i][j]+min{m[i][k]+m[k+1][j]}(1<=i<=j<=n,m[i][i-1]=0)描述0-1背包問題。已知一個背包的容量為C,有n件物品,物品i的重量為Wi,價值為Vi,求應(yīng)如何選擇裝入背包中的物品,使得裝入背包中物品的總價值最大。三、簡答題(30分) 1.流水作業(yè)調(diào)度中,已知有n個作業(yè),機器M1和M2上加工作業(yè)i所需的時間分別為ai和bi,請寫出流水作業(yè)調(diào)度問題的johnson法則中對ai和bi的排序算法。(函數(shù)名可寫為sort(s,n))2.最優(yōu)二叉搜索樹問題的動態(tài)規(guī)劃算法(設(shè)函數(shù)名binarysearchtree))1.voidsort(flowjopes[],intn){inti,k,j,l;for(i=1;i<=n-1;i++)//-----選擇排序{k=i;while(k<=n&&s[k].tag!=0)k++;if(k>n)break;//-----沒有ai,跳出else{for(j=k+1;j<=n;j++)if(s[j].tag==0)if(s[k].a>s[j].a)k=j;swap(s[i].index,s[k].index);swap(s[i].tag,s[k].tag);}}l=i;//-----記下當前第一個bi的下標for(i=l;i<=n-1;i++){k=i;for(j=k+1;j<=n;j++)if(s[k].b<s[j].b)k=j;swap(s[i].index,s[k].index);//-----只移動index和tagswap(s[i].tag,s[k].tag);}}2.voidbinarysearchtree(inta[],intb[],intn,int**m,int**s,int**w){ inti,j,k,t,l;for(i=1;i<=n+1;i++){w[i][i-1]=a[i-1];m[i][i-1]=0;}for(l=0;l<=n-1;l++)//----l是下標j-i的差for(i=1;i<=n-l;i++){j=i+l;w[i][j]=w[i][j-1]+a[j]+b[j];m[i][j]=m[i][i-1]+m[i+1][j]+w[i][j];s[i][j]=i;for(k=i+1;k<=j;k++){t=m[i][k-1]+m[k+1][j]+w[i][j];if(t<m[i][j]){m[i][j]=t;s[i][j]=k;}}}}填空題(本題15分,每小題1分)算法就是一組有窮的規(guī)則,它們規(guī)定了解決某一特定類型問題的一系列運算在進行問題的計算復雜性分析之前,首先必須建立求解問題所用的計算模型。3個基本計算模型是隨機存取機RAM、隨機存取存儲程序機RASP、圖靈機。算法的復雜性是算法效率的度量,是評價算法優(yōu)劣的重要依據(jù)。計算機的資源最重要的是時間和空間資源f(n)=6×2n+n2,f(n)的漸進性態(tài)f(n)=O(?2^n??)貪心算法總是做出在當前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所做出的選擇只是在某種意義上的局部最優(yōu)結(jié)構(gòu)二、簡答題(本題25分,每小題5分)簡單描述分治法的基本思想。簡述動態(tài)規(guī)劃方法所運用的最優(yōu)化原理。何謂最優(yōu)子結(jié)構(gòu)性質(zhì)?簡單描述回溯法基本思想。何謂P、NP、NPC問題三、算法填空(本題20分,每小題5分)1、n后問題回溯算法(1)用二維數(shù)組A[N][N]存儲皇后位置,若第i行第j列放有皇后,則A[i][j]為非0值,否則值為0。(2)分別用一維數(shù)組M[N]、L[2*N-1]、R[2*N-1]表示豎列、左斜線、右斜線是否放有棋子,有則值為1,否則值為0。for(j=0;j<N;j++)if(1)/*安全檢查*/{A[i][j]=i+1;/*放皇后*/2;if(i==N-1)輸出結(jié)果;else3;;/*試探下一行*/4;/*去皇后*/5;;}2、數(shù)塔問題。有形如下圖所示的數(shù)塔,從頂部出發(fā),在每一結(jié)點可以選擇向左走或是向右走,一起走到底層,要求找出一條路徑,使路徑上的值最大。for(r=n-2;r>=0;r--)//自底向上遞歸計算for(c=0;1;c++)if(t[r+1][c]>t[r+1][c+1])2;else3;3、Hanoi算法Hanoi(n,a,b,c)if(n==1)1;else{2;3;Hanoi(n-1,b,a,c);}4、Dijkstra算法求單源最短路徑d[u]:s到u的距離p[u]:記錄前一節(jié)點信息Init-single-source(G,s)foreachvertexv∈V[G]do{d[v]=∞;1}d[s]=0Relax(u,v,w)ifd[v]>d[u]+w(u,v)then{d[v]=d[u]+w[u,v];2}dijkstra(G,w,s)1.Init-single-source(G,s)2.S=Φ3.Q=V[G]4.whileQ<>Φdou=min(Q)S=S∪{u}foreachvertex3do4四、算法理解題(本題10分)根據(jù)優(yōu)先隊列式分支限界法,求下圖中從v1點到v9點的單源最短路徑,請畫出求得最優(yōu)解的解空間樹。要求中間被舍棄的結(jié)點用×標記,獲得中間解的結(jié)點用單圓圈○框起,最優(yōu)解用雙圓圈◎框起。五、算法理解題(本題5分)設(shè)有n=2k個運動員要進行循環(huán)賽,現(xiàn)設(shè)計一個滿足以下要求的比賽日程表:①每個選手必須與其他n-1名選手比賽各一次;②每個選手一天至多只能賽一次;③循環(huán)賽要在最短時間內(nèi)完成。(1)如果n=2k,循環(huán)賽最少需要進行幾天;(2)當n=23=8時,請畫出循環(huán)賽日程表。六、算法設(shè)計題(本題15分)分別用貪心算法、動態(tài)規(guī)劃法、回溯法設(shè)計0-1背包問題。要求:說明所使用的算法策略;寫出算法實現(xiàn)的主要步驟;分析算法的時間。七、算法設(shè)計題(本題10分)通過鍵盤輸入一個高精度的正整數(shù)n(n的有效位數(shù)≤240),去掉其中任意s個數(shù)字后,剩下的數(shù)字按原左右次序?qū)⒔M成一個新的正整數(shù)。編程對給定的n和s,尋找一種方案,使得剩下的數(shù)字組成的新數(shù)最小?!緲永斎搿?78543S=4【樣例輸出】13二、簡答題(本題25分,每小題5分)分治法的基本思想是將一個規(guī)模為n的問題分解為k個規(guī)模較小的子問題,這些子問題互相獨立且與原問題相同;對這k個子問題分別求解。如果子問題的規(guī)模仍然不夠小,則再劃分為k個子問題,如此遞歸的進行下去,直到問題規(guī)模足夠小,很容易求出其解為止;將求出的小規(guī)模的問題的解合并為一個更大規(guī)模的問題的解,自底向上逐步求出原來問題的解?!白顑?yōu)化原理”用數(shù)學化的語言來描述:假設(shè)為了解決某一優(yōu)化問題,需要依次作出n個決策D1,D2,…,Dn,如若這個決策序列是最優(yōu)的,對于任何一個整數(shù)k,1<k<n,不論前面k個決策是怎樣的,以后的最優(yōu)決策只取決于由前面決策所確定的當前狀態(tài),即以后的決策Dk+1,Dk+2,…,Dn也是最優(yōu)的。某個問題的最優(yōu)解包含著其子問題的最優(yōu)解。這種性質(zhì)稱為最優(yōu)子結(jié)構(gòu)性質(zhì)?;厮莘ǖ幕舅枷胧窃谝豢煤袉栴}全部可能解的狀態(tài)空間樹上進行深度優(yōu)先搜索,解為葉子結(jié)點。搜索過程中,每到達一個結(jié)點時,則判斷該結(jié)點為根的子樹是否含有問題的解,如果可以確定該子樹中不含有問題的解,則放棄對該子樹的搜索,退回到上層父結(jié)點,繼續(xù)下一步深度優(yōu)先搜索過程。在回溯法中,并不是先構(gòu)造出整棵狀態(tài)空間樹,再進行搜索,而是在搜索過程,逐步構(gòu)造出狀態(tài)空間樹,即邊搜索,邊構(gòu)造。P(Polynomial問題):也即是多項式復雜程度的問題。NP就是Non-deterministic?Polynomial的問題,也即是多項式復雜程度的非確定性問題。NPC(NPComplete)問題,這種問題只有把解域里面的所有可能都窮舉了之后才能得出答案,這樣的問題是NP里面最難的問題,這種問題就是NPC問題。三、算法填空(本題20分,每小題5分)1、n后問題回溯算法(1)!M[j]&&!L[i+j]&&!R[i-j+N](2)M[j]=L[i+j]=R[i-j+N]=1;(3)try(i+1,M,L,R,A)(4)A[i][j]=0(5)M[j]=L[i+j]=R[i-j+N]=02、數(shù)塔問題。(1)c<=r(2)t[r][c]+=t[r+1][c](3)t[r][c]+=t[r+1][c+1]3、Hanoi算法(1)move(a,c)(2)Hanoi(n-1,a,c,b)(3)Move(a,c)4、(1)p[v]=NIL(2)p[v]=u(3)v∈adj[u](4)Relax(u,v,w)四、算法理解題(本題10分)12341234567821436587341278564321876556781234658721437856341287654321五、(1)8天(2分);(2)當n=23=8時,循環(huán)賽日程表(3分)。六、算法設(shè)計題(本題15分)(1)貪心算法O(nlog(n))首先計算每種物品單位重量的價值Vi/Wi,然后,依貪心選擇策略,將盡可能多的單位重量價值最高的物品裝入背包。若將這種物品全部裝入背包后,背包內(nèi)的物品總重量未超過C,則選擇單位重量價值次高的物品并盡可能多地裝入背包。依此策略一直地進行下去,直到背包裝滿為止。具體算法可描述如下:voidKnapsack(intn,floatM,floatv[],floatw[],floatx[]){Sort(n,v,w);inti;for(i=1;i<=n;i++)x[i]=0;floatc=M;for(i=1;i<=n;i++){if(w[i]>c)break;x[i]=1;c-=w[i];}if(i<=n)x[i]=c/w[i];}(2)動態(tài)規(guī)劃法O(nc)m(i,j)是背包容量為j,可選擇物品為i,i+1,…,n時0-1背包問題的最優(yōu)值。由0-1背包問題的最優(yōu)子結(jié)構(gòu)性質(zhì),可以建立計算m(i,j)的遞歸式如下。voidKnapSack(intv[],intw[],intc,intn,intm[][11]){intjMax=min(w[n]-1,c);for(j=0;j<=jMax;j++)/*m(n,j)=00=<j<w[n]*/m[n][j]=0;for(j=w[n];j<=c;j++)/*m(n,j)=v[n]j>=w[n]*/m[n][j]=v[n];for(i=n-1;i>1;i--){intjMax=min(w[i]-1,c);for(j=0;j<=jMax;j++)/*m(i,j)=m(i+1,j)0=<j<w[i]*/m[i][j]=m[i+1][j];for(j=w[i];j<=c;j++)/*m(n,j)=v[n]j>=w[n]*/m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);}m[1][c]=m[2][c];if(c>=w[1])m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);}(3)回溯法O(2n)cw:當前重量cp:當前價值bestp:當前最優(yōu)值void?backtrack(int?i)//回溯法?i初值1{????if(i?>?n)//到達葉結(jié)點{bestp?=?cp;????????????return;??????????}???????if(cw?+?w[i]?<=?c)//搜索左子樹???????????{?cw?+=?w[i];?cp?+=?p[i];????????????backtrack(i+1);?????????????cw?-=?w[i];???????????cp?-=?p[i];??????????}????????if(Bound(i+1)>bestp)//搜索右子樹??????????backtrack(i+1);???}??七、算法設(shè)計題(本題10分)為了盡可能地逼近目標,我們選取的貪心策略為:每一步總是選擇一個使剩下的數(shù)最小的數(shù)字刪去,即按高位到低位的順序搜索,若各位數(shù)字遞增,則刪除最后一個數(shù)字,否則刪除第一個遞減區(qū)間的首字符。然后回到串首,按上述規(guī)則再刪除下一個數(shù)字。重復以上過程s次,剩下的數(shù)字串便是問題的解了。具體算法如下:輸入s,n;while(s>0){i=1;//從串首開始找while(i<length(n))&&(n[i]<n[i+1]){i++;}delete(n,i,1);//刪除字符串n的第i個字符s--;}while(length(n)>1)&&(n[1]=‘0’)delete(n,1,1);//刪去串首可能產(chǎn)生的無用零輸出n;三、算法填空1.背包問題的貪心算法voidKnapsack(intn,floatM,floatv[],floatw[],floatx[]){Sort(n,v,w);inti;for(i=1;i<=n;i++)x[i]=0;floatc=M;for(i=1;i<=n;i++){if(w[i]>c)break;x[i]=1;c-=w[i];}if(i<=n)x[i]=c/w[i];}2.最大子段和:動態(tài)規(guī)劃算法intMaxSum(intn,inta[]){intsum=0,b=0;//sum存儲當前最大的b[j],b存儲b[j]for(intj=1;j<=n;j++){if(b>0)b+=a[j];elseb=a[i];;//一旦某個區(qū)段和為負,則從下一個位置累和if(b>sum)sum=b;}returnsum;}3.快速排序template<classType>voidQuickSort(Typea[],intp,intr){if(p<r){intq=Partition(a,p,r);QuickSort(a,p,q-1);//對左半段排序QuickSort(a,q+1,r);//對右半段排序}}4.排列問題Template<classType>voidperm(Typelist[],intk,intm){//產(chǎn)生[list[k:m]的所有排列if(k==m){//只剩下一個元素for(inti=0;i<=m;i++)cout<<list[i];cout<<endl;}else//還有多個元素待排列,遞歸產(chǎn)生排列for(inti=k;i<=m;i++){swap(list[k],list[i]);perm(list,k+1;m);swap(list[k],list[i]);}}5.給定已按升序排好序的n個元素a[0:n-1],現(xiàn)要在這n個元素中找出一特定元素x。據(jù)此容易設(shè)計出二分搜索算法:template<classType>intBinarySearch(Typea[],constType&x,intl,intr){while(l<=r){intm=((l+r)/2);if(x==a[m])returnm;if(x<a[m])r=m-1;elsel=m+1;}return-1;}

6、合并排序描述如下:

template<classType>voidMergesort(Typea[],intleft,intright){if(left<right){inti=(left+right)/2;Mergesort(a,left,i);Mergesort(a,i+1,right);Merge(a,b,left,i,right);//合并到數(shù)組bCopy(a,b,left,right);//復制到數(shù)組a}}7、以下是計算xm的值的過程intpower(x,m){//計算xm的值并返回。y=(1);i=m;While(i-->0)y=y*x;(returny)?;}四、問答題1.用計算機求解問題的步驟:1、問題分析2、數(shù)學模型建立3、算法設(shè)計與選擇4、算法指標5、算法分析6、算法實現(xiàn)7、程序調(diào)試8、結(jié)果整理文檔編制2.算法定義:算法是指在解決問題時,按照某種機械步驟一定可以得到問題結(jié)果的處理過程3.算法的三要素1、操作2、控制結(jié)構(gòu)3、數(shù)據(jù)結(jié)構(gòu)13.分治法與動態(tài)規(guī)劃法的相同點是:將待求解的問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。兩者的不同點是:適合于用動態(tài)規(guī)劃法求解的問題,經(jīng)分解得到的子問題往往不是互相獨立的。而用分治法求解的問題,經(jīng)分解得到的子問題往往是互相獨立的?;厮莘ㄖ谐R姷膬深惖湫偷慕饪臻g樹是子集樹和排列樹。22.請敘述動態(tài)規(guī)劃算法與貪心算法的異同。共同點:都需要最優(yōu)子結(jié)構(gòu)性質(zhì),都用來求有優(yōu)化問題。不同點:動態(tài)規(guī)劃:每一步作一個選擇—依賴于子問題的解。貪心方法:每一步作一個選擇—不依賴于子問題的解。動態(tài)規(guī)劃方法的條件:子問題的重疊性質(zhì)。可用貪心方法的條件:最優(yōu)子結(jié)構(gòu)性質(zhì);貪心選擇性質(zhì)。動態(tài)規(guī)劃:自底向上求解;貪心方法:自頂向下求解??捎秘澬姆〞r,動態(tài)規(guī)劃方法可能不適用;可用動態(tài)規(guī)劃方法時,貪心法可能不適用。23.請說明動態(tài)規(guī)劃方法為什么需要最優(yōu)子結(jié)構(gòu)性質(zhì)。答:最優(yōu)子結(jié)構(gòu)性質(zhì)是指大問題的最優(yōu)解包含子問題的最優(yōu)解。動態(tài)規(guī)劃方法是自底向上計算各個子問題的最優(yōu)解,即先計算子問題的最優(yōu)解,然后再利用子問題的最優(yōu)解構(gòu)造大問題的最優(yōu)解,因此需要最優(yōu)子結(jié)構(gòu).24.請說明:(1)優(yōu)先隊列可用什么數(shù)據(jù)結(jié)構(gòu)實現(xiàn)?(2)優(yōu)先隊列插入算法基本思想?(3)優(yōu)先隊列插入算法時間復雜度?答:(1)堆。(2)在小根堆中,將元素x插入到堆的末尾,然后將元素x的關(guān)鍵字與其雙親的關(guān)鍵字比較,若元素x的關(guān)鍵字小于其雙親的關(guān)鍵字,則將元素x與其雙親交換,然后再將元素x與其新雙親的關(guān)鍵字相比,直到元素x的關(guān)鍵字大于雙親的關(guān)鍵字,或元素x到根為止。(3)O(logn)26.在算法復雜性分析中,O、Ω、Θ這三個記號的意義是什么?在忽略常數(shù)因子的情況下,O、Ω、Θ分別提供了算法運行時間的什么界?答:如果存在兩個正常數(shù)c和N0,對于所有的N≥N0,有|f(N)|≤C|g(N)|,則記作:f(N)=O(g(N))。這時我們說f(N)的階不高于g(N)的階。若存在兩個正常數(shù)C和自然數(shù)N0,使得當N≥N0時有|f(N)|≥C|g(N)|,記為f(N)=?(g(N))。這時我們說f(N)的階不低于g(N)的階。如果存在正常數(shù)c1,c2和n0,對于所有的n≥n0,有c1|g(N)|≤|f(N)|≤c2|g(N)|則記作f(N)=(g,(N)O、Ω、Θ分別提供了算法運行時間的上界、下界、平均五、算法設(shè)計與分析題1.用動態(tài)規(guī)劃策略求解最長公共子序列問題:(1)給出計算最優(yōu)值的遞歸方程。(2)給定兩個序列X={B,C,D,A},Y={A,B,C,B},請采用動態(tài)規(guī)劃策略求出其最長公共子序列,要求給出過程。答:1(2)YABCBX0000B00111C00122D00122A01122最長公共子序列:{BC}2.對下列各組函數(shù)f(n)和g(n),確定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并簡要說明理由。(1)f(n)=2n;g(n)=n!(2)f(n)=;g(n)=logn2(3)f(n)=100;g(n)=log100(4)f(n)=n3;g(n)=3n(5)f(n)=3n;g(n)=2n答:f(n)=O(g(n))因為g(n)的階比f(n)的階高。f(n)=Ω(g(n))因為g(n)的階比f(n)的階低。f(n)=θ(g(n))因為g(n)與f(n)同階。f(n)=O(g(n))因為g(n)的階比f(n)的階高。f(n)=Ω(g(n))因為g(n)的階比f(n)的階低。3.對下圖所示的連通網(wǎng)絡(luò)G,用克魯斯卡爾(Kruskal)算法求G的最小生成樹T,請寫出在算法執(zhí)行過程中,依次加入T的邊集TE中的邊。說明該算法的貪心策略和算法的基本思想,并簡要分析算法的時間復雜度。1212345618111715192126679TE={(3,4),(2,3),(1,5),(4,6)(4,5)}貪心策略是每次都在連接兩個不同連通分量的邊中選權(quán)值最小的邊?;舅枷耄菏紫葘D中所有頂點都放到生成樹中,然后每次都在連接兩個不同連通分量的邊中選權(quán)值最小的邊,將其放入生成樹中,直到生成樹中有n-1條邊。時間復雜度為:O(eloge)4.請用分治策略設(shè)計遞歸的歸并排序算法,并分析其時間復雜性(要求:分別給出divide、conquer、combine這三個階段所花的時間,并在此基礎(chǔ)上列出遞歸方程,最后用套用公式法求出其解的漸進階)。答:Template<classType>voidMergeSort(Typea[],intleft,intright){if(left<right){inti=(left+right)/2;MergeSort(a,left,i);MergeSort(a,i+1,right);Merge(a,b,left,right);Copy(a,b,left,right);}}Divide階段的時間復雜性:O(1)Conquer階段的時間復雜性:2T(n)Combine階段的時間復雜性:Θ(n)用套用公式法:a=2,b=2,nlogba=n,f(n)=n,因為f(n)與nlogba同階,∴T(n)=Θ(nlogn)23456782143658734127856432187655678123465872143785634128765432112345678214365873412785643218765567812346587214378563412876543211234567821436587341278564321876556781234658721437856341287654321123456782143658734127856432187655678123465872143785634128765432112345675、設(shè)有n=2k個運動員要進行循環(huán)賽,現(xiàn)設(shè)計一個滿足以下要求的比賽日程表:每個選手必須與其他n-1名選手比賽各一次;每個選手一天至多只能賽一次;循環(huán)賽要在最短時間內(nèi)完成.

(1)(4分)循環(huán)賽最少需要進行(n-1)天.(2)(6分)當n=23=8時,請畫出循環(huán)賽日程表:6、考慮用哈夫曼算法來找字符a,b,c,d,e,f的最優(yōu)編碼。這些字符出現(xiàn)在文件中的頻數(shù)之比為20:10:6:4:44:16。要求:(1)(4分)簡述使用哈夫曼算法構(gòu)造最優(yōu)編碼的基本步驟;(2)(5分)構(gòu)造對應(yīng)的哈夫曼樹,并據(jù)此給出a,b,c,d,e,f的一種最優(yōu)編碼。解:1)、哈夫曼算法是構(gòu)造最優(yōu)編碼樹的貪心算法。其基本思想是,首先所有字符對應(yīng)n棵樹構(gòu)成的森林,每棵樹只有一個結(jié)點,根權(quán)為對應(yīng)字符的頻率。然后,重復下列過程n-1次:將森林中的根權(quán)最小的

溫馨提示

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

評論

0/150

提交評論