算法設(shè)計(jì)與分析基礎(chǔ)習(xí)題參考答案_第1頁(yè)
算法設(shè)計(jì)與分析基礎(chǔ)習(xí)題參考答案_第2頁(yè)
算法設(shè)計(jì)與分析基礎(chǔ)習(xí)題參考答案_第3頁(yè)
算法設(shè)計(jì)與分析基礎(chǔ)習(xí)題參考答案_第4頁(yè)
算法設(shè)計(jì)與分析基礎(chǔ)習(xí)題參考答案_第5頁(yè)
已閱讀5頁(yè),還剩104頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、習(xí)題1.15.證明等式gcd(m,n)=gcd(n,mmodn)對(duì)每一對(duì)正整數(shù)m,n都成立.Hint:根據(jù)除法的定義不難證明:如果d整除u和v,那么d一定能整除uv;如果d整除u,那么d也能夠整除u的任何整數(shù)倍ku.對(duì)于任意一對(duì)正整數(shù)m,n,若d能整除m和n,那么d一定能整除n和r=mmodn=m-qn;顯然,若d能整除n和r,也一定能整除m=r+qn和n。數(shù)對(duì)(m,n)和(n,r)具有相同的公約數(shù)的有限非空集,其中也包括了最大公約數(shù)。故gcd(m,n)=gcd(n,r)6.對(duì)于第一個(gè)數(shù)小于第二個(gè)數(shù)的一對(duì)數(shù)字,歐幾里得算法將會(huì)如何處理?該算法在處理這種輸入的過(guò)程中,上述情況最多會(huì)發(fā)生幾次?Hi

