




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、【精品文檔】如有侵權,請聯系網站刪除,僅供學習與交流算法設計與分析基礎習題參考答案.精品文檔.習題1.1 5.證明等式gcd(m,n)=gcd(n,m mod n)對每一對正整數m,n都成立.Hint:根據除法的定義不難證明: 如果d整除u和v, 那么d一定能整除u±v; 如果d整除u,那么d也能夠整除u的任何整數倍ku.對于任意一對正整數m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;顯然,若d能整除n和r,也一定能整除m=r+qn和n。數對(m,n)和(n,r)具有相同的公約數的有限非空集,其中也包括了最大公約數。故gcd(m,n)=gcd(n,r)6
2、.對于第一個數小于第二個數的一對數字,歐幾里得算法將會如何處理?該算法在處理這種輸入的過程中,上述情況最多會發生幾次?Hint:對于任何形如0<=m<n的一對數字,Euclid算法在第一次疊代時交換m和n, 即gcd(m,n)=gcd(n,m)并且這種交換處理只發生一次.7.a.對于所有1m,n10的輸入, Euclid算法最少要做幾次除法?(1次) b. 對于所有1m,n10的輸入, Euclid算法最多要做幾次除法?(5次) gcd(5,8)習題1.2 1.(農夫過河)P農夫 W狼 G山羊 C白菜2.(過橋問題)1,2,5,10-分別代表4個人, f手電筒4. 對于任意實系數a
3、,b,c, 某個算法能求方程ax2+bx+c=0的實根,寫出上述算法的偽代碼(可以假設sqrt(x)是求平方根的函數)算法Quadratic(a,b,c)/求方程ax2+bx+c=0的實根的算法/輸入:實系數a,b,c/輸出:實根或者無解信息If a0 Db*b-4*a*c If D>0 temp2*a x1(-b+sqrt(D)/temp x2(-b-sqrt(D)/temp return x1,x2 else if D=0 return b/(2*a) else return “no real roots”else /a=0 if b0 return c/b else /a=b=0
4、if c=0 return “no real numbers” else return “no real roots”5. 描述將十進制整數表達為二進制整數的標準算法a.用文字描述b.用偽代碼描述解答: a.將十進制整數轉換為二進制整數的算法 輸入:一個正整數n輸出:正整數n相應的二進制數第一步:用n除以2,余數賦給Ki(i=0,1,2.),商賦給n第二步:如果n=0,則到第三步,否則重復第一步第三步:將Ki按照i從高到低的順序輸出b.偽代碼 算法 DectoBin(n)/將十進制整數n轉換為二進制整數的算法/輸入:正整數n/輸出:該正整數相應的二進制數,該數存放于數組Bin1.n中i=1wh
5、ile n!=0 do Bini=n%2;n=(int)n/2;i+;while i!=0 doprint Bini;i-;9.考慮下面這個算法,它求的是數組中大小相差最小的兩個元素的差.(算法略)對這個算法做盡可能多的改進.算法 MinDistance(A0.n-1)/輸入:數組A0.n-1/輸出:the smallest distance d between two of its elements習題1.3 考慮這樣一個排序算法,該算法對于待排序的數組中的每一個元素,計算比它小的元素個數,然后利用這個信息,將各個元素放到有序數組的相應位置上去.a.應用該算法對列表”60,35,81,98,
6、14,47”排序b.該算法穩定嗎?c.該算法在位嗎?解:a. 該算法對列表”60,35,81,98,14,47”排序的過程如下所示:b.該算法不穩定.比如對列表”2,2*”排序c.該算法不在位.額外空間for S and Count4.(古老的七橋問題)習題1.41.請分別描述一下應該如何實現下列對數組的操作,使得操作時間不依賴數組的長度.a.刪除數組的第i個元素(1<=i<=n)b.刪除有序數組的第i個元素(依然有序)hints:a. Replace the ith element with the last element and decrease the array size
7、 of 1b. Replace the ith element with a special symbol that cannot be a value of the arrays element(e.g., 0 for an array of positive numbers ) to mark the ith position is empty.(“lazy deletion”)習題2.11 歐幾里得算法的時間復雜度歐幾里得算法, 又稱輾轉相除法, 用于求兩個自然數的最大公約數. 算法的思想很簡單, 基于下面的數論等式 gcd(a, b) = gcd(b, a mod b)其中gcd(a,
8、 b)表示a和b的最大公約數, mod是模運算, 即求a除以b的余數. 算法如下:輸入: 兩個整數a, b輸出: a和b的最大公約數function gcd(a, b:integer):integer; if b=0 return a; else return gcd(b, a mod b);end function歐幾里得算法是最古老而經典的算法, 理解和掌握這一算法并不難, 但要分析它的時間復雜度卻并不容易. 我們先不考慮模運算本身的時間復雜度(算術運算的時間復雜度在Knuth的TAOCP中有詳細的討論), 我們只考慮這樣的問題: 歐幾里得算法在最壞情況下所需的模運算次數和輸入的a和b的大
9、小有怎樣的關系?我們不妨設a>b>=1(若a<b我們只需多做一次模運算, 若b=0或a=b模運算的次數分別為0和1), 構造數列un: u0=a, u1=b, uk=uk-2 mod uk-1(k>=2), 顯然, 若算法需要n次模運算, 則有un=gcd(a, b), un+1=0. 我們比較數列un和菲波那契數列Fn, F0=1<=un, F1=1<=un-1, 又因為由uk mod uk+1=uk+2, 可得uk>=uk+1+uk+2, 由數學歸納法容易得到uk>=Fn-k, 于是得到a=u0>=Fn, b=u0>=Fn-1.
10、也就是說如果歐幾里得算法需要做n次模運算, 則b必定不小于Fn-1. 換句話說, 若 b<Fn-1, 則算法所需模運算的次數必定小于n. 根據菲波那契數列的性質, 有Fn-1>(1.618)n/sqrt(5), 即b>(1.618)n/sqrt(5), 所以模運算的次數為O(lgb)-以b為底數 = O(lg(2)b)-以2為底數,輸入規模也可以看作是b的bit位數。習題2.27.對下列斷言進行證明:(如果是錯誤的,請舉例)a. 如果t(n)O(g(n),則g(n)(t(n)b.>0時,(g(n)= (g(n)解:a. 這個斷言是正確的。它指出如果t(n)的增長率小于或
11、等于g(n)的增長率,那么 g(n)的增長率大于或等于t(n)的增長率 由 t(n)c·g(n) for all nn0, where c>0 則: for all nn0b. 這個斷言是正確的。只需證明。設f(n)(g(n),則有: for all n>=n0, c>0 for all n>=n0, c1=c>0即:f(n)(g(n)又設f(n)(g(n),則有: for all n>=n0,c>0 for all n>=n0,c1=c/>0即:f(n)(g(n)8證明本節定理對于下列符號也成立:a.符號b.符號證明:a。we
12、need to proof that if t1(n)(g1(n) and t2(n)(g2(n), then t1(n)+ t2(n)(maxg1(n), g2(n)。由 t1(n)(g1(n), t1(n)c1g1(n) for all n>=n1, where c1>0由 t2(n)(g2(n), T2(n)c2g2(n) for all n>=n2, where c2>0那么,取c>=minc1,c2,當n>=maxn1,n2時: t1(n)+ t2(n)c1g1(n)+ c2g2(n) c g1(n)+c g2(n)cg1(n)+ g2(n) cm
13、ax g1(n), g2(n)所以以命題成立。b. t1(n)+t2(n) (證明:由大的定義知,必須確定常數c1、c2和n0,使得對于所有n>=n0,有:由t1(n)(g1(n)知,存在非負整數a1,a2和n1使: a1*g1(n)<=t1(n)<=a2*g1(n)-(1)由t2(n)(g2(n)知,存在非負整數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=ma
14、x(a2,b2),則 C1*(g1+g2)<= t1(n)+t2(n) <=c2(g1+g2)-(3)不失一般性假設max(g1(n),g2(n)=g1(n).顯然,g1(n)+g2(n)<2g1(n),即g1+g2<2max(g1,g2)又g2(n)>0,g1(n)+g2(n)>g1(n),即g1+g2>max(g1,g2)。則(3)式轉換為:C1*max(g1,g2) <= t1(n)+t2(n) <=c2*2max(g1,g2)所以當c1min(a1,b1),c22c2=2max(c1,c2),n0max(n1,n2)時,當n>
15、=n0時上述不等式成立。證畢。10. 切忌算法走的步數和人真實走的步數的區別,算法是不需要走回頭路的。習題2.4解下列遞推關系 (做a,b)當n>1時a.解:當n>1時b.解:對于計算n!的遞歸算法F(n),建立其遞歸調用次數的遞推關系并求解。解:考慮下列遞歸算法,該算法用來計算前n個立方的和:S(n)=13+23+n3。算法S(n) /輸入:正整數n /輸出:前n個立方的和if n=1 return 1else return S(n-1)+n*n*na. 建立該算法的基本操作次數的遞推關系并求解b. 如果將這個算法和直截了當的非遞歸算法比,你做何評價?解:a.6. 漢諾塔的非遞歸
16、問題請見F:work繼續教育算法設計與分析基礎7. a. 請基于公式2n=2n-1+2n-1,設計一個遞歸算法。當n是任意非負整數的時候,該算法能夠計算2n的值。 b. 建立該算法所做的加法運算次數的遞推關系并求解 c. 為該算法構造一棵遞歸調用樹,然后計算它所做的遞歸調用次數。 d. 對于該問題的求解來說,這是一個好的算法嗎?解:a.算法power(n)/基于公式2n=2n-1+2n-1,計算2n/輸入:非負整數n/輸出: 2n的值If n=0 return 1Else return power(n-1)+ power(n-1)c.8.考慮下面的算法 算法 Min1(A0.n-1) /輸入:
17、包含n個實數的數組A0.n-1 If n=1 return A0 Else tempMin1(A0.n-2) If tempAn-1 return temp Else return An-1a.該算法計算的是什么?b.建立該算法所做的基本操作次數的遞推關系并求解解:a.計算的給定數組的最小值for all n>1n=1b.9.考慮用于解決第8題問題的另一個算法,該算法遞歸地將數組分成兩半.我們將它稱為Min2(A0.n-1)算法 Min(Ar.l) If l=r return Al Else temp1Min2(Al.(l+r)/2) Temp2Min2(Al.(l+r)/2+1.r)
18、If temp1temp2 return temp1 Else return temp2a.建立該算法所做的的操作次數的遞推關系并求解b.算法Min1和Min2哪個更快?有其他更好的算法嗎?解:a.習題2.54.假設n格梯子有f(n)種方法。 則: f(1) = 1 f(2) = 2 對n>2,有: f(n) = (先上一格,再上n-1格的方法數) + (先上兩格,再上n-2格的方法數) 即 f(n) = f(n-1) + f(n-2) 所以f(n)是Fibonacci數列的第n+1項? #include <stdio.h> long fib(int n) if (n = 1
19、 | n = 2) return 1; return fib(n - 1) + fib(n - 2); main() int n; scanf("%d", &n); printf("%ldn", fib(n+1); return 0; 習題2.6考慮下面的排序算法,其中插入了一個計數器來對關鍵比較次數進行計數.算法SortAnalysis(A0.n-1)/input:包含n個可排序元素的一個數組A0.n-1/output:所做的關鍵比較的總次數count0for i1 to n-1 do vAi ji-1 while j>0 and Aj&
20、gt;v do countcount+1 Aj+1Aj jj+1 Aj+1vreturn count比較計數器是否插在了正確的位置?如果不對,請改正.解:應改為:算法SortAnalysis(A0.n-1)/input:包含n個可排序元素的一個數組A0.n-1/output:所做的關鍵比較的總次數count0for i1 to n-1 do vAi ji-1 while j>=0 and Aj>v do countcount+1 Aj+1Aj jj-1 if j>=0 count=count+1 Aj+1vreturn count7. b gcd(m,n)算法性能最壞情況下為
21、兩個整數為斐波那鍥數列,即k時間最長時,最小的整數對必定為斐波那鍥數列。9. 我認為埃拉托色尼篩的效率為根號n。10. gcd(a,b)復雜性估計 c = a % b ; c < a/2; 在算法中即表現為n(余數)每兩次循環至少減少為原來的一半,所以該算法時間復雜度估算為 2logn = O( logn ); 由于能力有限,更精確復雜的時間復雜度的計算還沒有掌握。在最壞的情況下(如m和n是兩個相鄰的斐波那契數時)可以稍微改進成1.44logn。歐幾里德算法在平均情況下的性能需要大量篇幅的高度復雜的數學分析,其迭代的平均次數約為(12ln2lnn)/pi2+1.47。習題3.14. a.
22、設計一個蠻力算法,對于給定的x0,計算下面多項式的值:P(x)=anxn+an-1xn-1+a1x+a0并確定該算法的最差效率類型.b.如果你設計的算法屬于(n2),請你為該算法設計一個線性的算法.C.對于該問題來說,能不能設計一個比線性效率還要好的算法呢?解:Algorithms BruteForcePolynomialEvaluation(P0.n,x)/由高冪到低冪用蠻力法計算多項式p在給定點x的值/輸入:P0.n是多項式按低冪到高冪的常系數,以及定值x/輸出: 多項式p在給定點x的值p=0.0for i=n to 0 do power=1 for j=1 to i do power=p
23、ower*x p=p+Pi*powerreturn p算法效率分析:基本操作:兩個數相乘,且M(n)僅依賴于多項式的階ntha above algorithms is very inefficient, because we recompute powers of x again and again as if there were no relationship among them.In fact ,we can move from the lowest term to the highest and compute xi by using xi-1.Algorithms BetterBr
24、uteForcePolynomialEvaluation(P0.n,x)/由高冪到低冪用蠻力法計算多項式p在給定點x的值/輸入:P0.n是多項式按低冪到高冪的常系數,以及定值x/輸出: 多項式p在給定點x的值 P=P0 power=1 for i1 to n do powerpower*x pp+Pi*power return p基本操作乘法運算總次數M(n):c.不行.因為計算任意一個多項式在任意點x的值,都必須處理它的n+1 個系數.例如: (x=1,p(x)=an+an-1+.+a1+a0,至少要做n次加法運算) 5.應用選擇排序對序列example按照字母順序排序.6.選擇排序是穩定的
25、嗎?(不穩定) 回到主題,現在分析一下常見的排序算法的穩定性,每個都給出簡單的理由。 (1)冒泡排序 冒泡排序就是把小的元素往前調或者把大的元素往后調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前后順序并沒有改變,所以冒泡排序是一種穩定排序算法。 (2)選擇排序
26、 選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那么,在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素后面,那么交換后穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9, 我們知道第一遍選擇第1個元素5會和2交換,那么原序列中2個5的相對前后順序就被破壞了,所以選擇排序不是一個穩定的排序算法。 (3)插入排序 插入排序是在一個已經有序的小序列的基礎上
27、,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩定的。 (4)快速排序 快速排序有兩個方向,左邊的i下標一直往右走,當ai <= acenter_index,其中center_index是中樞元素的數組下標,一般取為
28、數組第0個元素。而右邊的j下標一直往左走,當aj > acenter_index。如果i和j都走不動了,i <= j, 交換ai和aj,重復上面的過程,直到i>j。 交換aj和acenter_index,完成一趟快速排序。在中樞元素和aj交換的時候,很有可能把前面的元素的穩定性打亂,比如序列為 5 3 3 4 3 8 9 10 11, 現在中樞元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是一個不穩定的排序算法,不穩定發生在中樞元素和aj交換的時刻。 (5)歸并排序 歸并排序是把序列遞歸地分成短序列,遞歸
29、出口是短序列只有1個元素(認為直接有序)或者2個序列(1次比較和交換),然后把各個有序的段序列合并成一個有序的長序列,不斷合并直到原序列全部排好序。可以發現,在1個或2個元素時,1個元素不會交換,2個元素如果大小相等也沒有人故意交換,這不會破壞穩定性。那么,在短的有序序列合并的過程中,穩定是是否受到破壞?沒有,合并過程中我們可以保證如果兩個當前元素相等時,我們把處在前面的序列的元素保存在結果序列的前面,這樣就保證了穩定性。所以,歸并排序也是穩定的排序算法。 (6)基數排序 基數排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類推,直到最高位。有時候有些屬
30、性是有優先級順序的,先按低優先級排序,再按高優先級排序,最后的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。基數排序基于分別排序,分別收集,所以其是穩定的排序算法。 (7)希爾排序(shell) 希爾排序是按照不同步長對元素進行插入排序,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快;當元素基本有序了,步長很小,插入排序對于有序的序列效率很高。所以,希爾排序的時間復雜度會比o(n2)好一些。由于多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序
31、中移動,最后其穩定性就會被打亂,所以shell排序是不穩定的。 (8)堆排序 我們知道堆的結構是節點i的孩子為2*i和2*i+1節點,大頂堆要求父節點大于等于其2個子節點,小頂堆要求父節點小于等于其2個子節點。在一個長為n的序列,堆排序的過程是從第n/2開始和其子節點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當然不會破壞穩定性。但當為n/2-1, n/2-2, .1這些個父節點選擇元素時,就會破壞穩定性。有可能第n/2個父節點交換把后面一個元素交換過去了,而第n/2-1個父節點把后面一個相同的元素沒有交換,那么這2個相同的元素之間的穩定性就被破壞
32、了。所以,堆排序不是穩定的排序算法。 7.用鏈表實現選擇排序的話,能不能獲得和數組版相同的(n2)效率?Yes.Both operationfinding the smallest element and swapping it can be done as efficiently with the linked list as with an array. 9.a.請證明,如果對列表比較一遍之后沒有交換元素的位置,那么這個表已經排好序了,算法可以停止了.b.結合所做的改進,為冒泡排序寫一段偽代碼.c.請證明改進的算法最差效率也是平方級的.Hints:第i趟冒泡可以表示為:如果沒有發生交換位置
33、,那么:b.Algorithms BetterBubblesort(A0.n-1)/用改進的冒泡算法對數組A0.n-1排序/輸入:數組A0.n-1/輸出:升序排列的數組A0.n-1countn-1 /進行比較的相鄰元素對的數目flagtrue /交換標志while flag do flagfalse for i=0 to count-1 do if Ai+1<Ai swap(Ai,Ai+1) flagtrue countcount-1c最差情況是數組是嚴格遞減的,那么此時改進的冒泡排序會蛻化為原來的冒泡排序.10.冒泡排序是穩定的嗎?(穩定)習題3.2對限位器版的順序查找算法的比較次數:
34、在最差情況下在平均情況下.假設成功查找的概率是p(0<=p<=1)Hints:Cworst(n)=n+1在成功查找下,對于任意的I,第一次匹配發生在第i個位置的可能性是p/n,比較次數是i.在查找不成功時,比較次數是n+1,可能性是1-p.4. 本題翻譯有問題,原題類似與:前一段時間看到一道 Google 的面試題在各大論壇被炒得很火,題目如下:“有一個100層高的大廈,你手中有兩個相同的玻璃圍棋子。從這個大廈的某一層扔下圍棋子就會碎,用你手中的這兩個玻璃圍棋子,找出一個最優的策略,來得知那個臨界層面。”題目雖然看起來簡單,但是仔細想想,此題中蘊含的算法道理以及實用價值還是很值得好
35、好研究一下。石頭在網上也看到了不少熱心朋友的解法(CSDN、ChinaUnix),看過之后感覺還是挺有啟發的,于是總結一下,主要的算法有以下幾種:<1> 等分段求最小值:這種算法先假設把大樓分成等高的 x 段,這樣在最差的情況下,要確定臨界段,我們需要投擲 100/x-1 次,確定了臨界段之后要確定臨界層,我們需要再投擲 x-1 次。這樣,問題就成了求函數 f(x)=(100/x-1)+(x-1) 的最小值問題。由于 f(x) 存在最小值且只有一個駐點,所以當 x=10 時 f(x) 取得最小值,最小值為18。<2> 假設投擲次數是均勻分布的,那么為了使最壞情
36、況的投擲數最小,我們希望無論臨界段在哪里,總的投擲數都不變(也就是說將投擲數均勻分布)。這樣我們就可以假設第一次投擲的層數是 f,轉化成數學模型,可以得到如下方程式 f+(f-1)+.+2+1>=99,即 f(f+1)/2>=99 的最小整數解,解出結果等于14。程序算法如下: 按結果分析看來,方法一的最小值的確比較小(10)但是問題是最大值無法確定(比如假設臨界層在第99層則需要仍19下);而方法二的算法好在能得出一個固定的臨界層值,這樣便于一些問題的處理。總的來說,石頭認為兩種方法各有所長,雖然方法二看起來的確更接近出題者的本意,但是如果將棋子本身破碎的概率也考慮進去
37、就不一定了(當然,一般來說層數越高破碎的概率應該越大,但是我們試想一下如果假設棋子破碎的幾率是和層數成反比,那么使用方法一是否會有更好的效果呢?)。然而不管出題者的意圖是什么,我覺得這個題目所引出的數學模型還是很有實用意義的,特別在一些數據挖掘應用中。我猜想這些算法是不是與 Google 數據庫的技術內幕有什么聯系呢 . 前幾天和一個業內的前輩談起下一代互聯網的技術趨勢,說到了所謂的“算法時代”的話題,看來關注一些有趣的算法也不錯呢 . 不知不覺時間又晚了,還是先休息吧 :)6.給出一個長度為n的文本和長度為m的模式構成的實例,它是蠻力字符串匹配算法的一個最差輸入.并指出,對于這樣的輸入需要做
38、多少次字符比較運算.Hints:文本:由n個0組成的文本模式:前m-1個是0,最后一個字符是1比較次數: m(n-m+1)7.為蠻力字符匹配算法寫一個偽代碼,對于給定的模式,它能夠返回給定的文本中所有匹配子串的數量.Algorithms BFStringmatch(T0.n-1,P0.m-1)/蠻力字符匹配/輸入:數組T0.n-1長度為n的文本,數組P0.m-1長度為m的模式/輸出:在文本中匹配成功的子串數量count0for i0 to n-m do j0 while j<m and Pj=Ti+j jj+1 if j=m countcount+1return count8.如果所要搜
39、索的模式包含一些英語中較少見的字符,我們應該如何修改該蠻力算法來利用這個信息.Hint:每次都從這些少見字符開始比較,如果匹配, 則向左邊和右邊進行其它字符的比較.習題3.3奇數派問題:證明如下:容易驗證當n=3時成立;假設n=k時如果成立,那當n=k+2時,k+2個人記為點 A1,A2,A(k+2),d=min(AiAj),不妨設A(k+1)A(k+2)的距離為d,則A(k+1)和A(k+2)相互是距離最近的點,收到彼此的派:如果A(k+1)和A(k+2)還收到其他人的派,其他k個人至多有k-1個派,利用抽屜原理,其他k個人中必有一個人沒有派;如果A(k+1)和A(k+2)沒有收到其他人的派
40、,其他k個人相互在擲派,利用歸納假設,其他k個人中必有一個沒有派,n=k+2時命題成立。7. 凸包問題找那些x、y坐標最小或者最大的10.該問題可以用下圖表示:該問題即轉化為把3x+5y這條直線平行移動,越在上面k值越大,即轉為求陰影部分的某個極點。習題3.4注意該題的假設(所以不需要排列組合算法再去生成旅行線路),只需要對每條線路求出最短路徑的長度再比較這些路徑,所以,該問題的基本操作為加法。下面談談排列組合的遞歸和非遞歸算法:(一時興起,與本題無關)全排列的遞歸算法給定數字1n,輸出從中選出m個數的排列和組合。為了簡單起見,采用遞歸算法來描述,首先解決排列問題:這個算法不太漂亮,用到了兩個
41、全局變量:int ARR = 1,2,3,4,5; / 用來輸出的全局緩沖區int PERM_LEN; / 排列的長度void permutation( int arr, int n, int m ) int i; if( m= 0 ) for(i=0;i<PERM_LEN;+i)
42、160; printf(" %d",ARRi); printf("n"); return; for(i=0; i<n; +i) swap( arri, arr0 ); permutation( arr+1, n-1, m-1 ); swap( arri, arr0 ); 算法比較簡單,不詳細說明了。組合的遞歸算法v
43、oid comb( int n, int m ,int buff, int count ) if( m = 0 ) / 遞歸退出條件,打印回車 for( int i=0;i<count;+i) printf("%d ", buffi ); printf("n"); return; for( int i=0; i<= n - m; +i ) buffcount
44、+ = n-i; comb( n-i-1, m-1,buff,count ); -count; 2. 假設輸入n個頂點用數組表示為vn,而輸入的路徑權重用二維數組t表示找出全排列的一半,即所有排列中只考慮v1在v2前面的排列,假設每種排列存入臨時數組K,用S寄存最小路徑。對每個排列,執行(2)算出排列的路徑長度,如排列為kn,路徑長度為q=tk0,k1+tk1,k2+,如果該長度小于S,則S為q。3根據圖論,連通圖是否具有歐拉回路的充要條件是:G的每一個頂點的度是偶數。所以,只要判斷鄰接矩陣中每行的和是否是偶數即可。很容易得到這樣一個分配實
45、例,用它的成本矩陣描述為1 22 9該分配只有兩種方案,1+9或者2+2(1) 求出n個正整數的和K,如K為奇數,肯定無解。如為偶數,取K/2。 (2) 對n個數進行排序,編號為a1 an,最大數編號為n。(3) 子集中元素個數為1,從an開始找,直到ak<k/2。(4) 子集中元素個數為2,生成所有子集個數并窮舉查找和為k/2的子集。(5)子集中元素個數為P,生成所有子集個數并窮舉查找和為k/2的子集。直到檢查到P=n/2取整即可。方法一:對圖節點進行編號,生成所有K的子集判斷子集中的元素是否兩兩相連,直到找到這樣的子集為止如果找不到這樣的子集就表示沒有k的完備子圖。的完備子圖。方法二
46、:先對圖的節點進行編號然后用下列回溯法找:如先從1號開始,找到連接1號且數字最小的點,如為q,則目前的序列為1,p,接著找與1數字次小的點,為q,判斷q是否與p相連,如有,繼續找,沒有,序列退到1,繼續找與1相連的q,再找與1相連的m等等.直找到序列中的點數為K為止,如與1所有的點都找遍了,再從2開始。總而言之,如果存在這樣的完備子圖,肯定能夠按節點序號排列,所以,以上的方法,后續序列節點的值也要找比序列中所有的值大的以節省時間。(如q>p)枚舉所有的排列,看看是否有序。(1)窮舉法:枚舉所有的幻方組合,看看是否滿足條件(2)網上幻方制作方法:(Magic_Square.pdf)(1)窮
47、舉所有的對應表,按對應表把算式進行對應,如果的確相等,即該算數對應正確。題中字母共有8個,即所有情況為從10個字母中選出8個,同時S M不能為0,即取時的方法共為9(s不能為0)*8(m不能為0)*8!種。(2)見/wiki/Verbal_arithmetic。The solution to this puzzle is O = 0, M = 1, Y = 2, E = 5, N = 6, D = 7, R = 8, and S = 9用回溯法豪無疑問,M肯定為1,而S必定為9,或者8,S為9時,推出o必定為0,就這樣一步步推下去,不行就回溯。習題4
48、.11.a.為一個分治算法編寫偽代碼,該算法求一個n個元素數組中最大元素的位置.b.如果數組中的若干個元素都具有最大值,該算法的輸出是怎樣的呢?c.建立該算法的鍵值比較次數的遞推關系式并求解.d.請拿該算法與解同樣問題的蠻力算法做一個比較解:a.Algorithms MaxIndex(Al.r)Input:A portion of array A0.n-1 between indices l and r(lr)Output: The index of the largest element in Al.rif l=r return lelse temp1MaxIndex(Al.(l+r)/2)
49、temp2MaxIndex(A(l+r)/2.r)if Atemp1Atemp2 return temp1else return temp2b.返回數組中位于最左邊的最大元素的序號.c.鍵值比較次數的遞推關系式: C(n)=C( n/2 )+C( n/2 )+1 for n>1 C(1)=0 設n=2k,C(2k)=2C(2k-1)+1 =22 C(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+2 i-2 +.+2+1 =2kC(2k-k)+ 2k-1+2 k-2 +.+2+1=2
50、k1=n-1可以證明C(n)=n-1對所有n>1的情況都成立(n是偶數或奇數)d.比較的次數相同,但蠻力算法不用遞歸調用。2、a.為一個分治算法編寫偽代碼,該算法同時求出一個n元數組的最大元素和最小元素的值。b.請拿該算法與解同樣問題的蠻力算法做一個比較。c.請拿該算法與解同樣問題的蠻力算法做一個比較。解答: a.同時求出最大值和最小值,只需要將原數組一分為二,再使用相同的方法找出這兩個部分中的最大值和最小值,然后經過比較就可以得到整個問題的最大值和最小值。 算法 MaxMin(Al.r,Max,Min) /該算法利用分治技術得到數組A中的最大值和最小值/輸入:數值數組Al.r/輸出:最
51、大值Max和最小值Minif(r=l) MaxAl;MinAl; /只有一個元素時elseif rl=1 /有兩個元素時if AlArMaxAr; MinAlelseMaxAl; MinArelse /rl>1MaxMin(Al,(l+r)/2,Max1,Min1); /遞歸解決前一部分MaxMin(A(l+r/)2.r,Max2,Min2); /遞歸解決后一部分if Max1Max2 Max= Max2 /從兩部分的兩個最大值中選擇大值if Min2<Min1 Min=Min2; /從兩部分的兩個最小值中選擇小值b.假設n=2k,比較次數的遞推關系式:C(n)=2C(n/2)+2
52、 for n>2C(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 /后面部分為等比數列求和=2k-1+2k-2 /2(k-1)=n/2,2k=n=n/2+n-2=3n/22b.蠻力法的算法如下: 算法 simpleMaxMin(Al.r)/用蠻力法得到數組A的最大值和最小值/輸入:數值數組Al.r/輸出:最大值Max和最小值MinMax=M
53、in=Al;for i=l+1 to r do if Ai>Max MaxAi;else if Ai<Min MinAireturn Max,Min時間復雜度t(n)=2(n-1)算法MaxMin的時間復雜度為3n/2-2,simpleMaxMin的時間復雜度為2n-2,都屬于(n),但比較一下發現,MaxMin的速度要比simpleMaxMin的快一些。 3 自己寫了個求a的n次方的java實現public static int nFloor(int a, int n) int result = 0;if (n=1)return a;if (n % 2 = 0)int nfloo
54、r=nFloor(a, n/2);result = (int)Math.pow(nfloor, 2);System.out.println("n even a is :"+nfloor+"*"+nfloor);System.out.println("result is:"+result);return result; else int nfloor1=nFloor(a, (n - 1)/2);int nfloor2=nfloor1*a;result = nfloor1*nfloor2;System.out.println("
55、a is:"+a+" n is:"+n+ " n odd a is:"+nfloor1+"*"+nfloor2);return result;顯然,乘法次數遞推式為f(n)=f(n/2)+1或者f(n)=f(n-1)/2)+2;簡單看作最壞情況下為f(n)=f(n/2)+2;則該算法乘法次數的效率類型為(log2 n)-以2為底的對數n.求解過程略而蠻力法的效率類型為n。4. a=bd時對數的底是可以省略的,因為底可以作為常數因子,而a>bd,由于底決定n的次方,所以不能略。6.應用合并排序對序列E,X,A,M,P,L,E按字母順序排序.3218.a.對合并排序的最差鍵值比較次數的遞推關系式求解.(for n=2k)b.建立合并排序的最優鍵值比較次數的遞推關系式求解.(for n=2k)c.對于4.1節給出的合并排序算法,建立它的鍵值移動次數的遞推關系式.考慮了該算法的鍵值移動次數之后,是否會影響它的效率類型呢?解:遞推關系
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廣東梅州市量能新能源科技有限公司招聘筆試參考題庫附帶答案詳解
- 2025年福建龍巖武平縣天恒城市建設投資集團招聘筆試參考題庫含答案解析
- 山東棗莊公開招聘社區工作者筆試帶答案2024年
- 2025年浙江湖州市交通集團實業發展有限公司招聘筆試參考題庫含答案解析
- 2025年陜西西安韋斯特隧道工程機械有限公司招聘筆試參考題庫含答案解析
- 2024年北京海淀區事業單位招聘考試真題答案解析
- 對上海家化聯合股份有限公司利潤表分析
- 酒店520活動策劃方案(12篇)
- 護士年終個人總結(15篇)
- 2025高中教師總結心得怎么寫(4篇)
- 第14課 背影 課件(共26張ppt)
- 新版《病歷書寫規范》
- 汽車維修工(三級)技能理論考試題庫(濃縮300題)
- 石景山區行政事業單位資產清查業務培訓
- 《今天怎樣做教師-點評100個教育案例》讀書分享會PPT模板
- 高效節水灌溉技術與灌溉排水工程設計及案例分析
- 《將軍胡同》閱讀試題及答案
- 2022年常德市漢壽縣社區工作者招聘考試試題
- 小學畢業班數學老師家長會完美版資料
- 福建土樓介紹
- 文藝復興時期服裝風格
評論
0/150
提交評論