遞推遞歸的復雜性分析_第1頁
遞推遞歸的復雜性分析_第2頁
遞推遞歸的復雜性分析_第3頁
遞推遞歸的復雜性分析_第4頁
遞推遞歸的復雜性分析_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2024/1/12計算計算法設計與分析1遞歸復雜性的一般形式一般的,遞歸關系描述為遞歸方程:1n=1aT(n

~b)+D(n)n>1T(n)=其中,a是子問題個數(shù),b是遞減步長,

~表示遞減方式,D(n)是合成子問題的開銷。通常,遞歸元的遞減方式~有兩種:1、除法,即n/b,的形式;2、減法,即n–b,的形式。分治遞推2024/1/12計算計算法設計與分析2遞推關系與遞歸算術序列:h0,h0+q,h0+2q,…,h0+nq,….

或為遞歸式:h(n)=h(n–1)+q,h(0)=h0。幾何序列:h0,qh0,q2h0,…,qnh0,….

或為遞歸式:h(n)=qh(n–1),h(0)=h0。如果遞歸式的遞減方式是減法的話,則遞歸式按其遞歸元就形成一個遞推序列。2024/1/12計算計算法設計與分析3遞推遞歸的時間復雜性

k–1

i=0=akT(1)+ai

D(n–ib)這里k=n/b。不失一般性令b=1,則k=n。若設D(n)為常數(shù),則有T(n)=

O(an)。若~為減法,即n–b,則有:T(n)=aT(n–b)+D(n)=a(aT(n–2b)+D(n–b))+D(n)=

k–1

i=0=ak+ai

