




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
算法分析與設(shè)計常熟理工學(xué)院計算機(jī)學(xué)院劉在德算法分析與設(shè)計常熟理工學(xué)院計算機(jī)學(xué)院1第1章緒論掌握三種漸近符號(O、Ω、Θ)的含義;會用三種漸近符號表示算法的時間復(fù)雜度;會用擴(kuò)展遞歸技術(shù)分析算法時間的復(fù)雜性;對于表示算法時間的簡單遞推式,能夠用擴(kuò)展遞歸技術(shù)求出最終結(jié)果。P15:例1.6P18:實(shí)驗(yàn)1P22:習(xí)題1.7第1章緒論掌握三種漸近符號(O、Ω、Θ)的含義;2三種漸近符號的含義大O符號:若存在兩個正的常數(shù)c和n0,對于任意n≥n0,都有T(n)≤c×f(n),則稱T(n)=O(f(n))
大Ω符號:若存在兩個正的常數(shù)c和n0,對于任意n≥n0,都有T(n)≥c×g(n),則稱T(n)=Ω(g(n))Θ符號:若存在三個正的常數(shù)c1、c2和n0,對于任意n≥n0都有c1×f(n)≥T(n)≥c2×f(n),則稱T(n)=Θ(f(n))
三種漸近符號的含義大O符號:若存在兩個正的常數(shù)c和n0,對于3漸近符號表示算法時間復(fù)雜度[定理1.1]若T(n)=amnm+am-1nm-1+···a1n+a0(am>0),則有T(n)=O(nm),且T(n)=Ω(nm),從而T(n)=Θ(nm)[例]
T(n)=5n2+8n+1
當(dāng)n≥1時,5n2+8n+1≤5n2+8n+n=5n2+9n≤5n2+9n2≤14n2=O(n2)
當(dāng)n≥1時,5n2+8n+1≥5n2=Ω(n2)
∴當(dāng)n≥1時,14n2≥5n2+8n+1≥5n2
則:5n2+8n+1=Θ(n2)
漸近符號表示算法時間復(fù)雜度[定理1.1]若T(n)=am4用擴(kuò)展遞歸技術(shù)分析算法時間的復(fù)雜性擴(kuò)展遞歸技術(shù):將遞推關(guān)系式中右邊項(xiàng)根據(jù)遞推式進(jìn)行逐次替換,得到求和表達(dá)式[例]
用擴(kuò)展遞歸技術(shù)分析算法時間的復(fù)雜性擴(kuò)展遞歸技術(shù):將遞推關(guān)系式5第2章NP完全理論對于簡單的判定問題,會畫判定樹。判定樹(DecisionTrees)是一棵二叉樹:它的每一個內(nèi)部結(jié)點(diǎn)對應(yīng)一個形如x≤y的比較,如果關(guān)系成立,則控制轉(zhuǎn)移到該結(jié)點(diǎn)的左子樹,否則,控制轉(zhuǎn)移到該結(jié)點(diǎn)的右子樹,它的每一個葉子結(jié)點(diǎn)表示問題的一個結(jié)果。
第2章NP完全理論對于簡單的判定問題,會畫判定樹。6[例]對三個數(shù)進(jìn)行排序的判定樹[例]對三個數(shù)進(jìn)行排序的判定樹7第3章蠻力法掌握改進(jìn)的串匹配算法——KMP算法理解n個元素的生成排列對象理解n個元素組成的集合的生成子集理解0/1背包問題理解TSP問題第3章蠻力法掌握改進(jìn)的串匹配算法——KMP算法8KMP算法KMP算法思路:如果某趟在Si和Tj匹配失敗后,指針i不回溯;模式T向右滑動至某個位置k,使得tk對準(zhǔn)si繼續(xù)進(jìn)行匹配。怎么求k?模式T=“t1t2…tm”中的每一個字符tj都對應(yīng)一個k,顯然k與S無關(guān)。用next[j]表示tj對應(yīng)的k值,則t1…tk-1既是t1…tj-1的真前綴,又是t1…tj-1的真后綴的最長子串,稱k是tj的前綴函數(shù)值,它等于最長子串長度加1。KMP算法KMP算法思路:9next數(shù)組的定義next數(shù)組定義如下:t1t2t3t4t5t6ababac真前綴真后綴∵t1=t5,t1t2t3=t3t4t5∴a和aba都是ababa的真前綴和真后綴,但aba的長度最大∴next[6]=3+1=4,即當(dāng)t6和si匹配失敗后,將t4和si比較一個求k的例子:next數(shù)組的定義next數(shù)組定義如下:t1t2t3t4t510next數(shù)組的求法:已求出next[1],…,next[j],咋求next[j+1]?設(shè)k是t[j]的前綴函數(shù)值,從而有
t1…t2tk-1=tj-k+1tj-k+2…tj-1比較tk和tj,得2種情況:(1)tk=tj:說明t1…tk-1tk=tj-k+1…tj-1tj,則next[j+1]=k+1;(2)tk≠tj:此時要找出t1…tj-1的后綴中第2大真前綴next[next[j]]=next[k],t1…tnext[k]-1=tj-next[k]+1…tj-1,再比較tnext[k]和tj,又會出現(xiàn)2種情況:next數(shù)組的求法:已求出next[1],…,next[j11next數(shù)組的求法:當(dāng)tnext[k]=tj時,與(1)類似,next[j+1]=next[k]+1;當(dāng)不等時,找第3大真前綴,重復(fù)(2)的過程,直至找到t1…tj-1后綴中的最大真前綴,或確定t1…tj-1的后綴中沒有最大真前綴,此時next[j+1]=1。next數(shù)組的求法:當(dāng)tnext[k]=tj時,與(1)類似12算法3.4KMP算法中求next數(shù)組voidGetNext(charT[],intnext[])
{//下標(biāo)從1開始next[1]=0;j=1;k=0;while(j<=m)If((k==0)||(T[j]==T[k])){j++;k++;next[j]=k;}elsek=next[k]}算法3.4KMP算法中求next數(shù)組voidGetNe13算法3.5KMP算法1.在串S和T中分別設(shè)定比較的起始下標(biāo)i和j;2.循環(huán)直到S中所剩字符長度小于T的長度或T中所有字符均比較完畢2.1如S[i]=T[j],則繼續(xù)比較S和T的下一字符;否則2.2將j向右滑動到next[j]位置,即j=next[j];2.3如果j=0,則將i和j分別加1,準(zhǔn)備下一趟比較;3.如果T中所有字符均比較完畢,則返回匹配的起始下標(biāo),否則返回0。算法3.5KMP算法1.在串S和T中分別設(shè)定比較的起始14生成排列對象思路:假定已生成了{(lán)1,2,…,n-1}的所有(n-1)!個排列,可以把n插入到n-1個元素的每一種排列的n個位置中去,得到問題規(guī)模為n的所有排列。這時排列總數(shù)為n(n-1)!=n!。時間復(fù)雜性:O(n!)算法3.9生成排列對象(偽代碼)1.生成初始排列{1};2.for(i=2;i<=n;i++)for(j=1;j<=(i-1)!;j++)for(k=i;k>=1;k--)
將i插入到第j個排列中的第k個位置;生成排列對象思路:假定已生成了{(lán)1,2,…,n-1}的所有(15生成子集思路:n個元素組成的集合A={a1,a2,…,an}的所有2n個子集與長度為n的所有2n個比特串之間存在一一對應(yīng)關(guān)系。建立這種關(guān)系的方法是為每個子集指定一個比特串b1b2…bn,如果ai屬于該子集,則bi=1,否則bi=0(1≤i≤n)。如3個元素組成的集合,比特串110表示{a1a2},比特串000表示Φ。生成子集思路:n個元素組成的集合A={a1,a2,…,an}16算法3.10生成子集1.初始化一個長度為n的比特串s=00…0,并將對應(yīng)的子集輸出;2.for(i=1;i<2n;i++)2.1s++;2.2將s對應(yīng)的子集輸出;時間復(fù)雜性:O(2n)。算法3.10生成子集1.初始化一個長度為n的比特串s170/1背包問題0/1背包問題:給定n個重量為{w1,w2,…wn}、價值為{v1,v2,…,vn}的物品和1個容量為C的背包,求這些物品中的一個最有價值的子集,并能夠裝到背包中。思路:考慮給定n個物品集合的所有子集,找出所有可能的子集(總重量不超過背包容量的子集),計算每個子集的價值,從中找出價值最大子集。0/1背包問題0/1背包問題:給定n個重量為{w1,w2,…18TSP問題TSP問題:旅行家要旅行n個城市然后回到出發(fā)城市,要求各個城市經(jīng)歷且僅經(jīng)歷一次,并要求所經(jīng)過的路程最短。思路:1)找出所有的Hamilton回路,并計算每個回路的路徑長度;2)從中選擇路徑長度最短的回路。TSP問題TSP問題:旅行家要旅行n個城市然后回到出發(fā)城市,19TSP問題時間復(fù)雜性:(n-1)!/2(出發(fā)城市固定,實(shí)際旅游了n-1個城市)。例子:abdca11acdba11TSP問題時間復(fù)雜性:(n-1)!/2(出發(fā)城市固定,實(shí)際20第4/5章分/減治法理解分治法的基本思路及在典型問題中的應(yīng)用掌握遞歸方法在算法設(shè)計中的應(yīng)用。掌握減治法在經(jīng)典問題中的應(yīng)用習(xí)題4.3習(xí)題4.4習(xí)題5.2第4/5章分/減治法理解分治法的基本思路及在典型問題中21分治法的求解過程
一般來說,分治法的求解過程由以下三個階段組成:(1)劃分:既然是分治,當(dāng)然需要把規(guī)模為n的原問題劃分為k個規(guī)模較小的子問題,并盡量使這k個子問題的規(guī)模大致相同。(2)求解子問題:各子問題的解法與原問題的解法通常是相同的,可以用遞歸的方法求解各個子問題,有時遞歸處理也可以用循環(huán)來實(shí)現(xiàn)。(3)合并:把各個子問題的解合并起來,合并的代價因情況不同有很大差異,分治算法的有效性很大程度上依賴于合并的實(shí)現(xiàn)。分治法的求解過程一般來說,分治法的求解過程由以22子問題的規(guī)模是n/2子問題的解原問題的解原問題的規(guī)模是n減治法的設(shè)計思想子問題子問題的解23遞歸遞歸(Recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過一系列調(diào)用語句間接調(diào)用自己,是一種描述問題和解決問題的基本方法。遞歸有兩個基本要素:⑴邊界條件:確定遞歸到何時終止;⑵遞歸模式:大問題是如何分解為小問題的。遞歸遞歸(Recursion)就是子程序(或函數(shù)24一個遞歸和減治法混合應(yīng)用例子----俄式乘法習(xí)題5的第2題intrmul(intn,intm)/*方法1:遞歸法*/{inthalfn,bm,product;if(n==0)return0;if(n==1)returnm;一個遞歸和減治法混合應(yīng)用例子----俄式乘法習(xí)題5的第2題25if(n%2==0){halfn=n>>1;bm=m<<1;product=rmul(halfn,bm);}if(n%2==1){halfn=n>>1;bm=m<<1;product=rmul(halfn,bm)+m;}returnproduct;}if(n%2==0)26intrmul(intn,intm)/*方法2:非遞歸法*/
{intresult=0;while(n!=0){if(n%2==0)m=m<<1;else{result=result+m;m=m<<1;}n=n>>1;}returnresult;}intrmul(intn,intm)/*方27第6章動態(tài)規(guī)劃法掌握動態(tài)規(guī)劃法的設(shè)計思想掌握動態(tài)規(guī)劃法在TSP問題和0/1背包問題中的應(yīng)用。給出一個TSP或者0/1背包問題的實(shí)例,能夠?qū)懗鏊膭討B(tài)規(guī)劃過程。P134:實(shí)驗(yàn)6第6章動態(tài)規(guī)劃法掌握動態(tài)規(guī)劃法的設(shè)計思想28動態(tài)規(guī)劃法的設(shè)計思想
動態(tài)規(guī)劃法將待求解問題分解成若干個相互重疊的子問題,每個子問題對應(yīng)決策過程的一個階段,一般來說,子問題的重疊關(guān)系表現(xiàn)在對給定問題求解的遞推關(guān)系(也就是動態(tài)規(guī)劃函數(shù))中,將子問題的解求解一次并填入表中,當(dāng)需要再次求解此子問題時,可以通過查表獲得該子問題的解而不用再次求解,從而避免了大量重復(fù)計算。動態(tài)規(guī)劃法的設(shè)計思想動態(tài)規(guī)劃法將待求解問題分解成若29原問題的解原問題……填表子問題1子問題2子問題n動態(tài)規(guī)劃法的求解過程原問題的解原問題……填表子問題1子30n=5時分治法計算斐波那契數(shù)的過程。
F(5)F(4)F(3)F(3)F(2)F(2)F(1)F(2)F(1)F(1)F(0)F(1)F(0)F(1)F(0)例:計算斐波那契數(shù):n=5時分治法計算斐波那契數(shù)的過程。F(5)F(4)F(33101234567890112358132134動態(tài)規(guī)劃法求解斐波那契數(shù)F(9)的填表過程:注意到,計算F(n)是以計算它的兩個重疊子問題
F(n-1)和F(n-2)的形式來表達(dá)的,所以,可以設(shè)計一張表填入n+1個F(n)的值。
01234567890112358132134動態(tài)規(guī)劃法求解32TSP問題
TSP問題是指旅行家要旅行n個城市,要求各個城市經(jīng)歷且僅經(jīng)歷一次然后回到出發(fā)城市,并要求所走的路程最短。各個城市間的距離可以用代價矩陣來表示。C=∞3675∞2364∞2375∞帶權(quán)圖的代價矩陣TSP問題TSP問題是指旅行家要旅行n個城市,要求33假設(shè)從頂點(diǎn)i出發(fā),令d(i,V')表示從頂點(diǎn)i出發(fā)經(jīng)過V'中各個頂點(diǎn)一次且僅一次,最后回到出發(fā)點(diǎn)i的最短路徑長度,開始時,V'=V-{i},于是,TSP問題的動態(tài)規(guī)劃函數(shù)為:d(i,V')=min{cik+d(k,V-{k})}(k∈V')(式6.5)d(k,{})=cki(k≠i)(式6.6)假設(shè)從頂點(diǎn)i出發(fā),令d(i,V')表示從頂點(diǎn)i出發(fā)經(jīng)過V'34這是最后一個階段的決策,而:
d(1,{2,3})=min{c12+d(2,{3}),c13+d(3,{2})}d(2,{1,3})=min{c21+d(1,{3}),c23+d(3,{1})}d(3,{1,2})=min{c31+d(1,{2}),c32+d(2,{1})}這一階段的決策又依賴于下面的計算結(jié)果:d(1,{2})=c12+d(2,{})d(2,{3})=c23+d(3,{})d(3,{2})=c32+d(2,{})d(1,{3})=c13+d(3,{})d(2,{1})=c21+d(1,{})d(3,{1})=c31+d(1,{})
從城市0出發(fā)經(jīng)城市1、2、3然后回到城市0的最短路徑長度是:d(0,{1,2,3})=min{c01+d(1,{2,3}),c02+d(2,{1,3}),c03+d(3,{1,2})}而下式可以直接獲得(括號中是該決策引起的狀態(tài)轉(zhuǎn)移):d(1,{})=c10=5(1→0)d(2,{})=c20=6(2→0)d(3,{})=c30=3(3→0)這是最后一個階段的決策,而:從城市0出發(fā)經(jīng)城市1、2、3然35再向前倒推,有:d(1,{2})=c12+d(2,{})=2+6=8(1→2)d(1,{3})=c13+d(3,{})=3+3=6(1→3)d(2,{3})=c23+d(3,{})=2+3=5(2→3)d(2,{1})=c21+d(1,{})=4+5=9(2→1)d(3,{1})=c31+d(1,{})=7+5=12(3→1)d(3,{2})=c32+d(2,{})=5+6=11(3→2)再向前倒退,有:d(1,{2,3})=min{c12+d(2,{3}),c13+d(3,{2})}=min{2+5,3+11}=7(1→2)d(2,{1,3})=min{c21+d(1,{3}),c23+d(3,{1})}=min{4+6,2+12}=10(2→1)d(3,{1,2})=min{c31+d(1,{2}),c32+d(2,{1})}=min{7+8,5+9}=14(3→2)最后有:d(0,{1,2,3})=min{c01+d(1,{2,3}),c02+d(2,{1,3}),c03+d(3,{1,2})}=min{3+7,6+10,7+14}=10(0→1)所以,從頂點(diǎn)0出發(fā)的TSP問題的最短路徑長度為10,路徑是0→1→2→3→0。
再向前倒推,有:d(3,{1,2})=min{c31+d36算法6.1——TSP問題1.for(i=1;i<n;i++)//初始化第0列d[i][0]=c[i][0];2.for(j=1;j<2n-1-1;j++)for(i=1;i<n;i++)//依次進(jìn)行第i次迭代if(子集V[j]中不包含i)對V[j]中的每個元素k,計算d[i][j]=min(c[i][k]+d[k][j-1]);3.對V[2n-1-1]中的每一個元素k,計算d[0][2n-1-1]=min(c[0][k]+d[k][2n-1-2]);4.輸出最短路徑長度d[0][2n-1-1];偽代碼設(shè)頂點(diǎn)之間的代價存放在數(shù)組c[n][n]中,動態(tài)規(guī)劃法求解TSP問題的算法如下:
算法6.1——TSP問題偽代碼設(shè)頂點(diǎn)之間的代價存放在370/1背包問題
在0/1背包問題中,物品i或者被裝入背包,或者不被裝入背包,設(shè)xi表示物品i裝入背包的情況,則當(dāng)xi=0時,表示物品i沒有被裝入背包,xi=1時,表示物品i被裝入背包。根據(jù)問題的要求,有如下約束條件和目標(biāo)函數(shù):
(式6.9)(式6.10)于是,問題歸結(jié)為尋找一個滿足約束條件式6.9,并使目標(biāo)函數(shù)式6.10達(dá)到最大的解向量X=(x1,x2,…,xn)。0/1背包問題在0/1背包問題中,物品i或者38
0/1背包問題可以看作是決策一個序列(x1,x2,…,xn),對任一變量xi的決策是決定xi=1還是xi=0。在對xi-1決策后,已確定了(x1,…,xi-1),在決策xi時,問題處于下列兩種狀態(tài)之一:(1)背包容量不足以裝入物品i,則xi=0,背包不增加價值;(2)背包容量可以裝入物品i,則xi=1,背包的價值增加了vi。這兩種情況下背包價值的最大者應(yīng)該是對xi決策后的背包價值。令V(i,j)表示在前i(1≤i≤n)個物品中能夠裝入容量為j(1≤j≤C)的背包中的物品的最大值,則可以得到如下動態(tài)規(guī)劃函數(shù):V(i,0)=V(0,j)=0(式6.11)(式6.12)0/1背包問題可以看作是決策一個序列(x1,x2,39式6.11表明:把前面i個物品裝入容量為0的背包和把0個物品裝入容量為j的背包,得到的價值均為0。式6.12的第一個式子表明:如果第i個物品的重量大于背包的容量,則裝入前i個物品得到的最大價值和裝入前i-1個物品得到的最大價值是相同的,即物品i不能裝入背包;第二個式子表明:如果第i個物品的重量小于背包的容量,則會有以下兩種情況:(1)如果把第i個物品裝入背包,則背包中物品的價值等于把前i-1個物品裝入容量為j-wi的背包中的價值加上第i個物品的價值vi;(2)如果第i個物品沒有裝入背包,則背包中物品的價值就等于把前i-1個物品裝入容量為j的背包中所取得的價值。顯然,取二者中價值較大者作為把前i個物品裝入容量為j的背包中的最優(yōu)解。
式6.11表明:把前面i個物品裝入容量為0的背包和把40根據(jù)動態(tài)規(guī)劃函數(shù),用一個(n+1)×(C+1)的二維表V,V[i][j]表示把前i個物品裝入容量為j的背包中獲得的最大價值。
0例如,有5個物品,其重量分別是{2,2,6,5,4},價值分別為{6,3,5,4,6},背包的容量為10。x5=1x4=0x3=0x2=1x1=1
012345678910
00000000000w1=2v1=6100666666666w2=2v2=3200669999999w3=6v3=5300669999111114w4=5v4=44006699910111314w5=5v5=6500669912121515150根據(jù)動態(tài)規(guī)劃函數(shù),用一個(n+1)×(C+1)的二維表41按下述方法來劃分階段:第一階段,只裝入前1個物品,確定在各種情況下的背包能夠得到的最大價值;第二階段,只裝入前2個物品,確定在各種情況下的背包能夠得到的最大價值;依此類推,直到第n個階段。最后,V(n,C)便是在容量為C的背包中裝入n個物品時取得的最大價值。為了確定裝入背包的具體物品,從V(n,C)的值向前推,如果V(n,C)>V(n-1,C),表明第n個物品被裝入背包,前n-1個物品被裝入容量為C-wn的背包中;否則,第n個物品沒有被裝入背包,前n-1個物品被裝入容量為C的背包中。依此類推,直到確定第1個物品是否被裝入背包中為止。由此,得到如下函數(shù):
(式6.13)
按下述方法來劃分階段:第一階段,只裝入前1個物品,確42
設(shè)n個物品的重量存儲在數(shù)組w[n]中,價值存儲在數(shù)組v[n]中,背包容量為C,數(shù)組V[n+1][C+1]存放迭代結(jié)果,其中V[i][j]表示前i個物品裝入容量為j的背包中獲得的最大價值,數(shù)組x[n]存儲裝入背包的物品,動態(tài)規(guī)劃法求解0/1背包問題的算法如下:
算法6.3——0/1背包問題
intKnapSack(intn,intw[],intv[]){for(i=0;i<=n;i++)//初始化第0列V[i][0]=0;for(j=0;j<=C;j++)//初始化第0行V[0][j]=0;for(i=1;i<=n;i++)//計算第i行,進(jìn)行第i次迭代for(j=1;j<=C;j++)if(j<w[i])C++描述設(shè)n個物品的重量存儲在數(shù)組w[n]中,價值存43算法6.3——0/1背包問題V[i][j]=V[i-1][j];elseV[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);j=C;//求裝入背包的物品for(i=n;i>0;i--){if(V[i][j]>V[i-1][j]){x[i]=1;j=j-w[i];}elsex[i]=0;}returnV[n][C];//返回背包取得的最大價值}C++描述算法6.3——0/1背包問題C++描述44第7章貪心法掌握貪心法的設(shè)計思想掌握貪心法在TSP問題中的應(yīng)用掌握貪心法在背包問題中的應(yīng)用P155:實(shí)驗(yàn)7第7章貪心法掌握貪心法的設(shè)計思想45貪心法的求解過程
用貪心法求解問題應(yīng)該考慮如下幾個方面:(1)候選集合C:為了構(gòu)造問題的解決方案,有一個候選集合C作為問題的可能解,即問題的最終解均取自于候選集合C。例如,在付款問題中,各種面值的貨幣構(gòu)成候選集合。(2)解集合S:隨著貪心選擇的進(jìn)行,解集合S不斷擴(kuò)展,直到構(gòu)成一個滿足問題的完整解。例如,在付款問題中,已付出的貨幣構(gòu)成解集合。貪心法的求解過程用貪心法求解問題應(yīng)該考慮如下幾個46
(3)解決函數(shù)solution:檢查解集合S是否構(gòu)成問題的完整解。例如,在付款問題中,解決函數(shù)是已付出的貨幣金額恰好等于應(yīng)付款。
(4)選擇函數(shù)select:即貪心策略,這是貪心法的關(guān)鍵,它指出哪個候選對象最有希望構(gòu)成問題的解,選擇函數(shù)通常和目標(biāo)函數(shù)有關(guān)。例如,在付款問題中,貪心策略就是在候選集合中選擇面值最大的貨幣。(5)可行函數(shù)feasible:檢查解集合中加入一個候選對象是否可行,即解集合擴(kuò)展后是否滿足約束條件。例如,在付款問題中,可行函數(shù)是每一步選擇的貨幣和已付出的貨幣相加不超過應(yīng)付款。
(3)解決函數(shù)solution:檢查解集合S是否構(gòu)成問題47貪心法的一般過程Greedy(C)//C是問題的輸入集合即候選集合{S={};//初始解集合為空集while(notsolution(S))//集合S沒有構(gòu)成問題的一個解{x=select(C);//在候選集合C中做貪心選擇iffeasible(S,x)//判斷集合S中加入x后的解是否可行S=S+{x};C=C-{x};}returnS;}貪心法的一般過程48TSP問題
最近鄰點(diǎn)策略:從任意城市出發(fā),每次在沒有到過的城市中選擇最近的一個,直到經(jīng)過了所有的城市,最后回到出發(fā)城市。TSP問題最近鄰點(diǎn)策略:從任意城市出發(fā),每次在沒有到過的城49(d)城市3→城市5(e)城市5→城市2(f)城市2→城市1最近鄰點(diǎn)貪心策略求解TSP問題的過程25221543225221543232522154327363215432233215432C=∞33263∞73237∞25232∞36253∞(a)5城市的代價矩陣(b)城市1→城市4(c)城市4→城市3(d)城市3→城市5(e)城市5→城市50背包問題
給定n種物品和一個容量為C的背包,物品i的重量是wi,其價值為vi,背包問題是如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?
背包問題給定n種物品和一個容量為C的背包,51
于是,背包問題歸結(jié)為尋找一個滿足約束條件式7.1,并使目標(biāo)函數(shù)式7.2達(dá)到最大的解向量X=(x1,x2,…,xn)。設(shè)xi表示物品i裝入背包的情況,根據(jù)問題的要求,有如下約束條件和目標(biāo)函數(shù):(式7.1)(式7.2)于是,背包問題歸結(jié)為尋找一個滿足約束條件式752三種看似合理的貪心策略:(1)選擇價值最大的物品,因?yàn)檫@可以盡可能快地增加背包的總價值。但是,雖然每一步選擇獲得了背包價值的極大增長,但背包容量卻可能消耗得太快,使得裝入背包的物品個數(shù)減少,從而不能保證目標(biāo)函數(shù)達(dá)到最大。(2)選擇重量最輕的物品,因?yàn)檫@可以裝入盡可能多的物品,從而增加背包的總價值。但是,雖然每一步選擇使背包的容量消耗得慢了,但背包的價值卻沒能保證迅速增長,從而不能保證目標(biāo)函數(shù)達(dá)到最大。(3)選擇單位重量價值最大的物品,在背包價值增長和背包容量消耗兩者之間尋找平衡。三種看似合理的貪心策略:5312050背包180190200(a)三個物品及背包(b)貪心策略1(c)貪心策略2(d)貪心策略350301020203020/30201010/203010例如,有3個物品,其重量分別是{20,30,10},價值分別為{60,120,50},背包的容量為50,應(yīng)用三種貪心策略裝入背包的物品和獲得的價值如圖所示。12050背包54第8章回溯法掌握回溯法的設(shè)計思想針對某一特定實(shí)例,會寫出動態(tài)搜索過程,并畫出搜索空間樹,從而找到最優(yōu)解0/1背包問題TSP問題第8章回溯法掌握回溯法的設(shè)計思想55
對于任何一個問題,可能解的表示方式和它相應(yīng)的解釋隱含了解空間及其大小。例如,對于有n個物品的0/1背包問題,其可能解的表示方式可以有以下兩種:(1)可能解由一個不等長向量組成,當(dāng)物品i(1≤i≤n)裝入背包時,解向量中包含分量i,否則,解向量中不包含分量i,當(dāng)n=3時,其解空間是:{(),(1),(2),(3),(1,2),(1,3),(2,3),(1,2,3)}(2)可能解由一個等長向量{x1,x2,…,xn}組成,其中xi=1(1≤i≤n)表示物品i裝入背包,xi=0表示物品i沒有裝入背包,當(dāng)n=3時,其解空間是:{(0,0,0),(0,0,1),(0,1,0),(1,0,0),(0,1,1),(1,0,1),(1,1,0),(1,1,1)}對于任何一個問題,可能解的表示方式和它相應(yīng)的56為了用回溯法求解一個具有n個輸入的問題,一般情況下,將其可能解表示為滿足某個約束條件的等長向量X=(x1,x2,…,xn),其中分量xi(1≤i≤n)的取值范圍是某個有限集合Si={ai1,ai2,…,airi},所有可能的解向量構(gòu)成了問題的解空間。
為了用回溯法求解一個具有n個輸入的問題,一般57問題的解空間一般用解空間樹(SolutionSpaceTrees,也稱狀態(tài)空間樹)的方式組織,樹的根結(jié)點(diǎn)位于第1層,表示搜索的初始狀態(tài),第2層的結(jié)點(diǎn)表示對解向量的第一個分量做出選擇后到達(dá)的狀態(tài),第1層到第2層的邊上標(biāo)出對第一個分量選擇的結(jié)果,依此類推,從樹的根結(jié)點(diǎn)到葉子結(jié)點(diǎn)的路徑就構(gòu)成了解空間的一個可能解。問題的解空間一般用解空間樹(Solution58對于n=3的0/1背包問題,其解空間樹如圖8.2所示,樹中的8個葉子結(jié)點(diǎn)分別代表該問題的8個可能解。
對物品1的選擇對物品3的選擇對物品2的選擇1111110000000112345781112141531069對于n=3的0/1背包問題,其解空間樹如圖8.2所示,樹中的59對于n=4的TSP問題,其解空間樹如圖8.3所示,樹中的24個葉子結(jié)點(diǎn)分別代表該問題的24個可能解,例如結(jié)點(diǎn)5代表一個可能解,路徑為1→2→3→4→1,長度為各邊代價之和。
243422343413142412123312134131312321214241434322434123124134圖8.3n=4的TSP問題的解空間樹5710121517212326283133373942444749525457596264469111416202225273032363841434648515356586163381319242935404550556021834241123434對于n=4的TSP問題,其解空間樹如圖8.3所示,樹60解空間樹的動態(tài)搜索
回溯法從根結(jié)點(diǎn)出發(fā),按照深度優(yōu)先策略遍歷解空間樹,搜索滿足約束條件的解。在搜索至樹中任一結(jié)點(diǎn)時,先判斷該結(jié)點(diǎn)對應(yīng)的部分解是否滿足約束條件,或者是否超出目標(biāo)函數(shù)的界,也就是判斷該結(jié)點(diǎn)是否包含問題的(最優(yōu))解,如果肯定不包含,則跳過對以該結(jié)點(diǎn)為根的子樹的搜索,即所謂剪枝(Pruning);否則,進(jìn)入以該結(jié)點(diǎn)為根的子樹,繼續(xù)按照深度優(yōu)先策略搜索。解空間樹的動態(tài)搜索回溯法從根結(jié)點(diǎn)出發(fā),按照深61例如,對于n=3的0/1背包問題,三個物品的重量為{20,15,10},價值為{20,30,25},背包容量為25,從圖8.2所示的解空間樹的根結(jié)點(diǎn)開始搜索,搜索過程如下:1不可行解價值=20價值=55價值=30價值=25價值=01111000000112811121415131069不可行解例如,對于n=3的0/1背包問題,三個物品的重量為{20,62再如,對于n=4的TSP問題,其代價矩陣如圖8.5所示,
C=∞36712∞2886∞2376∞圖8.5TSP問題的代價矩陣再如,對于n=4的TSP問題,其代價矩陣如圖8.5所632344221231341313123212142414322434123124134圖8.6TSP問題的搜索空間547544112746485153583813242935404550556021834241234123442212313413131232121424143264回溯法的求解過程
由于問題的解向量X=(x1,x2,…,xn)中的每個分量xi(1≤i≤n)都屬于一個有限集合Si={ai1,ai2,…,airi},因此,回溯法可以按某種順序(例如字典序)依次考察笛卡兒積S1×S2×…×Sn中的元素。初始時,令解向量X為空,然后,從根結(jié)點(diǎn)出發(fā),選擇S1的第一個元素作為解向量X的第一個分量,即x1=a11,如果X=(x1)是問題的部分解,則繼續(xù)擴(kuò)展解向量X,選擇S2的第一個元素作為解向量X的第2個分量,否則,選擇S1的下一個元素作為解向量X的第一個分量,即x1=a12。依此類推,一般情況下,如果X=(x1,x2,…,xi)是問題的部分解,則選擇Si+1的第一個元素作為解向量X的第i+1個分量時,有下面三種情況:回溯法的求解過程由于問題的解向量X=(x165(1)如果X=(x1,x2,…,xi+1)是問題的最終解,則輸出這個解。如果問題只希望得到一個解,則結(jié)束搜索,否則繼續(xù)搜索其他解;(2)如果X=(x1,x2,…,xi+1)是問題的部分解,則繼續(xù)構(gòu)造解向量的下一個分量;(3)如果X=(x1,x2,…,xi+1)既不是問題的部分解也不是問題的最終解,則存在下面兩種情況:①如果xi+1=ai+1k不是集合Si+1的最后一個元素,則令xi+1=ai+1k+1,即選擇Si+1的下一個元素作為解向量X的第i+1個分量;②如果xi+1=ai+1k是集合Si+1的最后一個元素,就回溯到X=(x1,x2,…,xi),選擇Si的下一個元素作為解向量X的第i個分量,假設(shè)xi=aik,如果aik不是集合Si的最后一個元素,則令xi=aik+1;否則,就繼續(xù)回溯到X=(x1,x2,…,xi-1);(1)如果X=(x1,x2,…,xi+1)是問題的最終66回溯法的一般框架——迭代形式1.X={};2.flag=false;3.k=1;4.while(k>=1)4.1當(dāng)(Sk沒有被窮舉)循環(huán)執(zhí)行下列操作4.1.1xk=Sk中的下一個元素;4.1.2將xk加入X;4.1.3if(X為最終解)flag=true;轉(zhuǎn)步驟5;4.1.4elseif(X為部分解)k=k+1;轉(zhuǎn)步驟4;4.2重置Sk,使得下一個元素排在第1位;4.3k=k-1;//回溯5.ifflag輸出解X;else輸出“無解”;回溯算法的非遞歸迭代形式的一般框架如下:回溯法的一般框架——迭代形式回溯算法的非遞歸迭代形式67第9章分支限界法掌握分支限界法的設(shè)計思想針對某一特定實(shí)例,會寫出動態(tài)搜索過程,并畫出搜索空間樹,從而找到最優(yōu)解0/1背包問題TSP問題第9章分支限界法掌握分支限界法的設(shè)計思想68分支限界法首先確定一個合理的限界函數(shù),并根據(jù)限界函數(shù)確定目標(biāo)函數(shù)的界[down,up]。然后,按照廣度優(yōu)先策略遍歷問題的解空間樹,在分支結(jié)點(diǎn)上,依次搜索該結(jié)點(diǎn)的所有孩子結(jié)點(diǎn),分別估算這些孩子結(jié)點(diǎn)的目標(biāo)函數(shù)的可能取值,如果某孩子結(jié)點(diǎn)的目標(biāo)函數(shù)可能取得的值超出目標(biāo)函數(shù)的界,則將其丟棄,因?yàn)閺倪@個結(jié)點(diǎn)生成的解不會比目前已經(jīng)得到的解更好;否則,將其加入待處理結(jié)點(diǎn)表(以下簡稱表PT)中。依次從表PT中選取使目標(biāo)函數(shù)的值取得極值的結(jié)點(diǎn)成為當(dāng)前擴(kuò)展結(jié)點(diǎn),重復(fù)上述過程,直到找到最優(yōu)解。解空間樹的動態(tài)搜索(2)分支限界法首先確定一個合理的限界函數(shù),并根據(jù)69隨著這個遍歷過程的不斷深入,表PT中所估算的目標(biāo)函數(shù)的界越來越接近問題的最優(yōu)解。當(dāng)搜索到一個葉子結(jié)點(diǎn)時,如果該結(jié)點(diǎn)的目標(biāo)函數(shù)值是表PT中的極值(對于最小化問題,是極小值;對于最大化問題,是極大值),則該葉子結(jié)點(diǎn)對應(yīng)的解就是問題的最優(yōu)解;否則,根據(jù)這個葉子結(jié)點(diǎn)調(diào)整目標(biāo)函數(shù)的界(對于最小化問題,調(diào)整上界;對于最大化問題,調(diào)整下界),依次考察表PT中的結(jié)點(diǎn),將超出目標(biāo)函數(shù)界的結(jié)點(diǎn)丟棄,然后從表PT中選取使目標(biāo)函數(shù)取得極值的結(jié)點(diǎn)繼續(xù)進(jìn)行擴(kuò)展。隨著這個遍歷過程的不斷深入,表PT中所估算的70例:0/1背包問題。假設(shè)有4個物品,其重量分別為(4,7,5,3),價值分別為(40,42,25,12),背包容量W=10。首先,將給定物品按單位重量價值從大到小排序,結(jié)果如下:物品重量(w)價值(v)價值/重量(v/w)144010274263525543124例:0/1背包問題。假設(shè)有4個物品,其重量分別71
應(yīng)用貪心法求得近似解為(1,0,0,0),獲得的價值為40,這可以作為0/1背包問題的下界。如何求得0/1背包問題的一個合理的上界呢?考慮最好情況,背包中裝入的全部是第1個物品且可以將背包裝滿,則可以得到一個非常簡單的上界的計算方法:ub=W×(v1/w1)=10×10=100。于是,得到了目標(biāo)函數(shù)的界[40,100]。
限界函數(shù)為:
應(yīng)用貪心法求得近似解為(1,0,0,0),獲得72×w=0,v=0ub=100w=4,v=40ub=76w=0,v=0ub=60w=11無效解w=4,v=40ub=70w=9,v=65ub=69w=4,v=40ub=64w=12無效解w=9,v=65ub=6523456789×1分支限界法求解0/1背包問題×w=0,v=0w=4,v=40w=0,v=0w=1173分支限界法求解0/1背包問題,其搜索空間如圖9.1所示,具體的搜索過程如下:(1)在根結(jié)點(diǎn)1,沒有將任何物品裝入背包,因此,背包的重量和獲得的價值均為0,根據(jù)限界函數(shù)計算結(jié)點(diǎn)1的目標(biāo)函數(shù)值為10×10=100;(2)在結(jié)點(diǎn)2,將物品1裝入背包,因此,背包的重量為4,獲得的價值為40,目標(biāo)函數(shù)值為40+(10-4)×6=76,將結(jié)點(diǎn)2加入待處理結(jié)點(diǎn)表PT中;在結(jié)點(diǎn)3,沒有將物品1裝入背包,因此,背包的重量和獲得的價值仍為0,目標(biāo)函數(shù)值為10×6=60,將結(jié)點(diǎn)3加入表PT中;(3)在表PT中選取目標(biāo)函數(shù)值取得極大的結(jié)點(diǎn)2優(yōu)先進(jìn)行搜索;
分支限界法求解0/1背包問題,其搜索空間如圖74(4)在結(jié)點(diǎn)4,將物品2裝入背包,因此,背包的重量為11,不滿足約束條件,將結(jié)點(diǎn)4丟棄;在結(jié)點(diǎn)5,沒有將物品2裝入背包,因此,背包的重量和獲得的價值與結(jié)點(diǎn)2相同,目標(biāo)函數(shù)值為40+(10-4)×5=70,將結(jié)點(diǎn)5加入表PT中;(5)在表PT中選取目標(biāo)函數(shù)值取得極大的結(jié)點(diǎn)5優(yōu)先進(jìn)行搜索;(6)在結(jié)點(diǎn)6,將物品3裝入背包,因此,背包的重量為9,獲得的價值為65,目標(biāo)函數(shù)值為65+(10-9)×4=69,將結(jié)點(diǎn)6加入表PT中;在結(jié)點(diǎn)7,沒有將物品3裝入背包,因此,背包的重量和獲得的價值與結(jié)點(diǎn)5相同,目標(biāo)函數(shù)值為40+(10-4)×4=64,將結(jié)點(diǎn)6加入表PT中;(4)在結(jié)點(diǎn)4,將物品2裝入背包,因此,背包的重量為11,不75(7)在表PT中選取目標(biāo)函數(shù)值取得極大的結(jié)點(diǎn)6優(yōu)先進(jìn)行搜索;(8)在結(jié)點(diǎn)8,將物品4裝入背包,因此,背包的重量為12,不滿足約束條件,將結(jié)點(diǎn)8丟棄;在結(jié)點(diǎn)9,沒有將物品4裝入背包,因此,背包的重量和獲得的價值與結(jié)點(diǎn)6相同,目標(biāo)函數(shù)值為65;(9)由于結(jié)點(diǎn)9是葉子結(jié)點(diǎn),同時結(jié)點(diǎn)9的目標(biāo)函數(shù)值是表PT中的極大值,所以,結(jié)點(diǎn)9對應(yīng)的解即是問題的最優(yōu)解,搜索結(jié)束。(7)在表PT中選取目標(biāo)函數(shù)值取得極大的結(jié)點(diǎn)6優(yōu)先進(jìn)行搜索;76分支限界法的設(shè)計思想
假設(shè)求解最大化問題,解向量為X=(x1,x2,…,xn),其中,xi的取值范圍為某個有窮集合Si,|Si|=ri(1≤i≤n)。在使用分支限界法搜索問題的解空間樹時,首先根據(jù)限界函數(shù)估算目標(biāo)函數(shù)的界[down,up],然后從根結(jié)點(diǎn)出發(fā),擴(kuò)展根結(jié)點(diǎn)的r1個孩子結(jié)點(diǎn),從而構(gòu)成分量x1的r1種可能的取值方式。對這r1個孩子結(jié)點(diǎn)分別估算可能取得的目標(biāo)函數(shù)值bound(x1),其含義是以該孩子結(jié)點(diǎn)為根的子樹所可能取得的目標(biāo)函數(shù)值不大于bound(x1),也就是部分解應(yīng)滿足:bound(x1)≥bound(x1,x2)≥…≥bound(x1,
x2,…,xk)≥…≥bound(x1,x2,…,xn)分支限界法的設(shè)計思想假設(shè)求解最大化問題,解77若某孩子結(jié)點(diǎn)的目標(biāo)函數(shù)值超出目標(biāo)函數(shù)的界,則將該孩子結(jié)點(diǎn)丟棄;否則,將該孩子結(jié)點(diǎn)保存在待處理結(jié)點(diǎn)表PT中。從表PT中選取使目標(biāo)函數(shù)取得極大值的結(jié)點(diǎn)作為下一次擴(kuò)展的根結(jié)點(diǎn),重復(fù)上述過程,當(dāng)?shù)竭_(dá)一個葉子結(jié)點(diǎn)時,就得到了一個可行解X=(x1,x2,…,xn)及其目標(biāo)函數(shù)值bound(x1,x2,…,xn)。如果bound(x1,x2,…,xn)是表PT中目標(biāo)函數(shù)值最大的結(jié)點(diǎn),則bound(x1,x2,…,xn)就是所求問題的最大值,(x1,x2,…,xn)就是問題的最優(yōu)解;如果bound(x1,x2,…,xn)不是表PT中目標(biāo)函數(shù)值最大的結(jié)點(diǎn),說明還存在某個部分解對應(yīng)的結(jié)點(diǎn),其上界大于bound(x1,x2,…,xn)。于是,用bound(x1,x2,…,xn)調(diào)整目標(biāo)函數(shù)的下界,即令down=bound(x1,x2,…,xn),并將表PT中超出目標(biāo)函數(shù)下界down的結(jié)點(diǎn)刪除,然后選取目標(biāo)函數(shù)值取得極大值的結(jié)點(diǎn)作為下一次擴(kuò)展的根結(jié)點(diǎn),繼續(xù)搜索,直到某個葉子結(jié)點(diǎn)的目標(biāo)函數(shù)值在表PT中最大。若某孩子結(jié)點(diǎn)的目標(biāo)函數(shù)值超出目標(biāo)函數(shù)的界,則將該孩子78分支限界法求解最大化問題的一般過程分支限界法的一般過程1.根據(jù)限界函數(shù)確定目標(biāo)函數(shù)的界[down,up];2.將待處理結(jié)點(diǎn)表PT初始化為空;3.對根結(jié)點(diǎn)的每個孩子結(jié)點(diǎn)x執(zhí)行下列操作3.1估算結(jié)點(diǎn)x的目標(biāo)函數(shù)值value;3.2若(value>=down),則將結(jié)點(diǎn)x加入表PT中;4.循環(huán)直到某個葉子結(jié)點(diǎn)的目標(biāo)函數(shù)值在表PT中最大4.1i=表PT中值最大的結(jié)點(diǎn);4.2對結(jié)點(diǎn)i的每個孩子結(jié)點(diǎn)x執(zhí)行下列操作4.2.1估算結(jié)點(diǎn)x的目標(biāo)函數(shù)值value;4.2.2若(value>=down),則將結(jié)點(diǎn)x加入表PT中;4.2.3若(結(jié)點(diǎn)x是葉子結(jié)點(diǎn)且結(jié)點(diǎn)x的value值在表PT中最大),則將結(jié)點(diǎn)x對應(yīng)的解輸出,算法結(jié)束;4.2.4若(結(jié)點(diǎn)x是葉子結(jié)點(diǎn)但結(jié)點(diǎn)x的value值在表PT中不是最大),則令down=value,并且將表PT中所有小于value的結(jié)點(diǎn)刪除;分支限界法求解最大化問題的一般過程分支限界法的一般過程79算法分析與設(shè)計常熟理工學(xué)院計算機(jī)學(xué)院劉在德算法分析與設(shè)計常熟理工學(xué)院計算機(jī)學(xué)院80第1章緒論掌握三種漸近符號(O、Ω、Θ)的含義;會用三種漸近符號表示算法的時間復(fù)雜度;會用擴(kuò)展遞歸技術(shù)分析算法時間的復(fù)雜性;對于表示算法時間的簡單遞推式,能夠用擴(kuò)展遞歸技術(shù)求出最終結(jié)果。P15:例1.6P18:實(shí)驗(yàn)1P22:習(xí)題1.7第1章緒論掌握三種漸近符號(O、Ω、Θ)的含義;81三種漸近符號的含義大O符號:若存在兩個正的常數(shù)c和n0,對于任意n≥n0,都有T(n)≤c×f(n),則稱T(n)=O(f(n))
大Ω符號:若存在兩個正的常數(shù)c和n0,對于任意n≥n0,都有T(n)≥c×g(n),則稱T(n)=Ω(g(n))Θ符號:若存在三個正的常數(shù)c1、c2和n0,對于任意n≥n0都有c1×f(n)≥T(n)≥c2×f(n),則稱T(n)=Θ(f(n))
三種漸近符號的含義大O符號:若存在兩個正的常數(shù)c和n0,對于82漸近符號表示算法時間復(fù)雜度[定理1.1]若T(n)=amnm+am-1nm-1+···a1n+a0(am>0),則有T(n)=O(nm),且T(n)=Ω(nm),從而T(n)=Θ(nm)[例]
T(n)=5n2+8n+1
當(dāng)n≥1時,5n2+8n+1≤5n2+8n+n=5n2+9n≤5n2+9n2≤14n2=O(n2)
當(dāng)n≥1時,5n2+8n+1≥5n2=Ω(n2)
∴當(dāng)n≥1時,14n2≥5n2+8n+1≥5n2
則:5n2+8n+1=Θ(n2)
漸近符號表示算法時間復(fù)雜度[定理1.1]若T(n)=am83用擴(kuò)展遞歸技術(shù)分析算法時間的復(fù)雜性擴(kuò)展遞歸技術(shù):將遞推關(guān)系式中右邊項(xiàng)根據(jù)遞推式進(jìn)行逐次替換,得到求和表達(dá)式[例]
用擴(kuò)展遞歸技術(shù)分析算法時間的復(fù)雜性擴(kuò)展遞歸技術(shù):將遞推關(guān)系式84第2章NP完全理論對于簡單的判定問題,會畫判定樹。判定樹(DecisionTrees)是一棵二叉樹:它的每一個內(nèi)部結(jié)點(diǎn)對應(yīng)一個形如x≤y的比較,如果關(guān)系成立,則控制轉(zhuǎn)移到該結(jié)點(diǎn)的左子樹,否則,控制轉(zhuǎn)移到該結(jié)點(diǎn)的右子樹,它的每一個葉子結(jié)點(diǎn)表示問題的一個結(jié)果。
第2章NP完全理論對于簡單的判定問題,會畫判定樹。85[例]對三個數(shù)進(jìn)行排序的判定樹[例]對三個數(shù)進(jìn)行排序的判定樹86第3章蠻力法掌握改進(jìn)的串匹配算法——KMP算法理解n個元素的生成排列對象理解n個元素組成的集合的生成子集理解0/1背包問題理解TSP問題第3章蠻力法掌握改進(jìn)的串匹配算法——KMP算法87KMP算法KMP算法思路:如果某趟在Si和Tj匹配失敗后,指針i不回溯;模式T向右滑動至某個位置k,使得tk對準(zhǔn)si繼續(xù)進(jìn)行匹配。怎么求k?模式T=“t1t2…tm”中的每一個字符tj都對應(yīng)一個k,顯然k與S無關(guān)。用next[j]表示tj對應(yīng)的k值,則t1…tk-1既是t1…tj-1的真前綴,又是t1…tj-1的真后綴的最長子串,稱k是tj的前綴函數(shù)值,它等于最長子串長度加1。KMP算法KMP算法思路:88next數(shù)組的定義next數(shù)組定義如下:t1t2t3t4t5t6ababac真前綴真后綴∵t1=t5,t1t2t3=t3t4t5∴a和aba都是ababa的真前綴和真后綴,但aba的長度最大∴next[6]=3+1=4,即當(dāng)t6和si匹配失敗后,將t4和si比較一個求k的例子:next數(shù)組的定義next數(shù)組定義如下:t1t2t3t4t589next數(shù)組的求法:已求出next[1],…,next[j],咋求next[j+1]?設(shè)k是t[j]的前綴函數(shù)值,從而有
t1…t2tk-1=tj-k+1tj-k+2…tj-1比較tk和tj,得2種情況:(1)tk=tj:說明t1…tk-1tk=tj-k+1…tj-1tj,則next[j+1]=k+1;(2)tk≠tj:此時要找出t1…tj-1的后綴中第2大真前綴next[next[j]]=next[k],t1…tnext[k]-1=tj-next[k]+1…tj-1,再比較tnext[k]和tj,又會出現(xiàn)2種情況:next數(shù)組的求法:已求出next[1],…,next[j90next數(shù)組的求法:當(dāng)tnext[k]=tj時,與(1)類似,next[j+1]=next[k]+1;當(dāng)不等時,找第3大真前綴,重復(fù)(2)的過程,直至找到t1…tj-1后綴中的最大真前綴,或確定t1…tj-1的后綴中沒有最大真前綴,此時next[j+1]=1。next數(shù)組的求法:當(dāng)tnext[k]=tj時,與(1)類似91算法3.4KMP算法中求next數(shù)組voidGetNext(charT[],intnext[])
{//下標(biāo)從1開始next[1]=0;j=1;k=0;while(j<=m)If((k==0)||(T[j]==T[k])){j++;k++;next[j]=k;}elsek=next[k]}算法3.4KMP算法中求next數(shù)組voidGetNe92算法3.5KMP算法1.在串S和T中分別設(shè)定比較的起始下標(biāo)i和j;2.循環(huán)直到S中所剩字符長度小于T的長度或T中所有字符均比較完畢2.1如S[i]=T[j],則繼續(xù)比較S和T的下一字符;否則2.2將j向右滑動到next[j]位置,即j=next[j];2.3如果j=0,則將i和j分別加1,準(zhǔn)備下一趟比較;3.如果T中所有字符均比較完畢,則返回匹配的起始下標(biāo),否則返回0。算法3.5KMP算法1.在串S和T中分別設(shè)定比較的起始93生成排列對象思路:假定已生成了{(lán)1,2,…,n-1}的所有(n-1)!個排列,可以把n插入到n-1個元素的每一種排列的n個位置中去,得到問題規(guī)模為n的所有排列。這時排列總數(shù)為n(n-1)!=n!。時間復(fù)雜性:O(n!)算法3.9生成排列對象(偽代碼)1.生成初始排列{1};2.for(i=2;i<=n;i++)for(j=1;j<=(i-1)!;j++)for(k=i;k>=1;k--)
將i插入到第j個排列中的第k個位置;生成排列對象思路:假定已生成了{(lán)1,2,…,n-1}的所有(94生成子集思路:n個元素組成的集合A={a1,a2,…,an}的所有2n個子集與長度為n的所有2n個比特串之間存在一一對應(yīng)關(guān)系。建立這種關(guān)系的方法是為每個子集指定一個比特串b1b2…bn,如果ai屬于該子集,則bi=1,否則bi=0(1≤i≤n)。如3個元素組成的集合,比特串110表示{a1a2},比特串000表示Φ。生成子集思路:n個元素組成的集合A={a1,a2,…,an}95算法3.10生成子集1.初始化一個長度為n的比特串s=00…0,并將對應(yīng)的子集輸出;2.for(i=1;i<2n;i++)2.1s++;2.2將s對應(yīng)的子集輸出;時間復(fù)雜性:O(2n)。算法3.10生成子集1.初始化一個長度為n的比特串s960/1背包問題0/1背包問題:給定n個重量為{w1,w2,…wn}、價值為{v1,v2,…,vn}的物品和1個容量為C的背包,求這些物品中的一個最有價值的子集,并能夠裝到背包中。思路:考慮給定n個物品集合的所有子集,找出所有可能的子集(總重量不超過背包容量的子集),計算每個子集的價值,從中找出價值最大子集。0/1背包問題0/1背包問題:給定n個重量為{w1,w2,…97TSP問題TSP問題:旅行家要旅行n個城市然后回到出發(fā)城市,要求各個城市經(jīng)歷且僅經(jīng)歷一次,并要求所經(jīng)過的路程最短。思路:1)找出所有的Hamilton回路,并計算每個回路的路徑長度;2)從中選擇路徑長度最短的回路。TSP問題TSP問題:旅行家要旅行n個城市然后回到出發(fā)城市,98TSP問題時間復(fù)雜性:(n-1)!/2(出發(fā)城市固定,實(shí)際旅游了n-1個城市)。例子:abdca11acdba11TSP問題時間復(fù)雜性:(n-1)!/2(出發(fā)城市固定,實(shí)際99第4/5章分/減治法理解分治法的基本思路及在典型問題中的應(yīng)用掌握遞歸方法在算法設(shè)計中的應(yīng)用。掌握減治法在經(jīng)典問題中的應(yīng)用習(xí)題4.3習(xí)題4.4習(xí)題5.2第4/5章分/減治法理解分治法的基本思路及在典型問題中100分治法的求解過程
一般來說,分治法的求解過程由以下三個階段組成:(1)劃分:既然是分治,當(dāng)然需要把規(guī)模為n的原問題劃分為k個規(guī)模較小的子問題,并盡量使這k個子問題的規(guī)模大致相同。(2)求解子問題:各子問題的解法與原問題的解法通常是相同的,可以用遞歸的方法求解各個子問題,有時遞歸處理也可以用循環(huán)來實(shí)現(xiàn)。(3)合并:把各個子問題的解合并起來,合并的代價因情況不同有很大差異,分治算法的有效性很大程度上依賴于合并的實(shí)現(xiàn)。分治法的求解過程一般來說,分治法的求解過程由以101子問題的規(guī)模是n/2子問題的解原問題的解原問題的規(guī)模是n減治法的設(shè)計思想子問題子問題的解102遞歸遞歸(Recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過一系列調(diào)用語句間接調(diào)用自己,是一種描述問題和解決問題的基本方法。遞歸有兩個基本要素:⑴邊界條件:確定遞歸到何時終止;⑵遞歸模式:大問題是如何分解為小問題的。遞歸遞歸(Recursion)就是子程序(或函數(shù)103一個遞歸和減治法混合應(yīng)用例子----俄式乘法習(xí)題5的第2題intrmul(intn,intm)/*方法1:遞歸法*/{inthalfn,bm,product;if(n==0)return0;if(n==1)returnm;一個遞歸和減治法混合應(yīng)用例子----俄式乘法習(xí)題5的第2題104if(n%2==0){halfn=n>>1;bm=m<<1;product=rmul(halfn,bm);}if(n%2==1){halfn=n>>1;bm=m<<1;product=rmul(halfn,bm)+m;}returnproduct;}if(n%2==0)105intrmul(intn,intm)/*方法2:非遞歸法*/
{intresult=0;while(n!=0)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 政府職能轉(zhuǎn)變與公共政策試題及答案
- 項(xiàng)目變更管理的實(shí)踐與思考試題及答案
- 考前沖刺2025年信息系統(tǒng)項(xiàng)目管理師試題及答案
- 西方國家的選舉誠信與透明性考核試題及答案
- 項(xiàng)目管理中的時間線與任務(wù)分配技巧試題及答案
- 影響2025年西方政治制度的因素試題及答案
- 選舉公平性在西方的試題及答案
- 解鎖軟件開發(fā)中的代碼質(zhì)量標(biāo)準(zhǔn)與試題答案
- 網(wǎng)絡(luò)架構(gòu)師的角色定位與試題及答案
- 機(jī)電工程技能考核解析及試題與答案
- 中職高教版(2023)語文職業(yè)模塊-第一單元1.4閃亮的坐標(biāo),勞模王進(jìn)喜【課件】
- 冠脈介入對比劑使用專家共識課件
- (云南卷)2025年中考地理第一次模擬考試(A4考試版)
- 【MOOC期末】《模擬電子線路A》(南京郵電大學(xué))期末中國大學(xué)慕課答案
- 2025年中國融通農(nóng)發(fā)社會招聘筆試參考題庫含答案解析
- 矛盾普遍性與特殊性的辯證關(guān)系
- 第五課+弘揚(yáng)勞動精神、勞模精神、工匠精神【中職專用】中職思想政治《職業(yè)道德與法治》高效課堂(高教版2023·基礎(chǔ)模塊)
- T-CAS 886-2024 輸血相容性檢測設(shè)備檢測性能驗(yàn)證技術(shù)規(guī)范
- 公司安全生產(chǎn)事故隱患內(nèi)部報告獎勵工作制度
- 【詞匯】311個四級核心高頻詞匯
- 稻鴨共作及其環(huán)境效應(yīng)
評論
0/150
提交評論