2、nt:對(duì)于任何形如0=m0temp2*ax1(-b+sqrt(D)/tempx2(-b-sqrt(D)/tempreturnx1,x2elseifD=0returnb/(2*a)elsereturnnorealrootselse/a=0ifb0returnc/belse/a=b=0ifc=0returnnorealnumberselsereturnnorealroots描述將十進(jìn)制整數(shù)表達(dá)為二進(jìn)制整數(shù)的標(biāo)準(zhǔn)算法a.用文字描述b.用偽代碼描述解答:a.將十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù)的算法輸入:一個(gè)正整數(shù)n輸出:正整數(shù)n相應(yīng)的二進(jìn)制數(shù)第一步:用n除以2,余數(shù)賦給Ki(i=0,1,2.),商賦給n第二

3、步:如果n=0,則到第三步,否則重復(fù)第一步第三步:將Ki按照i從高到低的順序輸出b.偽代碼算法DectoBin(n)將十進(jìn)制整數(shù)n轉(zhuǎn)換為二進(jìn)制整數(shù)的算法輸入:正整數(shù)n/輸出:該正整數(shù)相應(yīng)的二進(jìn)制數(shù),該數(shù)存放于數(shù)組Bin1.n中i=1whilen!=0doBini=n%2;n=(int)n/2;i+;whilei!=0doprintBini;i-;9.考慮下面這個(gè)算法,它求的是數(shù)組中大小相差最小的兩個(gè)元素的差.(算法略)對(duì)這個(gè)算法做盡可能多的改進(jìn).算法MinDistance(A0.n-1)/輸入:數(shù)組A0.n-12/輸出:thesmallestdistancedbetweentwoofitsel

4、ements習(xí)題1.3考慮這樣一個(gè)排序算法,該算法對(duì)于待排序的數(shù)組中的每一個(gè)元素,計(jì)算比它小的元素個(gè)數(shù),然后利用這個(gè)信息,將各個(gè)元素放到有序數(shù)組的相應(yīng)位置上去.a.應(yīng)用該算法對(duì)列表60,35,81,98,14,47排序b.該算法穩(wěn)定嗎?c.該算法在位嗎?:a.該算法對(duì)列表60,35,81,98,14,47排序的過(guò)程如下所示:b.該算法不穩(wěn)定.比如對(duì)列表2,2*排序3c.該算法不在位.額外空間forSandCount4.(古老的七橋問(wèn)題)習(xí)題1.41.請(qǐng)分別描述一下應(yīng)該如何實(shí)現(xiàn)下列對(duì)數(shù)組的操作,使得操作時(shí)間不依賴(lài)數(shù)組的長(zhǎng)度.a.刪除數(shù)組的第i個(gè)元素(1=ib=1(若a=2),顯然,若算法需要n次

5、模運(yùn)算,則有un=gcd(a,b),un+1=0.我們比較數(shù)列un和菲波那契數(shù)列Fn,F0=1=un,F1=1=uk+1+uk+2,由數(shù)學(xué)歸納法容易得到uk=Fn-k,于是得到a=u0=Fn,b=u0=Fn-1.也就是說(shuō)如果歐幾里得算法需要做n次模運(yùn)算,則b必定不小于Fn-1.換句話(huà)說(shuō),若b(1.618)n/sqrt(5),b(1.618)n/sqrt(5),所以模運(yùn)算的次數(shù)為O(lgb)-以b為底數(shù)=O(lg(2)b)-以2為底數(shù),輸入規(guī)模也可以看作是b的bit位數(shù)。習(xí)題2.27.對(duì)下列斷言進(jìn)行證明:(如果是錯(cuò)誤的,請(qǐng)舉例)a.如果t(n)O(g(n),則g(n)(t(n)b.0時(shí),(g(n

6、)=(g(n)解:a.這個(gè)斷言是正確的。它指出如果t(n)的增長(zhǎng)率小于或等于g(n)的增長(zhǎng)率,那么g(n)的增長(zhǎng)率大于或等于t(n)的增長(zhǎng)率由t(n)cg(n)forallnn0,wherec0(1)t(n)g(n)則:cforallnn0b.這個(gè)斷言是正確的。只需證明(g(n)(g(n),(g(n)(g(n)。f(n)(g(n),則有:f(n)cg(n)foralln=n0,c0f(n)c1g(n)foralln=n0,c1=c0即:f(n)(g(n)又設(shè)f(n)(g(n),則有:f(n)cg(n)foralln=n0,c0f(n)cg(n)c1g(n)foralln=n0,c1=c/0即:

7、f(n)(g(n)8證明本節(jié)定理對(duì)于下列符號(hào)也成立:a.符號(hào)b.符號(hào)證明:a。weneedtoproofthatift1(n)(g1(n)andt2(n)(g2(n),thent1(n)+t2(n)(maxg1(n),g2(n)。t1(n)(g1(n),t1(n)c1g1(n)foralln=n1,wherec10t2(n)(g2(n),5T2(n)c2g2(n)foralln=n2,wherec20那么,取c=minc1,c2,當(dāng)n=maxn1,n2時(shí):t1(n)+t2(n)c1g1(n)+c2g2(n)cg1(n)+cg2(n)cg1(n)+g2(n)cmaxg1(n),g2(n)所以以命

8、題成立。b.t1(n)+t2(n)(max(g1(n),g2(n)證明:由大?的定義知,必須確定常數(shù)c1、c2和n0,使得對(duì)于所有n=n0,有:c1max(g1(n),g2(n)t1(n)t2(n)max(g1(n),g2(n)由t1(n)(g1(n)知,存在非負(fù)整數(shù)a1,a2和n1使:a1*g1(n)=t1(n)=a2*g1(n)-(1)由t2(n)(g2(n)知,存在非負(fù)整數(shù)b1,b2和n2使:b1*g2(n)=t2(n)=b2*g2(n)-(2)(1)+(2):a1*g1(n)+b1*g2(n)=t1(n)+t2(n)=a2*g1(n)+b2*g2(n)c1=min(a1,b1),c2=

9、max(a2,b2),則C1*(g1+g2)=t1(n)+t2(n)=c2(g1+g2)-(3)不失一般性假設(shè)max(g1(n),g2(n)=g1(n).顯然,g1(n)+g2(n)2g1(n),即g1+g20,g1(n)+g2(n)g1(n),即g1+g2max(g1,g2)。則(3)式轉(zhuǎn)換為:C1*max(g1,g2)=t1(n)+t2(n)=n0時(shí)上述不等式成立。證畢。切忌算法走的步數(shù)和人真實(shí)走的步數(shù)的區(qū)別,算法是不需要走回頭路的。習(xí)題2.4解下列遞推關(guān)系(做a,b)a.x(n1)5當(dāng)n1時(shí)x(n)x(1)0解:6b.x(n)3x(n1)當(dāng)n1時(shí)x(1)4解:對(duì)于計(jì)算n!的遞歸算法F(n

10、),建立其遞歸調(diào)用次數(shù)的遞推關(guān)系并求解。解:考慮下列遞歸算法,該算法用來(lái)計(jì)算前n個(gè)立方的和:S(n)=13+23+n3。算法S(n)/輸入:正整數(shù)n/輸出:前n個(gè)立方的和ifn=1return1elsereturnS(n-1)+n*n*n建立該算法的基本操作次數(shù)的遞推關(guān)系并求解如果將這個(gè)算法和直截了當(dāng)?shù)姆沁f歸算法比,你做何評(píng)價(jià)?解:a.76.漢諾塔的非遞歸問(wèn)題請(qǐng)見(jiàn)繼續(xù)教育算法設(shè)計(jì)與分析基礎(chǔ)7.a.請(qǐng)基于公式2n=2n-1+2n-1,設(shè)計(jì)一個(gè)遞歸算法。當(dāng)n是任意非負(fù)整數(shù)的時(shí)候,該算法能夠計(jì)2n的值。建立該算法所做的加法運(yùn)算次數(shù)的遞推關(guān)系并求解為該算法構(gòu)造一棵遞歸調(diào)用樹(shù),然后計(jì)算它所做的遞歸調(diào)用次

11、數(shù)。對(duì)于該問(wèn)題的求解來(lái)說(shuō),這是一個(gè)好的算法嗎?:a.算法power(n)基于公式2n=2n-1+2n-1,計(jì)算2n輸入:非負(fù)整數(shù)n輸出:2n的值Ifn=0return1Elsereturnpower(n-1)+power(n-1)c.8nC(n)2i2n11i08.考慮下面的算法算法Min1(A0.n-1)/輸入:包含n個(gè)實(shí)數(shù)的數(shù)組A0.n-1Ifn=1returnA0ElsetempMin1(A0.n-2)IftempAn-1returntempElsereturnAn-1a.該算法計(jì)算的是什么?b.建立該算法所做的基本操作次數(shù)的遞推關(guān)系并求解:a.計(jì)算的給定數(shù)組的最小值C(n1)1fora

12、lln1C(n)n=1b.09.考慮用于解決第8題問(wèn)題的另一個(gè)算法,該算法遞歸地將數(shù)組分成兩半.我們將它稱(chēng)為Min2(A0.n-1)算法Min(Ar.l)Ifl=rreturnAlElsetemp1Min2(Al.(l+r)/2)Temp2Min2(Al.(l+r)/2+1.r)Iftemp1temp2returntemp1Elsereturntemp2a.建立該算法所做的的操作次數(shù)的遞推關(guān)系并求解b.算法Min1和Min2哪個(gè)更快?有其他更好的算法嗎?:a.9習(xí)題2.54.假設(shè)n格梯子有f(n)種方法。則:f(1)=1f(2)=2n2,有:f(n)=(先上一格,再上n-1格的方法數(shù))+(先上

13、兩格,再上n-2格的方法數(shù))即f(n)=f(n-1)+f(n-2)所以f(n)是Fibonacci數(shù)列的第n+1項(xiàng)?#includelongfib(intn)if(n=1|n=2)return1;returnfib(n-1)+fib(n-2);main()intn;scanf(%d,&n);printf(%ldn,fib(n+1);return0;習(xí)題2.6考慮下面的排序算法,其中插入了一個(gè)計(jì)數(shù)器來(lái)對(duì)關(guān)鍵比較次數(shù)進(jìn)行計(jì)數(shù).算法SortAnalysis(A0.n-1)/input:包含n個(gè)可排序元素的一個(gè)數(shù)組A0.n-1/output:所做的關(guān)鍵比較的總次數(shù)count0fori1ton-1doA

14、iji-110whilej0andAjvdocountcount+1Aj+1Ajjj+1Aj+1vreturncount比較計(jì)數(shù)器是否插在了正確的位置?如果不對(duì),請(qǐng)改正.解:應(yīng)改為:算法SortAnalysis(A0.n-1)/input:包含n個(gè)可排序元素的一個(gè)數(shù)組A0.n-1/output:所做的關(guān)鍵比較的總次數(shù)count0fori1ton-1doAiji-1whilej=0andAjvdocountcount+1Aj+1Ajjj-1ifj=0count=count+1Aj+1vreturncount7.bgcd(m,n)算法性能最壞情況下為兩個(gè)整數(shù)為斐波那鍥數(shù)列,即k時(shí)間最長(zhǎng)時(shí),最小的整

15、數(shù)對(duì)必定為斐波那鍥數(shù)列。我認(rèn)為埃拉托色尼篩的效率為根號(hào)n。gcd(a,b)復(fù)雜性估計(jì)c=a%b;ca/2;在算法中即表現(xiàn)為n(余數(shù))每?jī)纱窝h(huán)至少減少為原來(lái)的一半,所以該算法時(shí)間復(fù)雜度估算為2logn=O(logn);由于能力有限,更精確復(fù)雜的時(shí)間復(fù)雜度的計(jì)算還沒(méi)有掌握。在最壞的情況下(如m和n是兩個(gè)相鄰的斐波那契數(shù)時(shí))可以稍微改進(jìn)成1.44logn。歐幾里德算法在平均情況下的性能需要大量篇幅的高度復(fù)雜的數(shù)學(xué)分析,其迭代的平均次數(shù)約為12ln2lnn)/pi2+1.47。11習(xí)題3.1a.設(shè)計(jì)一個(gè)蠻力算法,對(duì)于給定的x0,計(jì)算下面多項(xiàng)式的值:P(x)=anxn+an-1xn-1+a1x+a0并

16、確定該算法的最差效率類(lèi)型.b.如果你設(shè)計(jì)的算法屬于(n2),請(qǐng)你為該算法設(shè)計(jì)一個(gè)線(xiàn)性的算法.C.對(duì)于該問(wèn)題來(lái)說(shuō),能不能設(shè)計(jì)一個(gè)比線(xiàn)性效率還要好的算法呢?:AlgorithmsBruteForcePolynomialEvaluation(P0.n,x)/由高冪到低冪用蠻力法計(jì)算多項(xiàng)式p在給定點(diǎn)x的值/輸入:P0.n是多項(xiàng)式按低冪到高冪的常系數(shù),以及定值x輸出:多項(xiàng)式p在給定點(diǎn)x的值p=0.0fori=nto0dopower=1forj=1toidopower=power*xp=p+Pi*powerreturnp算法效率分析:基本操作:兩個(gè)數(shù)相乘,且M(n)僅依賴(lài)于多項(xiàng)式的階nninn(n1)(n

17、2)M(n)1ii0j1i02thaabovealgorithmsisveryinefficient,becausewerecomputepowersofxagainandagainasiftherewerenorelationshipamongthem.Infact,wecanmovefromthelowesttermtothehighestandcomputexibyusingxi-1.AlgorithmsBetterBruteForcePolynomialEvaluation(P0.n,x)/由高冪到低冪用蠻力法計(jì)算多項(xiàng)式p在給定點(diǎn)x的值/輸入:P0.n是多項(xiàng)式按低冪到高冪的常系數(shù),以及

18、定值x輸出:多項(xiàng)式p在給定點(diǎn)x的值P=P0power=1fori1tondopowerpower*xpp+Pi*powerreturnp基本操作乘法運(yùn)算總次數(shù)M(n):nM(n)22n(n)1不行.因?yàn)橛?jì)算任意一個(gè)多項(xiàng)式在任意點(diǎn)x的值,都必須處理它的n+1個(gè)系數(shù).例如:(x=1,p(x)=an+an-1+.+a1+a0,至少要做n次加法運(yùn)算)5.應(yīng)用選擇排序?qū)π蛄衑xample按照字母順序排序.126.選擇排序是穩(wěn)定的嗎?(不穩(wěn)定)回到主題,現(xiàn)在分析一下常見(jiàn)的排序算法的穩(wěn)定性,每個(gè)都給出簡(jiǎn)單的理由。冒泡排序冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)。比較是相鄰的兩個(gè)元素比較,交換也發(fā)生在

19、這兩個(gè)元素之間。所以,如果兩個(gè)元素相等,我想你是不會(huì)再無(wú)聊地把他們倆交換一下的;如果兩個(gè)相等的元素沒(méi)有相鄰,那么即使通過(guò)前面的兩兩交換把兩個(gè)相鄰起來(lái),這時(shí)候也不會(huì)交換,所以相同元素的前后順序并沒(méi)有改變,所以冒泡排序是一種穩(wěn)定排序算法。選擇排序選擇排序是給每個(gè)位置選擇當(dāng)前元素最小的,比如給第一個(gè)位置選擇最小的,在剩余元素里面給第二個(gè)元素選擇第二小的,依次類(lèi)推,直到第n-1個(gè)元素,第n個(gè)元素不用選擇了,因?yàn)橹皇O滤粋€(gè)最大的元素了。那么,在一趟選擇,如果當(dāng)前元素比一個(gè)元素小,而該小的元素又出現(xiàn)在一個(gè)和當(dāng)前元素相等的元素后面,那么交換后穩(wěn)定性就被破壞了。比較拗口,舉個(gè)例子,序列58529,我們知道第

20、一遍選擇第1個(gè)元素5會(huì)和2交換,那么原序列中2個(gè)5的相對(duì)前后順序就被破壞了,所以選擇排序不是一個(gè)穩(wěn)定的排序算法。(3)插入排序插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素。當(dāng)然,剛開(kāi)始這個(gè)有序的小序列只有1個(gè)元素,就是第一個(gè)元素。比較是從有序序列的末尾開(kāi)始,也就是想要插入的元素和已經(jīng)有序的最大者開(kāi)始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見(jiàn)一個(gè)和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒(méi)有改變,從原無(wú)序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的。(4)快速排序快速排序有兩個(gè)方向,左邊

21、的i下標(biāo)一直往右走,當(dāng)aiacenter_index。如果i和j都走不動(dòng)了,ij。交換aj和acenter_index,完成一趟快速排序。在中樞元素和aj交換的時(shí)候,很有可能把前面的元素的穩(wěn)定性打亂,比如序列為53343891011,現(xiàn)在中樞元素5和3(第5個(gè)元素,下標(biāo)從1開(kāi)始)交換就會(huì)把元素3的穩(wěn)定性打亂,所以快速排序是一個(gè)不穩(wěn)定的排序算法,不穩(wěn)定發(fā)生在中樞元素和aj交換的時(shí)刻。歸并排序歸并排序是把序列遞歸地分成短序列,遞歸出口是短序列只有1個(gè)元素(認(rèn)為直接有序)或者2個(gè)序列(1次比較和交換),然后把各個(gè)有序的段序列合并成一個(gè)有序的長(zhǎng)序列,不斷合并直到原序列全部排好序??梢园l(fā)現(xiàn),在1個(gè)或2個(gè)

22、元素時(shí),1個(gè)元素不會(huì)交換,2個(gè)元素如果大小相等也沒(méi)有人故意交換,這不會(huì)破壞穩(wěn)定性。那么,在短的有序序列合并的過(guò)程中,穩(wěn)定是是否受到破壞?沒(méi)有,合并過(guò)程中我們可以保證如果兩個(gè)當(dāng)前元素相等時(shí),我們把處在前面的序列的元素保存在結(jié)果序列的前面,這樣就保證了穩(wěn)定性。所以,歸并排序也是穩(wěn)定的排序算法?;鶖?shù)排序基數(shù)排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類(lèi)推,直到最高13位。有時(shí)候有些屬性是有優(yōu)先級(jí)順序的,先按低優(yōu)先級(jí)排序,再按高優(yōu)先級(jí)排序,最后的次序就是高優(yōu)先級(jí)高的在前,高優(yōu)先級(jí)相同的低優(yōu)先級(jí)高的在前?;鶖?shù)排序基于分別排序,分別收集,所以其是穩(wěn)定的排序算法。(7)希爾排序(shel

23、l)希爾排序是按照不同步長(zhǎng)對(duì)元素進(jìn)行插入排序,當(dāng)剛開(kāi)始元素很無(wú)序的時(shí)候,步長(zhǎng)最大,所以插入排序的元素個(gè)數(shù)很少,速度很快;當(dāng)元素基本有序了,步長(zhǎng)很小,插入排序?qū)τ谟行虻男蛄行屎芨?。所以,希爾排序的時(shí)間復(fù)雜度會(huì)比o(n2)好一些。由于多次插入排序,我們知道一次插入排序是穩(wěn)定的,不會(huì)改變相同元素的相對(duì)順序,但在不同的插入排序過(guò)程中,相同的元素可能在各自的插入排序中移動(dòng),最后其穩(wěn)定性就會(huì)被打亂,所以shell排序是不穩(wěn)定的。(8)堆排序我們知道堆的結(jié)構(gòu)是節(jié)點(diǎn)i的孩子為2*i和2*i+1節(jié)點(diǎn),大頂堆要求父節(jié)點(diǎn)大于等于其2個(gè)子節(jié)點(diǎn),小頂堆要求父節(jié)點(diǎn)小于等于其2個(gè)子節(jié)點(diǎn)。在一個(gè)長(zhǎng)為n的序列,堆排序的過(guò)程是

24、從第n/2開(kāi)始和其子節(jié)點(diǎn)共3個(gè)值選擇最大(大頂堆)或者最小(小頂堆),這3個(gè)元素之間的選擇當(dāng)然不會(huì)破壞穩(wěn)定性。但當(dāng)為n/2-1,n/2-2,.1這些個(gè)父節(jié)點(diǎn)選擇元素時(shí),就會(huì)破壞穩(wěn)定性。有可能第n/2個(gè)父節(jié)點(diǎn)交換把后面一個(gè)元素交換過(guò)去了,而第n/2-1個(gè)父節(jié)點(diǎn)把后面一個(gè)相同的元素沒(méi)有交換,那么這2個(gè)相同的元素之間的穩(wěn)定性就被破壞了。所以,堆排序不是穩(wěn)定的排序算法。7.用鏈表實(shí)現(xiàn)選擇排序的話(huà),能不能獲得和數(shù)組版相同的(n2)效率?Yes.Bothoperationfindingthesmallestelementandswappingitcanbedoneasefficientlywiththel

25、inkedlistaswithanarray.9.a.請(qǐng)證明,如果對(duì)列表比較一遍之后沒(méi)有交換元素的位置,那么這個(gè)表已經(jīng)排好序了,算法可以停止了.b.結(jié)合所做的改進(jìn),為冒泡排序?qū)懸欢蝹未a.c.請(qǐng)證明改進(jìn)的算法最差效率也是平方級(jí)的.Hints:第i趟冒泡可以表示為:如果沒(méi)有發(fā)生交換位置,那么:b.AlgorithmsBetterBubblesort(A0.n-1)/用改進(jìn)的冒泡算法對(duì)數(shù)組A0.n-1排序輸入:數(shù)組A0.n-1輸出:升序排列的數(shù)組A0.n-1countn-1/進(jìn)行比較的相鄰元素對(duì)的數(shù)目flagtrue/交換標(biāo)志whileflagdoflagfalsefori=0tocount-1d

26、oifAi+1Aiswap(Ai,Ai+1)flagtruecountcount-1c最差情況是數(shù)組是嚴(yán)格遞減的,那么此時(shí)改進(jìn)的冒泡排序會(huì)蛻化為原來(lái)的冒泡排序.1410.冒泡排序是穩(wěn)定的嗎?(穩(wěn)定)習(xí)題3.2對(duì)限位器版的順序查找算法的比較次數(shù):在最差情況下在平均情況下.假設(shè)成功查找的概率是p(0=p=1)Hints:Cworst(n)=n+1在成功查找下,對(duì)于任意的I,第一次匹配發(fā)生在第i個(gè)位置的可能性是p/n,比較次數(shù)是i.在查找不成功時(shí),比較次數(shù)是n+1,可能性是1-p.本題翻譯有問(wèn)題,原題類(lèi)似與:前一段時(shí)間看到一道Google的面試題在各大論壇被炒得很火,題目如下:有一個(gè)100層高的大廈

27、,你手中有兩個(gè)相同的玻璃圍棋子。從這個(gè)大廈的某一層扔下圍棋子就會(huì)碎,用你手中的這兩個(gè)玻璃圍棋子,找出一個(gè)最優(yōu)的策略,來(lái)得知那個(gè)臨界層面。題目雖然看起來(lái)簡(jiǎn)單,但是仔細(xì)想想,此題中蘊(yùn)含的算法道理以及實(shí)用價(jià)值還是很值得好好研究一下。石頭在網(wǎng)上也看到了不少熱心朋友的解法(CSDN、ChinaUnix),看過(guò)之后感覺(jué)還是挺有啟發(fā)的,于是總結(jié)一下,主要的算法有以下幾種:等分段求最小值:這種算法先假設(shè)把大樓分成等高的x段,這樣在最差的情況下,要確定臨界段,我們需要投擲100/x-1次,確定了臨界段之后要確定臨界層,我們需要再投擲x-1次。這樣,問(wèn)題就成了求函數(shù)f(x)=(100/x-1)+(x-1)的最小值

28、問(wèn)題。由于f(x)存在最小值且只有一個(gè)駐點(diǎn),所以當(dāng)x=10時(shí)f(x)取得最小值,最小值為18。假設(shè)投擲次數(shù)是均勻分布的,那么為了使最壞情況的投擲數(shù)最小,我們希望無(wú)論臨界段在哪里,總的投擲數(shù)都不變(也就是說(shuō)將投擲數(shù)均勻分布)。這樣我們就可以假設(shè)第一次投擲的層數(shù)是f,轉(zhuǎn)化成數(shù)學(xué)模型,可以得到如下方程式f+(f-1)+.+2+1=99,即f(f+1)/2=99的最小整數(shù)解,解出結(jié)果等于14。程序算法如下:按結(jié)果分析看來(lái),方法一的最小值的確比較小(10)但是問(wèn)題是最大值無(wú)法確定(比如假設(shè)臨界層在第99層則需要仍19下);而方法二的算法好在能得出一個(gè)固定的臨界層值,這樣便于一些問(wèn)題的處理??偟膩?lái)說(shuō),石頭

29、認(rèn)為兩種方法各有所長(zhǎng),雖然方法二看起來(lái)的確更接近出題者的本意,但是如果將棋子本身破碎的概率也考慮進(jìn)去就不一定了(當(dāng)然,一般來(lái)說(shuō)層數(shù)越高破碎的概率應(yīng)該越大,但是我們?cè)囅胍幌氯绻僭O(shè)棋子破碎的幾率是和層數(shù)成反比,那么使用方法一是否會(huì)有更好的效果呢?)。然而不管出題者的意圖是什么,我覺(jué)得這個(gè)題目所引出的數(shù)學(xué)模型還是很有實(shí)用意義的,特別在一些數(shù)據(jù)挖掘應(yīng)用中。我猜想這些算法是不是與Google數(shù)據(jù)庫(kù)的技術(shù)內(nèi)幕有什么聯(lián)系呢.前幾天和一個(gè)業(yè)內(nèi)的前輩談起下一代互聯(lián)網(wǎng)的技術(shù)趨勢(shì),說(shuō)到了所謂的算法時(shí)代的話(huà)題,看來(lái)關(guān)注一些有趣的算法也不錯(cuò)呢.不知不覺(jué)時(shí)間又晚了,還是先休息吧:)6.給出一個(gè)長(zhǎng)度為n的文本和長(zhǎng)度為m的

30、模式構(gòu)成的實(shí)例,它是蠻力字符串匹配算法的一個(gè)最差輸入.并指出,對(duì)于這樣的輸入需要做多少次字符比較運(yùn)算.Hints:文本:由n個(gè)0組成的文本模式:前m-1個(gè)是0,最后一個(gè)字符是115比較次數(shù):m(n-m+1)7.為蠻力字符匹配算法寫(xiě)一個(gè)偽代碼,對(duì)于給定的模式,它能夠返回給定的文本中所有匹配子串的數(shù)量.AlgorithmsBFStringmatch(T0.n-1,P0.m-1)蠻力字符匹配輸入:數(shù)組T0.n-1長(zhǎng)度為n的文本,數(shù)組P0.m-1長(zhǎng)度為m的模式輸出:在文本中匹配成功的子串?dāng)?shù)量count0fori0ton-mdo0whilejmandPj=Ti+jj+1ifj=mcountcount+1

31、returncount8.如果所要搜索的模式包含一些英語(yǔ)中較少見(jiàn)的字符,我們應(yīng)該如何修改該蠻力算法來(lái)利用這個(gè)信.Hint:每次都從這些少見(jiàn)字符開(kāi)始比較,如果匹配,則向左邊和右邊進(jìn)行其它字符的比較.習(xí)題3.3奇數(shù)派問(wèn)題:證明如下:容易驗(yàn)證當(dāng)n=3時(shí)成立;假設(shè)n=k時(shí)如果成立,那當(dāng)n=k+2時(shí),k+2個(gè)人記為點(diǎn)A1,A2,,,A(k+2),d=min(AiAj),不妨設(shè)A(k+1)A(k+2)的距離為d,則A(k+1)和A(k+2)相互是距離最近的點(diǎn),收到彼此的派:如果A(k+1)和A(k+2)還收到其他人的派,其他k個(gè)人至多有k-1個(gè)派,利用抽屜原理,其他k個(gè)人中必有一個(gè)人沒(méi)有派;如果A(k+1

32、)和A(k+2)沒(méi)有收到其他人的派,其他k個(gè)人相互在擲派,利用歸納假設(shè),其他k個(gè)人中必有一個(gè)沒(méi)有派,n=k+2時(shí)命題成立。凸包問(wèn)題找那些x、y坐標(biāo)最小或者最大的10.該問(wèn)題可以用下圖表示:16該問(wèn)題即轉(zhuǎn)化為把3x+5y這條直線(xiàn)平行移動(dòng),越在上面k值越大,即轉(zhuǎn)為求陰影部分的某個(gè)極點(diǎn)。習(xí)題3.4注意該題的假設(shè)(所以不需要排列組合算法再去生成旅行線(xiàn)路),只需要對(duì)每條線(xiàn)路求出最短路徑的長(zhǎng)度再比較這些路徑,所以,該問(wèn)題的基本操作為加法。下面談?wù)勁帕薪M合的遞歸和非遞歸算法:(一時(shí)興起,與本題無(wú)關(guān))全排列的遞歸算法給定數(shù)字1n,輸出從中選出m個(gè)數(shù)的排列和組合。為了簡(jiǎn)單起見(jiàn),采用遞歸算法來(lái)描述,首先解決排列問(wèn)

33、題:這個(gè)算法不太漂亮,用到了兩個(gè)全局變量:intARR=1,2,3,4,5;/用來(lái)輸出的全局緩沖區(qū)intPERM_LEN;/排列的長(zhǎng)度voidpermutation(intarr,intn,intm)inti;if(m=0)for(i=0;iPERM_LEN;+i)printf(%d,ARRi);printf(n);return;for(i=0;in;+i)17swap(arri,arr0);permutation(arr+1,n-1,m-1);swap(arri,arr0);算法比較簡(jiǎn)單,不詳細(xì)說(shuō)明了。組合的遞歸算法voidcomb(intn,intm,intbuff,intcount)if

34、(m=0)/遞歸退出條件,打印回車(chē)for(inti=0;icount;+i)printf(%d,buffi);printf(n);return;for(inti=0;i=n-m;+i)buffcount+=n-i;comb(n-i-1,m-1,buff,count);-count;2.假設(shè)輸入n個(gè)頂點(diǎn)用數(shù)組表示為vn,而輸入的路徑權(quán)重用二維數(shù)組t表示找出全排列的一半,即所有排列中只考慮v1在v2前面的排列,假設(shè)每種排列存入臨時(shí)數(shù)組K,用S寄存最小路徑。對(duì)每個(gè)排列,執(zhí)行(2)算出排列的路徑長(zhǎng)度,如排列為kn,路徑長(zhǎng)度為q=tk0,k1+tk1,k2+,如果該長(zhǎng)度小于S,則S為q。3根據(jù)圖論,連通

35、圖是否具有歐拉回路的充要條件是:G的每一個(gè)頂點(diǎn)的度是偶數(shù)。所以,只要判斷鄰接矩陣中每行的和是否是偶數(shù)即可。很容易得到這樣一個(gè)分配實(shí)例,用它的成本矩陣描述為1229該分配只有兩種方案,1+9或者2+2求出n個(gè)正整數(shù)的和K,如K為奇數(shù),肯定無(wú)解。如為偶數(shù),取K/2。(2)對(duì)n個(gè)數(shù)進(jìn)行排序,編號(hào)為a1an,最大數(shù)編號(hào)為n。子集中元素個(gè)數(shù)為1,從an開(kāi)始找,直到akp)枚舉所有的排列,看看是否有序。窮舉法:枚舉所有的幻方組合,看看是否滿(mǎn)足條件網(wǎng)上幻方制作方法:(Magic_Square.pdf)1)窮舉所有的對(duì)應(yīng)表,按對(duì)應(yīng)表把算式進(jìn)行對(duì)應(yīng),如果的確相等,即該算數(shù)對(duì)應(yīng)正確。題中字母共有8個(gè),即所有情況為

36、從10個(gè)字母中選出8個(gè),同時(shí)SM不能為0,即取時(shí)的方法共為9(s不能為0)*8(m不能為0)*8!種。2)見(jiàn):/wiki/Verbal_arithmetic。ThesolutiontothispuzzleisO=0,M=1,Y=2,E=5,N=6,D=7,R=8,andS=9用回溯法豪無(wú)疑問(wèn),M肯定為1,而S必定為9,或者8,S為9時(shí),推出o必定為0,就這樣一步步推下去,不行就回溯。19習(xí)題4.11.a.為一個(gè)分治算法編寫(xiě)偽代碼,該算法求一個(gè)n個(gè)元素?cái)?shù)組中最大元素的位置.b.如果數(shù)組中的若干個(gè)元素都具有最大值,該算法的輸出是怎樣的呢?c.建立該算法的鍵值比較次數(shù)的遞推關(guān)系式并求解.d.請(qǐng)拿該算

37、法與解同樣問(wèn)題的蠻力算法做一個(gè)比較解:a.AlgorithmsMaxIndex(Al.r)Input:AportionofarrayA0.n-1betweenindiceslandr(lr)Output:TheindexofthelargestelementinAl.rifl=rreturnlelsetemp1MaxIndex(Al.(l+r)/2)temp2MaxIndex(A(l+r)/2.r)ifAtemp1Atemp2returntemp1elsereturntemp2b.返回?cái)?shù)組中位于最左邊的最大元素的序號(hào).c.鍵值比較次數(shù)的遞推關(guān)系式:C(n)=C(n/2)+C(n/2)+1for

38、n1C(1)=0設(shè)n=2k,C(2k)=2C(2k-1)+1=22C(2k-2)+1+1=22C(2k-2)+2+1=222C(2k-3)+1+2+1=23C(2k-3)+22+2+1=.=2iC(2k-i)+2i-1+2i-2+.+2+1=.=2kC(2k-k)+2k-1+2k-2+.+2+1=2k1=n-1可以證明C(n)=n-1對(duì)所有n1的情況都成立(n是偶數(shù)或奇數(shù))d.比較的次數(shù)相同,但蠻力算法不用遞歸調(diào)用。2、a.為一個(gè)分治算法編寫(xiě)偽代碼,該算法同時(shí)求出一個(gè)n元數(shù)組的最大元素和最小元素的值。b.請(qǐng)拿該算法與解同樣問(wèn)題的蠻力算法做一個(gè)比較。c.請(qǐng)拿該算法與解同樣問(wèn)題的蠻力算法做一個(gè)比較

39、。解答:a.同時(shí)求出最大值和最小值,只需要將原數(shù)組一分為二,再使用相同的方法找出這兩個(gè)部分中的最大值和最小值,然后經(jīng)過(guò)比較就可以得到整個(gè)問(wèn)題的最大值和最小值。算法MaxMin(Al.r,Max,Min)/該算法利用分治技術(shù)得到數(shù)組A中的最大值和最小值輸入:數(shù)值數(shù)組Al.r輸出:最大值Max和最小值Minif(r=l)MaxAl;MinAl;/只有一個(gè)元素時(shí)elseifrl=1/有兩個(gè)元素時(shí)ifAlArMaxAr;MinAlelse20MaxAl;MinArelse/rl1MaxMin(Al,(l+r)/2,Max1,Min1);/遞歸解決前一部分MaxMin(A(l+r/)2.r,Max2,M

40、in2);/遞歸解決后一部分ifMax1Max2Max=Max2/從兩部分的兩個(gè)最大值中選擇大值ifMin22C(1)=0,C(2)=1C(n)=C(2k)=2C(2k-1)+2=22C(2k-2)+2+2=22C(2k-2)+22+2=222C(2k-3)+2+22+2=23C(2k-3)+23+22+2.=2k-1C(2)+2k-1+2k-2+.+2/C(2)=1=2k-1+2k-1+2k-2+.+2/后面部分為等比數(shù)列求和=2k-1+2k-2/2(k-1)=n/2,2k=n=n/2+n-2=3n/22b.蠻力法的算法如下:算法simpleMaxMin(Al.r)用蠻力法得到數(shù)組A的最大值

41、和最小值輸入:數(shù)值數(shù)組Al.r輸出:最大值Max和最小值MinMax=Min=Al;fori=l+1tordoifAiMaxMaxAi;elseifAibd,由于底決定n的次方,所以不能略。6.應(yīng)用合并排序?qū)π蛄蠩,X,A,M,P,L,E按字母順序排序.221238.a.對(duì)合并排序的最差鍵值比較次數(shù)的遞推關(guān)系式求解.(forn=2k)b.建立合并排序的最優(yōu)鍵值比較次數(shù)的遞推關(guān)系式求解.(forn=2k)c.對(duì)于4.1節(jié)給出的合并排序算法,建立它的鍵值移動(dòng)次數(shù)的遞推關(guān)系式.考慮了該算法的鍵值移動(dòng)次數(shù)之后,是否會(huì)影響它的效率類(lèi)型呢?解:遞推關(guān)系式見(jiàn)4.1節(jié).最好情況(列表升序或降序)下:Cbest

