假設G 為一個無方向連通加權圖(Undirected connected weighted graph),
包含五個節點:A、B、C、D、E。各節點間相連情形如下,邊權(邊的
權重)為正整數,代表邊的成本。
A 與B 相連,邊權為16;
A 與C 相連,邊權為18;
A 與D 相連,邊權為14;
B 與C 相連,邊權為15;
C 與D 相連,邊權為13;
D 與E 相連,邊權為12;
C 與E 相連,邊權為17;
請使用Sollin’s 演算法,寫出最終形成的最小成本擴展樹的邊集合與總
成本,請寫出每一步的演算法與該步驟形成的擴展樹。每一合併過程,
列出選中的邊與合併的組成(component)。(20 分)
請逐步寫出下列使用遞迴函式的呼叫與輸出過程。(25 分)
#include <iostream>
using namespace std;
int A(int n, int c = 1) {
if (n == 0)
return c + 1;
return A(n - 2, c * n);
}
int main() {
cout << A(6) << endl;
return 0;
}
(6)
根據下列的虛擬碼,若n = 21 則傳回的答案為何?請說明。其中floor()
為數學上的地板函數(floor function)。(20 分)
function splitSum(n: integer) returns integer
if n <= 1 then
return 1
a ←floor(n / 2)
b ←floor(n / 3)
return splitSum(a) + splitSum(b)
下列虛擬碼是利用某演算法對陣列A 的元素進行處理,請說明該法是進
行何種處理並請寫出其名稱和在最壞情況下時間複雜度為何?(10 分)
若陣列A = [29, 10, 14, 37, 13],請寫出該虛擬碼的處理過程:請列出陣
列在每一輪(每次外層迴圈執行完後)的內容變化情形。請特別標示出
最終結果為何?(10 分)
doingSomething(A)
begin
n ←陣列A 的元素個數
for i ← 0 to n − 2 do
theIndex ←i
for j ← i + 1 to n − 1 do
if A[j] < A[theIndex] then
theIndex ←j
end for
if theIndex <> i then
temp = A[i]
A[i] = A[theIndex]
A[theIndex] = temp
end if
end for
end
若有200 人,其中一個人開始打電話給兩個人。隨後,每個接到電話
的人都會打電話給另外兩個尚沒有接到電話的人。請問總共會撥打多
少通電話?有多少人不會打電話?(無推導過程不給分)(10 分)
若一個二元樹其前序追蹤順序(Preorder Traversal)及後序追蹤順序
(Postorder Traversal)分別如下,請問此樹是否唯一?並請列出此二元
樹的中序追蹤順序(Inorder Traversal)。(無推導過程不給分)(15 分)
前序追蹤順序:T, S, R, F, D, I, H, E, Z, G, M, L, J, N, Q
後序追蹤順序:F, I, H, D, R, Z, G, E, S, J, N, L, Q, M, T
給定一個以相鄰矩陣(adjacency matrix)表示的一無方向圖如下表,∞表
示沒有邊(edge)相鄰。請畫出對應的圖形,每個邊和其對應的權值必須
列出。另外請使用Kruskal’s 演算法計算權重最小的生成樹(minimum
spanning tree),並詳細列出該生成樹的形成過程。(20 分)
a
b
c
d
e
f
g
a
∞
13
9
10
∞
∞
∞
b
13
∞
∞
16
∞
∞
∞
c
9
∞
∞
12
2
3
∞
d
10
16
12
∞
∞
∞
18
e
∞
∞
2
∞
∞
4
∞
f
∞
∞
3
∞
4
∞
給定一個環狀鏈結串列,節點資料結構宣告如下:
struct node {
char info;
struct node *next;
};
typedef struct node NODE;
請用C 語言或類似虛擬語言(pseudo code)寫出void swapnodes(NODE
*p)函式將兩個指定節點位置交換,過程中不能更動節點內info 內容,
僅能修改節點內next 指標,且兩個節點交換後仍保持環狀鏈結串列。
將指標p 之後面連續兩個節點位置交換,如下圖所示。(15 分)
A
p
交換節點前
infonext
B
C
D
E
A
p
交換節點後
infonext
B
D
C
E
將指標p 之前後節點位置交換,如下圖所示。(15 分)
A
p
交換節點前
infonext
B
C
D
E
A
p
交換節點後
infonext
D
C
B
E
二元搜尋法(binary search)使用divide-and-conquer(分而治之)演算法
技巧,對一個已排序的(sorted)且長度為n 的陣列A[0:n1],以二元化
方式進行資料值x 的搜尋,其最差時間複雜度(worst case time
complexity)可降到(log n)。請使用C++或Python 語言,修改此二元
搜尋法,使其能對未排序的(unsorted)且長度為n 的陣列A[0:n1],進
行三元化搜尋,即以divide-and-conquer 技巧將此陣列切成三個子陣列,
並在可能包含資料值x 的子陣列繼續進行divide-and-conquer 技巧的搜
尋,如果找到則回傳1,如果找不到則回傳0。(17 分)(注意:請寫一
個searching 類別,內含一個search 功能)請分析修改後的三元化搜尋
法其最差時間複雜度(worst case time complexity)以order 的方式表示。
(8 分)
(注意:不可將此陣列數值進行排序,請加註解說明程式碼作法。)
請使用C 語言寫一副程式void FindMeanAverage(int A [], int n, int *
mean, int * average),對一個未排序的(unsorted)且長度為n 的陣列
A[0:n1],尋找陣列中的中位數與平均數,並分別存入mean 及average
運算複雜度。(17 分)請舉例說明此副程式最差情況(worst case)所
花費的運算複雜度。(8 分)(注意:請加註解說明程式碼作法。)
密文(Cipher text or Cypher text):明請到家玩天你我來,應用環狀串列
(circular linked list),請問明文(Plain text or Clear text)為何?(15 分)
如下圖設背包限重100,有A、B、C、D、E 共五個不可分割物件,請
問依貪婪策略(Greedy Algorithm),0_1 整數背包問題(knapsack
problem)/貨物裝載問題(cargo loading problem)其最大利益為何?其
對應的0_1 整數規劃為何?(20 分)
有A、B、C、D、E 共五個可分割物件,請問依貪婪策略,0_1 分數背
包其最大利益為何?(10 分)
物件
重量
利益
A
10
20
B
20
30
C
30
66
D
40
40
E
50
60
1
2
3
4
5
6
9
10
11
四、給予如下之加權雙向圖,邊上的加權值表示此邊的成本。
a
b
c
e
f
d
7
3
8
2
10
5
6
9
4
使用Kruskal’s algorithm 找最小成本擴張樹(Minimal Cost Spanning
Tree, MST)。執行過程中,將邊(edge)逐步加入此MST 之順序為何?
請以邊所對應的兩端節點表示此邊。(5 分)
使用Prim’s algorithm 找出最小成本擴張樹(MST),從節點a 出發。
執行過程中,將邊(edge)逐步加入此MST 之順序為何?請以邊所對
應的兩端節點表示此邊。(5 分)
使用Dijkstra’s algorithm 找出從節點a(來源節點)到其五個節點(目
的節點)之最短路徑(shortest path)。執行過程中,逐步找出最短路徑
的目的節點順序為何?從節點a 到目的節點之最短路徑被找出表示演
算法不再檢視此目的節點之其它可能最短路徑。(10 分)
來源節點a 出發到其他五個目的節點之最短路徑走法與成本分別為
何?(10 分)
9
10
11
12
四、在一棵高度為h(h=0,1,2,…)的AVL tree 中:⑴高度為6之AVL tree 最多
可能有幾個nodes?最少可能有幾個nodes?(假設root 之h=0)(6分)
⑵假設此樹共有45個nodes。請問此AVL tree 可能最高之高度及最矮
之高度各為何?(6分)
請將下列數字{17, 60, 24, 5, 7}逐步插入圖1的AVLtree 中,並平衡之。
(12分)
圖1
五、請利用堆積排序法(Heap Sort)將圖2逐步建立成Min Heap,並將數字
從小到大逐一列舉。(10分)
圖2
六、請利用KMP(Knuth, Morris, Pratt)演算法寫出失敗函數(failure
function)之定義。(4分)
找出pattern “abcdabcabcdabcdabc”之失敗函數(failure function)值(請
填入表2 failure value 中)。(14分)
假設之pattern 嘗試在string “abcdabcabcdabcabcda…..”找出pattern。
當pattern 從index 0開始比對到index 13都一樣,而在index 14時發現
字母不一樣,請問pattern 如何利用failure function 所得之結果很快找
到下一個要對應之位置?也就是pattern 的那一位置的值要位移到
string 的那一對應位置。(4分)
表2
index
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string
a
b
c
d
a
b
c
a
b
c
d
a
b
c
a
b
c
d
a
pattern
a
b
c
d
a
b
c
a
b
c
d
a
b
c
d
a
b
c
failure value
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
給予如下二元樹節點的宣告,分別寫出C 的遞迴程式計算二元樹節點個
數及計算二元樹葉節點(leaves)個數(Count the number of nodes in a
binary tree and count the number of leaf nodes in a binary tree,
respectively)。(25 分)
struct node{
int info;
struct node *left;
struct node *right;
}
typedef struct node *NODEPTR;
void countTree(NODEPTR tree){
}
void countLeaves(NODEPTR tree){
}
6
(
×
+
+
×
−
,請說明其前序與後序運算式
分別為何?(8 分)
請說明為何中序運算式需要使用括號來輔助界定運算元的優先順序
而前序與後序運算式則無需括號?(7 分)
請說明如何利用一個堆疊(Stack)結構計算出一個後序運算式的值,
並以後序運算式a b × c + d c / −為例,其中a = 3, b = 5, c = 2, d = 6,
請逐步列出運算過程中堆疊的內容。(10 分)
二、以下是關於二元搜尋樹(Binary Search Tree)的問題:
請說明二元搜尋樹的定義?(5 分)
是否可以使用一個二元搜尋樹對鍵值(Key)來進行排序(Sorting)?
如果不行,請解釋其原因。若可以,請描述作法及執行時間。(5 分)
AVL 樹是一個基於二元搜尋樹的資料結構,請敘述AVL 樹的定義
並說明為何一個有n 個節點(鍵值)的AVL 樹其高度是O(log n)。
(5 分)
若將鍵值36、25、14、27、55、30 以依序加入的方式建構一個AVL
樹,請繪出每次加入後的AVL 樹。(10 分)
給予如下二元樹節點的宣告,寫一C 的遞迴程式swapTree(NODEPTR
tree)將每一節點的左、右節點互換(Swap the left and right children of
every node of a binary tree)。(25 分)
struct node{
int info;
struct node *left;
struct node *right;
}
typedef struct node *NODEPTR;
void swapTree(NODEPTR tree){
}
給定以相鄰矩陣(adjacency matrix)表示的圖G,矩陣中的數字為相鄰兩
節點間的距離,若空白則代表兩節點不相鄰。
G
a
b
c
d
e
f
g
h
j
a
1
6
5
b
1
6
c
6
6
7
3
d
5
2 10
e
7
12
f
3
2
8
g
10
7
3
h
12 8
7
8
j
3
8
圖G
請說明若以Kruskal’s 演算法建立最小生成樹(minimum spanning tree)
的過程中,依序被加入生成樹的邊。(5 分)
請說明若以Prim’s 演算法建立最小生成樹(minimum spanning tree)的
過程中,依序被加入生成樹的邊。(5 分)
請說明Dijkstra’s 演算法的用途,並說明該演算法應用上的限制。(10 分)
請說明將圖G 從f 節點開始執行Dijkstra’s 演算法的過程並顯示節點加
入的順序。(10 分)