D(n–ib)在通常的情況下遞推遞歸的時間復雜性為指數(shù)函數(shù)。2024/1/12計算計算法設計與分析4n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?所謂相互交疊的圓是指兩個圓相交在不同的兩點。2024/1/12計算計算法設計與分析5n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?令h(n)為平面上有n個互相交疊的圓所形成的區(qū)域數(shù)。h(n)=?讓我們先從最簡單的情況來考慮。2024/1/12計算計算法設計與分析6n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?令h(n)為平面上有n個互相交疊的圓所形成的區(qū)域數(shù)。顯然h(0)=1。h(1)=2。h(2)=4。h(3)=8。h(4)=?h(4)=142024/1/12計算計算法設計與分析7n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?令h(n)為平面上有n個互相交疊的圓所形成的區(qū)域數(shù)。h(n)=?我們仍然不知道。我們該怎么做呢?2024/1/12計算計算法設計與分析8n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?令h(n)為平面上有n個互相交疊的圓所形成的區(qū)域數(shù)。這時要考慮復雜情況與較簡單情況之間關系,即復雜情況是怎樣由較簡單情況構成的。2024/1/12計算計算法設計與分析9n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?假設前面n–1個圓形成h(n–1)個區(qū)域。現(xiàn)放進第n個圓與前n–1個圓交疊。讓我們來考慮把這第n個圓交疊上去會造成區(qū)域數(shù)發(fā)生什么樣的變化呢?2024/1/12計算計算法設計與分析10n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?假設前面n–1個圓形成h(n–1)個區(qū)域。現(xiàn)放進第n個圓與前n–1個圓交疊。第n個圓與前n–1個圓都相交于兩點,于是有2(n–1)個交點。這2(n–1)個點將第n個圓分成2(n–1)條弧,而每條弧又將某個區(qū)域一分為二,因此新增加的區(qū)域數(shù)應為2(n–1)。2024/1/12計算計算法設計與分析11n個互相交疊的圓的區(qū)域數(shù)在平面一般位置上有n個互相交疊的圓所形成的區(qū)域數(shù)是多少?令h(n)為平面上有n個互相交疊的圓所形成的區(qū)域數(shù)。于是便得到如下的遞歸式:h(n)=h(n–1)+2(n–1)。這個遞推遞歸式有一個簡單的通項公式:h(n)=h(n–1)+2(n–1)。h(n–2)+2(n–2)+2(n–1)h(n–3)+2(n–3)+2(n–2)+2(n–1)h(1)+2(1)+2(2)+…+2(n–1)2+2n(n–1)/2=n2–n+2。注意此公式對h(0)不成立!n>0。2024/1/12計算計算法設計與分析12棋盤覆蓋問題一個2k×2k特殊棋盤是其中含有一個特殊方格的棋盤,左下圖為k=2的一個特殊棋盤。現(xiàn)在任給定一個2k×2k特殊棋盤,要用右下圖所示的L型骨牌來無重疊的覆蓋它。 111222333444555在2k×2k的棋盤覆蓋中要用到(4k–1)/3個L型骨牌。2024/1/12計算計算法設計與分析13棋盤覆蓋問題讓我們先來考慮最簡單的情況:什么是最簡單的情況?最簡單情況是k=0。這時棋盤有20×20=1個格子,即只有一個特殊格子。這時棋盤已被完全覆蓋,無須再做什么了。下面我們來考慮復雜情況是怎樣由較簡單情況構成的。2024/1/12計算計算法設計與分析14棋盤覆蓋問題的分析當k>0時,將2k×2k棋盤分割成4個2k–1×2k–1的子棋盤,如右下圖所示:2k–1×2k–12k–1×2k–12k–1×2k–12k–1×2k–1特殊方格必定位于4個子棋盤之一中。而這四個子棋盤卻不一致。遞歸求解是將問題歸結到較小規(guī)模的同一問題,這就需要將三個正常子棋盤也轉化成特殊棋盤。2024/1/12計算計算法設計與分析15棋盤覆蓋問題的分析當k>0時,將2k×2k棋盤分割成4個2k–1×2k–1的子棋盤,如右下圖所示:2k–1×2k–12k–1×2k–12k–1×2k–12k–1×2k–1特殊方格必定位于4個子棋盤之一中。為此,可用一個L型骨牌覆蓋三個正常子棋盤的會合處,如左圖所示。這次覆蓋后四個子棋盤都是特殊棋盤了。2024/1/12計算計算法設計與分析16棋盤覆蓋的算法棋盤覆蓋(參數(shù)表){⑴如果是單個格子,則返回;⑵將棋盤劃分成尺寸為一半的子棋盤;⑶判斷特殊方格在哪個子棋盤中,再用相應L型骨牌覆蓋相應結合部,即不含特殊方格的部分在結合部的三個方格;并記下它們的位置,作為各部分的特殊方格;⑷依次對左上角、右上角、右下角和左下角四個子棋盤進行棋盤覆蓋;}2024/1/12計算計算法設計與分析17棋盤覆蓋算法中的參數(shù)算法的形參表中需要的參數(shù)有:遞歸元:棋盤尺寸為2n。每輪遞歸時將n減1,則棋盤尺寸減半;當n為0時遞歸終止。棋盤位置:棋盤左上角方格的行列號tr和tc。特殊方格位置:特殊方格的行列號dr和dc。參數(shù)表中應有哪些參數(shù)呢?遞歸元定義為intn棋盤位置定義為inttr,tc。特殊方格位置定義為intdr,dc。2024/1/12計算計算法設計與分析18棋盤覆蓋算法中其它變量除了形參表中的那些參數(shù)外,棋盤覆蓋程序中還需要如下的變量:表示棋盤的變量。表示L型骨牌覆蓋順序的變量。棋盤尺寸的變量。各子棋盤在結合部的方格位置。各子棋盤的特殊方格的位置。除形參外,算法中還應有哪些變量呢?內部變量全局變量為什么要設這個變量呢?2024/1/12計算計算法設計與分析19棋盤覆蓋算法中其它變量棋盤定義為intBoard[2n][2n],初值為全0。覆蓋順序變量定義為inttile,其初值為0。棋盤尺寸的變量定義為ints,其初值為2n。不設此變量也可以。但因s=2n,則每輪遞歸中都要做求2n的冪運算。設變量s后,只需初始時計算一次s=2n,以后只要做s=s/2即可。這樣降低了遞歸中的運算強度。2024/1/12計算計算法設計與分析20棋盤覆蓋算法中其它變量棋盤定義為intBoard[2n][2n],初值為全0。覆蓋順序變量定義為inttile,其初值為0。棋盤尺寸的變量定義為ints,其初值為2n。0132四個子棋盤的排序為結合部的方格位置定義為intjr[4],jc[4]。各子棋盤的特殊方格的位置定義為intSr[4],Sc[4]。2024/1/12計算計算法設計與分析21棋盤覆蓋算法中其它變量棋盤定義為intBoard[2n][2n],初值為全0。覆蓋順序變量定義為inttile,其初值為0。棋盤尺寸的變量定義為ints。結合部的方格位置定義為intjr[4],jc[4]。各子棋盤的特殊方格的位置定義為intSr[4],Sc[4]。將棋盤覆蓋程序取名為CoverBoard;2024/1/12計算計算法設計與分析22棋盤覆蓋的算法voiceCoverBoard(n,tr,tc,dr,dc){if(n=0)return;n=n–1;s=s/2;tile++;Coverjoin;CoverBoard(n,tr,tc,sr[0],sc[0]);CoverBoard(n,tr+s,tc,sr[1],sc[1]);CoverBoard(n,tr+s,tc+s,sr[2],sc[2])CoverBoard(n,tr,tc+s,sr[3],sc[3])}若只有一個格子,則終止遞歸。注意遞歸元的遞減是在這里做的。s是減半后的子棋盤尺寸。在對結合部覆蓋之前將覆蓋序號tile加一。2024/1/12計算計算法設計與分析23棋盤覆蓋的算法voiceCoverBoard(n,tr,tc,dr,dc){if(n=0)return();n=n–1;s=s/2;tile++;Coverjoin;CoverBoard(n,tr,tc,sr[0],sc[0]);CoverBoard(n,tr+s,tc,sr[1],sc[1]);CoverBoard(n,tr+s,tc+s,sr[2],sc[2])CoverBoard(n,tr,tc+s,sr[3],sc[3])}Coverjoin完成以下功能:1、計算結合部的方格的位置;2、判斷特殊方格位置;3、覆蓋子棋盤結合部并將四個特殊方格的位置寫入sr[]和sc[]。依次對四個子棋盤進行覆蓋。覆蓋左上角的子棋盤。覆蓋右上角的子棋盤。覆蓋右下角的子棋盤。覆蓋左下角的子棋盤。2024/1/12計算計算法設計與分析24棋盤覆蓋的算法voiceCoverBoard(n,tr,tc,dr,dc){if(n=0)return();n=n–1;s=s/2;tile++;Coverjoin;CoverBoard(n,tr,tc,sr[0],sc[0]);CoverBoard(n,tr+s,tc,sr[1],sc[1]);CoverBoard(n,tr+s,tc+s,sr[2],sc[2])CoverBoard(n,tr,tc+s,sr[3],sc[3])}依次對四個子棋盤進行覆蓋。覆蓋左上角的0號子棋盤。覆蓋右上角的1號子棋盤。覆蓋右下角的2號子棋盤。覆蓋左下角的3號子棋盤。2024/1/12計算計算法設計與分析25Coverjoin的實現(xiàn)⑴計算結合部方格位置:⑵判斷特殊方格(dr,dc)落在那個子棋盤:⑶覆蓋結合部并確定各子棋盤特殊方格位置。2024/1/12計算計算法設計與分析26Coverjoin的實現(xiàn)⑴計算結合部方格位置:tr是0區(qū)和1區(qū)的首行,tc是0區(qū)和3區(qū)的首列;tr+s是3區(qū)和2區(qū)的首行;tc+s是1區(qū)和2區(qū)的首列0312trtcss2024/1/12計算計算法設計與分析27Coverjoin的實現(xiàn)⑴計算結合部方格位置:0312trtcssjr[0]=tr+s–1;jc[0]=tc+s–1;jr[1]=tr+s–1;jc[1]=tc+s;jr[2]=tr+s;jc[2]=tc+s;jr[3]=tr+s;jc[3]=tc+s–1;jr[0]=tr+s–1;jc[0]=tc+s–1jr[1]=tr+s–1;jc[1]=tc+sjr[2]=tr+s;jc[2]=tc+sjr[3]=tr+s;jc[3]=tc+s–12024/1/12計算計算法設計與分析28Coverjoin的實現(xiàn)⑴計算結合部方格位置:⑵判斷特殊方格(dr,dc)落在那個子棋盤:我們可以依據(jù)結合部方格的行號和列號來判斷特殊方格落在哪個子棋盤中。0132trtcssjr[0]=tr+s–1;jc[0]=tc+s–1;jr[1]=tr+s;jc[1]=tc+s–1;jr[2]=tr+s;jc[2]=tc+s;jr[3]=tr+s–1;jc[3]=tc+s;2024/1/12計算計算法設計與分析29Coverjoin的實現(xiàn)⑴計算結合部方格位置:⑵判斷特殊方格(dr,dc)落在那個子棋盤:⑶覆蓋結合部并確定各子棋盤特殊方格位置。if(dr<=jr[0]&&dc<=jc[0])r=0elseif(dr<=jr[1]&&dc>=jc[1])r=1elseif(dr>=jr[2]&&dc>=jc[2])r=2elseif(dr>=jr[3]&&dc<=jc[3])r=3;jr[0]=tr+s–1;jc[0]=tc+s–1;jr[1]=tr+s;jc[1]=tc+s–1;jr[2]=tr+s;jc[2]=tc+s;jr[3]=tr+s–1;jc[3]=tc+s;若特殊方格的行標dr<=jr[0]且列標dc<=jc[0],則特殊方格位于在0號子棋盤中。其余類似。r指明了這點。2024/1/12計算計算法設計與分析30Coverjoin的實現(xiàn)⑶覆蓋結合部并確定各子棋盤特殊方格位置:if(r=0){sr[0]=dr;sc[0]=dc;Board[jr[k]][jc[k]]=tile;sr[k]=jr[k];sc[k]=jc[k]];k=1,2,3}elseif(r=1){sr[1]=dr;sc[1]=dc;Board[jr[k]][jc[k]]=tile;sr[k]=jr[k];sc[k]=jc[k]];k=0,2,3}elseif(r=2){sr[2]=dr;sc[2]=dc;Board[jr[k]][jc[k]]=tile;sr[k]=jr[k];sc[k]=jc[k]];k=0,1,3}elseif(r=3){sr[1]=dr;sc[1]=dc;Board[jr[k]][jc[k]]=tile;sr[k]=jr[k];sc[k]=jc[k]];k=0,1,2};注意:此處由于幻燈片篇幅的原因,簡寫成這樣,實際表示對于k=1,2,3,執(zhí)行{Board[jr[k]][jc[k]]=tile;sr[k]=jr[k];sc[k]=jc[k]];},即覆蓋相應格子,并將其作為對應子棋盤的特殊方格。下面亦如此。2024/1/12計算計算法設計與分析31Coverjoin的實現(xiàn)⑶覆蓋結合部并確定各子棋盤特殊方格位置也可以用如下的語句來實現(xiàn):sr[r]=dr;sc[r]=dc;for(k=0,k<4,i++)if(k<>r){Board[jr[k]][jc[k]]=tile;sr[k]=jr[k];sc[k]=jc[k]]};特殊子棋盤的特殊方格還是原來的。對每個非特殊子棋盤,則覆蓋其結合部的方格并將其作為該子棋盤的特殊方格。由于這個操作可以用此簡單表示,所以才在上一張幻燈片上采用了簡記的方式。2024/1/12計算計算法設計與分析32棋盤覆蓋算法的主程序main(intn,intdr,intdc){ints=2nintBoard[s][s]=0;inttile=0;CoverBoard(n,0,0,dr,dc);}請同學們自己編程來具體實現(xiàn)這個程序。2024/1/12計算計算法設計與分析33棋盤覆蓋算法的正確性要證明一個算法的正確性,需要證明兩點:(1)算法的部分正確性;(2)算法的終止性。下面我們用歸納法證明棋盤覆蓋算法的部分正確性:2024/1/12計算計算法設計與分析34棋盤覆蓋算法的部分正確性歸納基礎:k=0時,特殊棋盤僅含一個特殊方格,顯然已經正確覆蓋。假設對2k–1的特殊棋盤均可正確覆蓋。對2k的特殊棋盤,算法劃分為四個2k–1的子棋盤。用一塊L型骨牌覆蓋三個正常子棋盤的結合處后,恰形成四個2k–1的特殊棋盤。由歸納假設,它們均可被正確覆蓋。因而也正確覆蓋了2k的特殊棋盤。由歸納法可知,棋盤覆蓋算法是部分正確。2024/1/12計算計算法設計與分析35棋盤覆蓋算法的終止性算法的終止性:遞歸終止條件為遞歸元size為1時遞歸終止。遞歸元size的初值為2k。每次遞歸時遞歸元減半,即size=size/2;因此,必然在有窮步內遞減為1。所以此算法必定終止。由部分正確性和終止性可知,此算法是完全正確的。2024/1/12計算計算法設計與分析36棋盤覆蓋算法的復雜性設T(k)是棋盤覆蓋算法覆蓋2k×2k的棋盤所需要的時間,則T(k)滿足如下遞歸方程:T(k)=O(1)k=04T(k–1)+O(1)k>0遞歸元遞減方式是減法,故此分治法實質是遞推關系。由a=4可知T(k)=O(4k)。