42、(n)=2Cbest(n/2)+n/2forn1(n=2k)Cbest(1)=023鍵值比較次數(shù)M(n)M(n)=2M(n/2)+2nforn1M(1)=09修改合并排序,在、C兩個(gè)數(shù)組合并時(shí),一但比較時(shí)發(fā)現(xiàn)的元素小于C,站在C的角度考慮,C后面的元素都大于B,假設(shè)前面的元素都考慮過(guò)了,則此處沒(méi)有導(dǎo)致情況,假設(shè)B的元素大于C,則必定對(duì)于C這個(gè)元素來(lái)說(shuō),B前面的所有元素都比C中那個(gè)元素小,不形成對(duì)置,B后面的所有元素都大于C,則B后面的所有元素與C中被比較的那個(gè)元素形成倒置,這些對(duì)置形成了包含C中那個(gè)元素的所有對(duì)置,當(dāng)B元素和C比較后,C元素指針變?yōu)橄乱粋€(gè)元素,這樣,包含C當(dāng)前指針前面的所有元素

43、的倒置都考慮過(guò)了,我們只要考慮C元素后面的情況就可以了,由于對(duì)于。舉個(gè)例子。一次合并過(guò)程中,現(xiàn)在數(shù)組B元素為2389,C元素為1457。這樣假設(shè)B和C本身中所含的倒置為b和c,則合并后的C數(shù)組的導(dǎo)致為:s初始為b+c2389145721時(shí)倒置為(21)(31)(81)(91)S=S+484時(shí)倒置為(84)(94)S=S+285時(shí)倒置為(85)(95)S=S+2;87時(shí)倒置為(87)(97)S=S+2;s=b+c+1010:/mathdemos/tromino/tromino.html當(dāng)n=1時(shí),很顯然是成立的,當(dāng)n=2時(shí),即為4*4的期盤(pán),可以分成4個(gè)2*2的期盤(pán),可以分成兩種情況,第一種情況

