期中考試解答 張啟中
1. Ackermann’s function int Ack(int m, int n) { if (m == 0) return n+1; } else if (n==0) return Ack(m-1,1); return Ack(m-1, Ack(m, n-1));
2. Compute the Address of Array 由下圖可知,對於陣列元素 A[i][j][k] 而言,其位址為 α+(i-1)*200 + (j-1)*20 + (k-1) 所以 A[3][7][2] = α+400+120+1 = α+521 A[1][1][1] A[1][1][2] A[1][1][3] ‥‥ A[1][1][19] A[1][1][20] α α+1 α+2 α+18 α+19 A[1][2][1] A[1][2][2] A[1][2][3] ‥‥ A[1][2][19] A[1][2][20] α+20 α+21 α+22 α+38 α+39 A[1][10][1] A[1][10][2] A[1][10][3] ‥‥ A[1][10][19] A[1][10][20] α+180 α+181 α+182 α+198 α+199 A[2][1][1] A[2][1][2] A[2][1][3] ‥‥ A[2][1][19] A[2][1][20] α+200 α+201 α+202 α+218 α+219
3. Infix Translating to Postfix(1) A / (B – C) + D * (E – A) * C / F A / BC- + D * EA- * C / F ABC-/ + DEA-* *C /F ABC-/ + DEA-*C* /F ABC-/ + DEA-*C*F/ ABC-/DEA-*C*F/+
3. Infix Translating to Postfix(2) A / (B – C) + D * (E – A) * C / F Input Token Stack Output None Empty A / ( / ( B AB - / ( - C ABC ) ABC- + ABC-/ (因為 + 小於等於 /)
3. Infix Translating to Postfix(2) A / (B – C) + D * (E – A) * C / F Input Token Stack Output D + ABC-/D * + * ( + * ( E ABC-/DE - + * ( - A ABC-/DEA ) ABC-/DEA- ABC-/DEA-* (注意顏色) C ABC-/DEA-*C
3. Infix Translating to Postfix(2) A / (B – C) + D * (E – A) * C / F Input Token Stack Output / + / ABC-/DEA-*C* F ABC-/DEA-*C*F None + ABC-/DEA-*C*F/ Empty ABC-/DEA-*C*F/+
4. Amount of Permutations of Stack Please see book p130, exercises 2 從右邊依序輸入 1…n 的數,問總共有幾種輸出情形?有那幾種情形不可能出現? 1 …. n
4. Amount of Permutations of Stack All permutations. 1234 2134 2314 2341 1243 2143 2413 2431 1324 3124 3214 3241 1342 3142 3412 3421 1423 4123 4213 4231 1432 4132 4312 4321 Impossible permutations. 上面紅色的部分為不可能的組合 Recursive formula Bn = B0Bn-1 + B1Bn-2 + …. + Bn-2B1 + Bn-1B0
5. Queue Implementation I: Linear Array 用 Linear Array 實作 Queue,在新增時會面臨兩種最壞的情況。 解決方法:依序搬移 Queue 中的元素位置(case 2 需先刪除第一個元素),但其代價需 O(MaxSize) …… 1 2 3 4 MaxSize -1 Case 1: front = 3 rear = MaxSize-1 …… 1 2 3 4 MaxSize -1 Case 2: front = -1 rear = MaxSize-1
5. Queue Implementation II: Circular Array 用 circular Array 實作 Queue,會面臨無法判斷 Queue 是空的或是滿的問題。因為 front == rear 時 Queue 可能為空,也可能為滿。 如何解決? front = rear = 3 Empty front = rear = 3 Full 3 3 4 4 ● 2 ● 2 1 ● 1 ● MaxSize-1 MaxSize-1
5. Queue Implementation II: Circular Array 解決方法,有二種 Method 1:犧牲空間 任何時候只允許 MaxSize-1 個元素在 Queue 中 Method 2:犧牲時間 增加一個變數,記錄上一次的動作。 因為 Queue 元素的新增與刪除非常頻繁,所以我們較常採用 Method 1 既然是考試,同學最好將二種方法詳細描述!
6. Linked Lists (1)Singly Linked Lists (2) Circular Lists first first BAT CAT EAT WAT first (2) Circular Lists BAT CAT EAT WAT first
6. Linked Lists (3) Doubly Linked Lists Head Node LeftLink data RightLink - BAT CAT EAT
7. Generalized Lists A= (a, ( b, c) ) F a T A F b F c A= (a, ( b, c) )
7. Generalized Lists B = (a, ( b, c), (d, e), f) F d F e F a T T F f B F a T T F f B F b F c
8. Failure Function 1 2 3 4 5 b a a a a b -1 -1 -1 -1 -1 1 2 3 4 5 6 7 1 2 3 4 5 b a a a a b -1 -1 -1 -1 -1 1 2 3 4 5 6 7 a b c c a b a b -1 -1 -1 -1 1 1
9. Time Complexity m × n × p O(n3) 1 void prod(matrix a, matrix b, matrix c, int m, int n, int p) 2 { 3 for (int i=0; i<m; i++) 4 for(int j=0;j<p; j++) 5 { 6 c[i][j]=0 7 for (int k=0; k<n; k++) 8 c[i][j] += a[i][k] * b[k][j]; 9 } 10 } m × n × p O(n3)
10. Performance Analysis Conclusion asymptotic 式的演算法分析技巧 ,雖可提供我們評判演算法的優劣,但是在實際運用上必須進一步分析。比方說:演算法 A 需要 103nlogn 的步驟、演算法 B 需要 n2 的步驟。分析的結果演算法 A 是 O(nlogn) ,而演算法 B 是 O(n2),但這並不是說演算法 A 一定比演算法 B 好 — 當 n 不大於103 的時候,演算法 B 就比演算法 A 有效率,因此在這個情形下,我們應該選擇演算法 B 而不是演算法 A。 換句話說,在選擇演算法時,除了考慮其 order 外,也必須考慮所處理問題的大小(即 n )。