覆蓋2k×2k的棋盤要用(4k–1)/3個L型骨牌,故此算法是一個在漸進意義下最優(yōu)的算法。2024/1/12計算計算法設計與分析37小結用減法方式遞減的遞歸式按其遞歸元形成一個遞推序列。遞推關系的遞歸程序的時間復雜性T(n)通常不小于

O(an),這里a是子問題的個數(shù)。用遞推遞歸求解的思路仍是先考慮最簡情況,再考慮復雜情況與較簡情況關系。程序的完全正確性由其部分正確性和終止性兩部分構成。2024/1/12計算計算法設計與分析38通信信道上允許傳輸?shù)膯卧~已知在通信信道上傳輸?shù)膯卧~只能由a、b和c三個字母組成并且其中不得有兩個字母a連續(xù)出現(xiàn)。請編寫一個程序生成所有在通信信道上允許傳輸?shù)拈L度為n的單詞。將這樣的單詞稱為長度為n的合法單詞。我們該如何來考慮編寫這個程序呢?1、先分析最簡單情況的解。2、再分析復雜情況如何由較簡情況組成。2024/1/12計算計算法設計與分析39通信信道上允許傳輸?shù)膯卧~應該是長度n=1的單詞。此問題中最簡單的情況是什么?長度為1的合法單詞只有三個,即a、b和c。下面我們再考慮長度為n(n>1)的合法單詞是如何由長度n–1的合法單詞構成的。2024/1/12計算計算法設計與分析40通信信道上允許傳輸?shù)膯卧~把長度為n合法單詞w去掉最前面的一個符號后所剩下的就是長度為n–1的單詞w’。顯然w’仍然應該是合法單詞。如何考慮用長度n–1的合法單詞來構成長度n的合法單詞呢?于是有:w=a+w’b+w’c+w’這里用符號+表示符號串的連接運算。2024/1/12計算計算法設計與分析41通信信道上允許傳輸?shù)膯卧~先考慮w=a+w’的情況:于是有:w=a+b+w’’a+c+w’’因為通信信道上的合法單詞中不允許出現(xiàn)連續(xù)的a,所以w’只能以b或者c開頭。于是w’=b+w’’或者w’=c+w’’。這里w’’為任意的長度為n–2的合法單詞。將長度為n的合法單詞命名為Legal(n)。2024/1/12計算計算法設計與分析42通信信道上允許傳輸?shù)膯卧~先考慮w=a+w’的情況:于是有:Legal(n)=a+b+Legal(n–2)a+c+Legal(n–2)因為通信信道上的合法單詞中不允許出現(xiàn)連續(xù)的a,所以w’只能以b或者c開頭。于是w’=b+w’’或者w’=c+w’’。這里w’’為任意的長度為n–2的合法單詞。2024/1/12計算計算法設計與分析43通信信道上允許傳輸?shù)膯卧~再考慮w=b+w’和w=c+w’的情況:于是有:Legal(n)=b+Legal(n–1)c+Legal(n–1)這里的w’可以為任意的長度為n–1的合法單詞。2024/1/12計算計算法設計與分析44通信信道上允許傳輸?shù)膯卧~綜合起來可以得到長度為n的合法單詞與長度較短的合法單詞之間有如下的關系:Legal(n)=a+b+Legal(n–2)a+c+Legal(n–2)b+Legal(n–1)c+Legal(n–1)現(xiàn)在發(fā)生了一個新的情況!什么情況?2024/1/12計算計算法設計與分析45通信信道上允許傳輸?shù)膯卧~綜合起來可以得到長度為n的合法單詞與長度較短的合法單詞之間有如下的關系:Legal(n)=a+b+Legal(n–2)a+c+Legal(n–2)b+Legal(n–1)c+Legal(n–1)這是個兩步遞歸!可是我們只考慮了n=1這一種最簡單情況!要增加n=0的情況。2024/1/12計算計算法設計與分析46通信信道上允許傳輸?shù)膯卧~綜合起來可以得到長度為n的合法單詞與長度較短的合法單詞之間有如下的關系:Legal(n)=a+b+Legal(n–2)a+c+Legal(n–2)b+Legal(n–1)c+Legal(n–1)我們令當n=0時的合法單詞為空串