44、:已填充塊在中間(黃色)24第二種情況:已填充塊在邊上很顯然,n=2時(shí),4*4的塊可以分成4個(gè)2*2的塊,而已填充的那1塊必落在4個(gè)2*2的某1塊中,設(shè)該塊為A,填充的第一步就是在其他三個(gè)不包含A塊的2*2塊中各選1塊,形成L型,如上圖第1種情況的的紅色部分或第二種情況的藍(lán)色部分,顯然,剩下的部分都能給L填滿(mǎn)。假設(shè)n=2K時(shí),含有1塊填充的2k*2k期盤(pán)能夠被填滿(mǎn),則含有n=2(k+1)必定得棋盤(pán)能夠分成4個(gè)2K*2k,1塊已填充部分落在4塊其中的1塊,則選擇其他三塊形成一個(gè)L型,則4塊期盤(pán)分別變成n=2k的問(wèn)題。由于n=2K結(jié)論成立,則已有1個(gè)填充塊的2(k+1)*2(k+1)的期盤(pán)必定能夠

45、被的L型填滿(mǎn)。所以給定該題用分治法解決如下:如果n=2;即為2*2的已填充1個(gè)方格的方塊,顯然,剩余的部分形成L型。否則(2)設(shè)n=k(k2)把2k*2k的方塊分成4塊,分別靠緊填充不含已填充方格的L型,遞歸解決n=k-1的問(wèn)題習(xí)題4.21.應(yīng)用快速排序?qū)π蛄蠩,X,A,M,P,L,E按字母順序排序254請(qǐng)舉一個(gè)n個(gè)元素?cái)?shù)組的例子,使得我們有必須對(duì)它使用本節(jié)提到的限位器.限位器的值應(yīng)是多少年來(lái)?為什么一個(gè)限位器就能滿(mǎn)足所有的輸入呢?Hints:26Withthepivotbeingtheleftmostelement,theleft-to-rightscanwillgetoutofbounds

