You are on page 1of 10

Algorithm Midterm Exam (Spring 2009)

總分:
總分:113 %

Name:

Student ID #:

Question Score

1 (33%)

2 (15%)

3 (15%)

4 (10%)

5 (20%)

6 (20%)

Total
1. [Simple questions: 33%] 簡答題 (含是非選擇),無需任何說明。
(a) [5%] 依照 asymptotic complexity 的順序由小排到大:
(i) n2lgn, (ii) 8lgn, (iii) lg ((n – 2)!), (iv) lg (n2–1000)

(b) [5%] 依照演算法由快排到慢:


(i) greedy, (ii) dynamic programming, (iii) average case of merge sort, (iv)
unsuccessful search in a hash table assuming simple uniform hashing

(c) [2%] (是非題) 對於任何小的一個數 ε > 0,我們都可以有 n ε = Ω(lg n),


是或否?

(d) [2%] (是非題) 如果將 merge sort 轉換成 decision tree 的模型,其中最短
的路徑可以是Θ(n)?

(e) [2%] (是非題) merge sort 和 dynamic programming 是兩個用 bottom-up 比


用 top-down 的演算法來得有效率的兩個例子?
(f) [3%] (選擇題) 哪一樣符號最適合來表達 f (n) = O(n) + Ω(n),
(i) O(n),(ii) Θ(n),(iii) Ω(n),(iv)以上皆非?

(g) [3%] (簡答題) 建議任兩種 stable 的排序方法。

(h) [5%] (簡答題) 描述如何將一個 excel 檔案裏的個人資料先依照姓名筆劃


來排,再依照年紀來排,然後這兩個屬性都相同的,再依照身分證號碼
來排。

(i) [3%] (簡答題) 假設手中有$1, $5, $10, $25 不同面額的硬幣若干枚,如果


想要用最少的硬幣來支付某一給定的金額,這種問題最適合的解法為
何?

(j) [3%] (簡答題) 大小為 p × q 和 q × r 的兩個矩陣相乘所需的 complexity 為


何?
2. [Recurrence equations: 15%] 解下列的 recurrence equations。你的答案只需給
出 asymptotic 的函數形式。必要時可以使用 master theorem。
(a) T(n) = 3T(n / 9) + n

(b) T(n) = 7T(n / 3) + n3 lg n


(c) T(n) = n T( n) + n
√ √
3. [Heap: 15%] (a) 判斷以下存在一 array 上的數列 15, 12, 9, 8, 6, 10, 4, 2, 1, 5 是
否 構 成 一 maximum heap 。 如 果 不 是 可 否 依 照 課 本 或 以 下 所 附 的
MAX-HEAPIFY 演算法將其轉換成一 maximum heap?為什麼?(b) 如果數列
換成 15, 5, 9, 8, 6, 10, 4, 2, 1, 12 你的答案又為何?

MAX-HEAPIFY(A, i)
1 l → LEFT(i)
2 r → RIGHT(i)
3 if l ≤ heap-size[A] and A[l] > A[i]
4 then largest ← l
5 else largest ← i
6 if r ≤ heap-size[A] and A[r] > A[largest]
7 then largest ← r
8 if largest ≠ i
9 then SWAP(A[i], A[largest])
10 MAX-HEAPIFY(A, largest)
4. [Sorting: 10%] 給定 n 個介於 0 與 n3 – 1 的數,建議如何在 O(n) 的時間內完
成排序的工作。
5. [Sorting: 20%] 給三個元素,利用(a) Insertion sort 和(b) Quicksort 分別需要花
多少次的 comparisons 來完成排序的工作?請分別依照 the best case 和 the
worst case,詳細寫下你的過程。你覺得在兩種情形下各用哪種方法較適合
呢?以下附相關的 pseudo codes 供參考。

INSERTION-SORT(A)
1 for j ←2 to length[A]
2 do key ← A[j]
3 /∗ Insert A[j] into the sorted sequence A[1..j-1] */
4 i ←j−1
5 while i > 0 and A[i] > key
6 do A[i + 1] ← A[i]
7 i ←i−1
8 A[i +1] ← key

QUICKSORT(A, p, r)
1 if p<r
2 then q ← PARTITION(A, p, r)
3 QUICKSORT(A, p, q-1)
4 QUICKSORT(A, q+1, r)

PARTITION(A, p, r)
1 x ← A[r]
2 i←p−1
3 for j ← p to r − 1
4 do if A[j] ≤ x
5 then i ← i + 1
6 SWAP(A[i], A[j])
7 SWAP(A[i + 1], A[r])
8 return i+1
6. [Hashing : 20%] 回答以下兩個關於 hashing 的小題。
(a) 請分別用 linear probing 和 double hashing 的方式計算輸入 30, 4, 9, 10, 5,
17, 16, 15, 14, 13 依序放入大小為 11 的 hash table 之後的結果。我們假設
linear probing 所使用的 hash function 為 h1(k) = k mod 11 而 double hashing
所使用的 hash functions 為 h1(k) = k mod 11 and h2(k) = 1 + (k mod 7)。
(b) 你可能會注意到輸入的數字中有一個 17, 16, 15, 14, 13 的遞減串列,請問
這樣串列的出現對於使用 linear probing 和 double hashing 分別有什麼影
響?

You might also like