,即

Legal(0)=

。2024/1/12計算計算法設計與分析47通信信道上允許傳輸?shù)膯卧~綜合n為0和1的最簡單情況后,有:Legal(n)=

n=0bn=1cn=1an=1a+b+Legal(n–2)n>1a+c+Legal(n–2)n>1b+Legal(n–1)n>1c+Legal(n–1)n>12024/1/12計算計算法設計與分析48程序設計的思考

現(xiàn)在就讓我們來設計這個程序吧!這個程序要打印出所有在通信信道上傳輸?shù)拈L度為n的合法單詞。

現(xiàn)在你頭腦里想象的打印過程該是什么樣子的呢?2024/1/12計算計算法設計與分析49程序設計的思考

現(xiàn)在就讓我們來設計這個程序吧!這個程序要打印出所有在通信信道上傳輸?shù)拈L度為n的合法單詞。我想:這個程序應該是從左向右逐個符號地生成每一個長度為n的合法單詞。每生成一個合法單詞,就把它打印出去。2024/1/12計算計算法設計與分析50程序設計的思考

現(xiàn)在就讓我們來設計這個程序吧!這個程序要打印出所有在通信信道上傳輸?shù)拈L度為n的合法單詞。我想:那么,這個程序就應該有個存放這個長度為n的合法單詞的變量,就叫它w[n]。干脆把這個程序叫做Legal(w,n)好了。2024/1/12計算計算法設計與分析51程序設計的思考