46、ifandonlyifthepivotislargerthantheotherelements.Appendingasentinel(限位器)ofvalueequalA0(orlargerthanA0)afterthearrayslastelement,thequicksortalgorithmswillstoptheindexoftheleft-to-rightscanofA0.n-1fromgoingbeyondpositionn.8.設(shè)計(jì)一個(gè)算法對(duì)n個(gè)實(shí)數(shù)組成的數(shù)組進(jìn)行重新排列,使得其中所有的負(fù)元素都位于正元素之前.這個(gè)算法需要兼顧空間和時(shí)間效率.Algorithmsnetbeforep

47、os(A0.n-1)使所有負(fù)元素位于正元素之前輸入:實(shí)數(shù)組A0.n-1輸出:所有負(fù)元素位于于正元素之前的實(shí)數(shù)組A0.n-1A-1-1;An1限/位器i0;jn-1WhileijdoWhileAi0doii+1whileAj0doj-1swapAiandAjswapAiandAj/undothelastswap當(dāng)全是非負(fù)數(shù)或全是非正數(shù)時(shí)需要限位器.9.假設(shè)R=aW=bB=c的話(huà)可以這樣思考:對(duì)于任意一個(gè)只含三種元素的數(shù)組array:a,b,c,最后排序成arraya,.,a,b,.,b,c,.,c首先從數(shù)組首開(kāi)始,邊界指示器兩個(gè),left=0,right=0;一個(gè)遍歷指針i=0,另一個(gè)遍歷指針j

48、=array.length-1,指向數(shù)組尾元素.while(i1時(shí),Cw(n)=Cw(n/2)+1,Cw(1)=1(略)4.如果對(duì)于一個(gè)100000個(gè)元素的數(shù)組成功查找的話(huà),使用折半查找比順序查找要快多少倍?如何將折半查找應(yīng)用于X圍查找?X圍查找就是對(duì)于一個(gè)有序數(shù)組,找出位于給定值L、U之間(包含L、U)的所有元素,Lrreturn-1elsem(l+r)/2ifK=AmreturnmelseifKAmreturnBSR(Am+1,r,K)8.設(shè)計(jì)一個(gè)只使用兩路比較的折半查找算法,即只用和=,或者只用和=.AlgorithmsTwoWaysBinarySearch(Ao.n-1,K)二路比較的

49、折半查找有序子數(shù)組Al.r和查找鍵值K/查找成功則輸出其下標(biāo),否則輸出-1l0,rn-1whilel1時(shí),A(n)=2+3+4+n+n-1.+2。(9)google沒(méi)有查到關(guān)于pan的這篇論文。32習(xí)題4.61.a.為最近對(duì)問(wèn)題的一維版本設(shè)計(jì)一個(gè)直接基于分治技術(shù)的算法,并確定它的效率類(lèi)型b.對(duì)于這個(gè)問(wèn)題,它是一個(gè)好算法嗎?:AlgorithmsClosestNumber(Al.r)分治計(jì)算最近對(duì)問(wèn)題的一維版本輸入:升序排列的實(shí)數(shù)子數(shù)組Al.r輸出:最近數(shù)對(duì)的距離Ifr=lreturnElseifrl=1returnArAlElsereturnminClosestNumber(Al(l+r)/2

50、),ClosestNumber(A(l+r)/2.r)A(l+r)/2+1A(l+r)/2設(shè)遞歸的時(shí)間效率為T(mén)(n):n=2k,則:T(n)=2T(n/2)+c利用主定理求解.T(n)=(n)b沒(méi)有必要用遞歸。2.(題略)T(n)=2T(n/2)+M(n)其中M(n)為兩部分(n/2)個(gè)點(diǎn)進(jìn)行合并,最壞情況下,先是把兩個(gè)(n/2)個(gè)點(diǎn)根據(jù)y坐標(biāo)軸進(jìn)行簡(jiǎn)單先排序,然后合并?;ㄈ/2*log(n/2)的時(shí)間,針對(duì)左邊n/2三、個(gè)點(diǎn)分別從右邊選出6個(gè)點(diǎn)計(jì)算距離然后與dmin比較(dmin初始位min(d1,d2),花掉6n的時(shí)間,33:/wiki/Voronoi_diagram:/nirareba

51、kun/voro/evoro.html(6)已知P1和Pn,用行列式的值求三角形的面積,面積最大的那個(gè)點(diǎn)就是Pmax。先求上包的路徑,再求下包的路徑。上下包的路徑分別為:A利用行列式求得Pmax,pmax肯定為極點(diǎn),這樣上包路徑轉(zhuǎn)為:Ru=Ruleft+Ruright,利用分治求得。習(xí)題5.11.n=1時(shí)兩個(gè)小孩過(guò)河,到達(dá)對(duì)岸后留下1位,另1位返回,返回后讓士兵過(guò)河,然后再讓小孩返回。共橫渡4次。則n=k時(shí),要橫渡4k次。2.a.設(shè)計(jì)一個(gè)遞歸的減一算法,求n個(gè)實(shí)數(shù)構(gòu)成的數(shù)組中最小元素的位置.b.確定該算法的時(shí)間效率,然后把它與該問(wèn)題的蠻力算法作比較AlgorithmsMinLocation(A

52、0.n-1)/findthelocationofthesmallestelementinagivenarray/anarrayA0.n-1ofrealnumbers/AnindexofthesmallestelementinA0.n-1ifn=1return0elsetempMinLocation(A0.n-2)ifAtemp1C(1)=04.應(yīng)用插入排序?qū)π蛄衑xample按照字母順序排序5.a.對(duì)于插入排序來(lái)說(shuō),為了避免在內(nèi)部循環(huán)的每次迭代時(shí)判斷邊界條件j=0,應(yīng)該在待排序數(shù)組的第一個(gè)元素前放一個(gè)什么樣的限位器?b.帶限位器版本和原版本的效率類(lèi)型相同嗎?解:a.應(yīng)該在待排序數(shù)組的第一個(gè)元素

53、前放-或者小于等于最小元素值的元素.34效率類(lèi)型相同.對(duì)于最差情況(數(shù)組是嚴(yán)格遞減):7.算法InsertSort2(A0.n-1)fori1to-1ndoji-1whilej=0andAjAj+1doswap(Aj,Aj+1)jj+1分析:在教材中算法InsertSort的內(nèi)層循環(huán)包括一次鍵值賦值和一次序號(hào)遞減,而算法InsertSort2的內(nèi)層循環(huán)包括一次鍵值交換和一次序號(hào)遞減,設(shè)一次賦值和一次序號(hào)遞減的時(shí)間分別為ca和cd,那么算法InsertSort2和算法InsertSort運(yùn)行時(shí)間的比率是(3ca+cd)/(ca+cd)81)最大:逆序最?。?jiǎn)握{(diào)遞增2)可以假設(shè)插在前面位置的幾率都