現(xiàn)在就讓我們來設計這個程序吧!這個程序要打印出所有在通信信道上傳輸?shù)拈L度為n的合法單詞。我想:那么,什么時候就該打印合法單詞w[n]呢?

…………那不就是n=0的時候嗎?……2024/1/12計算計算法設計與分析52程序設計的思考

現(xiàn)在就讓我們來設計這個程序吧!這個程序要打印出所有在通信信道上傳輸?shù)拈L度為n的合法單詞。aha!Igotit!按照遞歸規(guī)則,從n開始,就是從左至右,將合法的符號放進w;每放一個符號,n就減一。當n個符號全都放進去了,就是n=0了,就把w打印出去。2024/1/12計算計算法設計與分析53打印合法單詞的程序Legal(w[n],intk){if(k=0){printw}elseif(k=1){Legal(w+a,k–1);Legal(w+b,k–1);Legal(w+c,k–1)}else{Legal(w+a+b,k–2);Legal(w+a+c,k–2);Legal(w+b,k–1);Legal(w+c,k–1)}}main(intn){intw[n]=0;Legal(w[n],n)}考慮運算w+x。2024/1/12計算計算法設計與分析54打印合法單詞的程序Legal(w[n],intk){if(k=0){printw}elseif(k=1){Legal(w+a,k–1);Legal(w+b,k–1);Legal(w+c,k–1)}else{Legal(w+a+b,k–2);Legal(w+a+c,k–2);Legal(w+b,k–1);Legal(w+c,k–1)}}main(intn){intw[n]=0;Legal(w[n],n)}w+x就是w[n–k]=x。w+x+y就是w[n–k]=x;w[n–k+1]=y。2024/1/12計算計算法設計與分析55打印合法單詞的程序我們讓遞歸元的初值為0,終止值為n,而遞歸元的遞減方式改成加法,即n+1。于是這個程序還可改寫成下面的樣子:考慮到運算w+x的方便我們可以改變遞歸的方向。2024/1/12計算計算法設計與分析56打印合法單詞的程序Legal(w[n],intk){if(k=n){printw}elseif(k=n–1){Legal(w+a,k+1);Legal(w+b,k+1);Legal(w+c,k+1)}else{Legal(w+a+b,k+2);Legal(w+a+c,k+2);Legal(w+b,k+1);Legal(w+c,k+1)}}main(intn){intw[n]=0;Legal(w[n],0)}k=n時遞歸終止。遞歸元用加法來遞減。直接將數(shù)組w的第k個分量賦值為a。遞歸元的初值賦為0。請同學們自己變成來具體實現(xiàn)這個程序。2024/1/12計算計算法設計與分析57算法的時間復雜性這個算法是一個遞推的遞歸式,并且是一個兩步遞歸。由前面的基本分析可以斷定其復雜性應該是指數(shù)的,即T(n)=O(an)。這個算法中的子任務為2,因此它的時間復雜性應該不會低于O(2n)。O((1+√3)n)。這個程序的時間復雜性是它的復雜性實際上決定于合法單詞的數(shù)量。2024/1/12計算計算法設計與分析58通信信道上允許傳輸?shù)膯卧~計算通信信道上允許傳輸?shù)暮戏▎卧~個數(shù)。解:令h(n)為的長度≤n的合法單詞個數(shù)。由前面的討論我們有:最簡單情況時h(0)=1,h(1)=3。當n≥2時:h(n)=2h(n–1)+2h(n–2)求解這個遞歸方程可得:(2+√3)2√3(1+√3)n+h(n)=(–2+√3)2√3(1–√3)n這個遞歸函數(shù)也是著名的斐波拉契函數(shù)。有趣的是,對于任意的n,這個無理式的結果都

溫馨提示

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

評論

0/150

提交評論