54、相等,求出平均比較次數(shù)。9.該算法最差時(shí)(要插入的數(shù)的下標(biāo)是i),是每次比較后插入的位置是第1個(gè)位置,這樣比較次數(shù)為logi(以2為底),但是插入導(dǎo)致的元素移動(dòng)卻為i。這樣最差效率類(lèi)型為O(n2)。10.希爾排序基本思想基本思想:先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把文件的全部記錄分成d1個(gè)組。所有距離為dl的倍數(shù)的記錄放在同一個(gè)組中。先在各組內(nèi)進(jìn)行直接插人排序;然后,取第二個(gè)增量d2d1重復(fù)上述的分組和排序,直至所取的增量dt=1(dtdt-ld2d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹?。該方法?shí)質(zhì)上是一種分組插入方法。給定實(shí)例的shell排序的排序過(guò)程假設(shè)待排序文件有10個(gè)記

55、錄,其關(guān)鍵字分別是:49,38,65,97,76,13,27,49,55,04。增量序列的取值依次為:5,3,1排序過(guò)程如【動(dòng)畫(huà)模擬演示】。Shell排序的算法實(shí)現(xiàn)1不設(shè)監(jiān)視哨的算法描述voidShellPass(SeqListR,intd)/希爾排序中的一趟排序,d為當(dāng)前增量for(i=d+1;i=n;i+)/將Rd+1n分別插入各組當(dāng)前的有序區(qū)35if(Ri.key0&R0.key0doincrement=increment/3+1;/求下一增量ShellPass(R,increment);/一趟增量為increment的Shell插入排序while(increment1)/ShellSo

56、rt注意:當(dāng)增量d=1時(shí),ShellPass和InsertSort基本一致,只是由于沒(méi)有哨兵而在內(nèi)循環(huán)中增加了一個(gè)循環(huán)判定條件j0,以防下標(biāo)越界。2設(shè)監(jiān)視哨的shell排序算法具體算法【參考書(shū)目12】算法分析1增量序列的選擇Shell排序的執(zhí)行時(shí)間依賴(lài)于增量序列。好的增量序列的共同特征:最后一個(gè)增量必須為1;應(yīng)該盡量避免序列中的值(尤其是相鄰的值)互為倍數(shù)的情況。有人通過(guò)大量的實(shí)驗(yàn),給出了目前較好的結(jié)果:當(dāng)n較大時(shí),比較和移動(dòng)的次數(shù)約在nl.25到1.6n1.25之間。2Shell排序的時(shí)間性能優(yōu)于直接插入排序希爾排序的時(shí)間性能優(yōu)于直接插入排序的原因:當(dāng)文件初態(tài)基本有序時(shí)直接插入排序所需的比較

57、和移動(dòng)次數(shù)均較少。當(dāng)n值較小時(shí),n和n2的差別也較小,即直接插入排序的最好時(shí)間復(fù)雜度O(n)和最壞時(shí)間復(fù)雜度0(n2)差別不大。在希爾排序開(kāi)始時(shí)增量較大,分組較多,每組的記錄數(shù)目少,故各組內(nèi)直接插入較快,后來(lái)增量di逐漸縮小,分組數(shù)逐漸減少,而各組的記錄數(shù)目逐漸增多,但由于已經(jīng)按di-1作為距離排過(guò)序,使文件較接近于有序狀態(tài),所以新的一趟排序過(guò)程也較快。因此,希爾排序在效率上較直接插人排序有較大的改進(jìn)。3穩(wěn)定性36希爾排序是不穩(wěn)定的。參見(jiàn)上述實(shí)例,該例中兩個(gè)相同關(guān)鍵字49在排序前后的相對(duì)次序發(fā)生了變化。關(guān)節(jié)點(diǎn)(隨便看看的,不是習(xí)題)一、定義及應(yīng)用在某圖中,若刪除頂點(diǎn)以及相關(guān)的邊后,圖的一個(gè)連通

58、分量分割為兩個(gè)或兩個(gè)以上的連通分量,則稱(chēng)頂點(diǎn)V為該圖的一個(gè)關(guān)節(jié)點(diǎn)。一個(gè)沒(méi)有關(guān)節(jié)點(diǎn)的連通圖稱(chēng)為重連通圖。在重連通圖中,任意一對(duì)頂點(diǎn)之間至少存在兩條路徑,則再刪去某個(gè)頂點(diǎn)即相關(guān)各邊后也不破壞圖的連通性。若在圖的連通圖上刪去個(gè)節(jié)點(diǎn)才能破壞圖的連通性,則稱(chēng)為此圖的連通度。他們常常在通信網(wǎng)絡(luò)的圖或航空網(wǎng)中應(yīng)用,K越大,系統(tǒng)越穩(wěn)定,反之,戰(zhàn)爭(zhēng)中若要摧毀敵方的運(yùn)輸線(xiàn),只須破壞其運(yùn)輸網(wǎng)中的關(guān)節(jié)點(diǎn)即可。二、求解算法利用深度優(yōu)先搜索便可以求的圖的關(guān)節(jié)點(diǎn),本由此可判別圖是否重連通。從任一點(diǎn)出發(fā)深度優(yōu)先遍歷得到優(yōu)先生成樹(shù),對(duì)書(shū)中任一頂點(diǎn)而言,其孩子節(jié)點(diǎn)為鄰接點(diǎn)。由深度優(yōu)先生成樹(shù)可得出兩類(lèi)關(guān)節(jié)點(diǎn)的特性:()若生成樹(shù)的更

59、有兩棵或兩棵以上的子樹(shù),則此根頂點(diǎn)必為關(guān)節(jié)點(diǎn)。因?yàn)閳D中不存在連接不同子樹(shù)頂點(diǎn)的邊,若刪除此節(jié)點(diǎn),則樹(shù)便成為森林。()若生成樹(shù)中某個(gè)非葉子頂點(diǎn)V,其某棵子樹(shù)的根和子樹(shù)中的其他節(jié)點(diǎn)均沒(méi)有指向V的祖先的回邊,則V為關(guān)節(jié)點(diǎn)。習(xí)題5.21.a.(略)b.3對(duì)于無(wú)向連通圖我覺(jué)得是正確的,樹(shù)的數(shù)量等于連通分量,而對(duì)于又想連通圖,不一定正確。37對(duì)于有向連通圖不一定正確。對(duì)于連通圖來(lái)講,我覺(jué)得應(yīng)該是正確的,對(duì)于非連通圖來(lái)講,由于是連通分量組成,應(yīng)該也是正確的。4.6b舉兩個(gè)例子,一種是DFS更快,另外一種是BFS更快。7選中1個(gè)點(diǎn)開(kāi)始遍歷,完了,遍歷中經(jīng)過(guò)的點(diǎn)形成1個(gè)連通分量,同樣繼續(xù)找到?jīng)]有被遍歷的點(diǎn),直到

60、遍歷結(jié)束,又形成連通分量。8.1)使用DFS遍歷,開(kāi)colorv數(shù)組,元素個(gè)數(shù)為節(jié)點(diǎn)個(gè)數(shù),visit第一個(gè)節(jié)點(diǎn)后,visit0為false,k=1;設(shè)每次visit一個(gè)節(jié)點(diǎn)后,visitk取visitk-1的反值,一旦發(fā)現(xiàn)visitm至visitn的回邊,判斷回邊兩頭值是否不一樣,遍歷完畢后,如果找不到兩頭值一樣的回邊,則為二分圖。否則,不是。(2)與(1)基本相似。10.習(xí)題5.31.DFS的棧狀態(tài):38退棧順序:efgbcad拓?fù)渑判?dacbgfeb.這是一個(gè)有環(huán)有向圖.DFS從a出發(fā),遇到一條從e到a的回邊.2.(1)證明:容易證明若有向圖G=(V,A)不存在環(huán),必有頂點(diǎn)沒(méi)有輸入邊,即

溫馨提示

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

評(píng)論

0/150

提交評(píng)論