給定一個環狀鏈結串列,節點資料結構宣告如下:
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 分)
(注意:不可將此陣列數值進行排序,請加註解說明程式碼作法。)
密文(Cipher text or Cypher text):明請到家玩天你我來,應用環狀串列
(circular linked list),請問明文(Plain text or Clear text)為何?(15 分)
請使用C 語言寫一副程式void FindMeanAverage(int A [], int n, int *
mean, int * average),對一個未排序的(unsorted)且長度為n 的陣列
A[0:n1],尋找陣列中的中位數與平均數,並分別存入mean 及average
運算複雜度。(17 分)請舉例說明此副程式最差情況(worst case)所
花費的運算複雜度。(8 分)(注意:請加註解說明程式碼作法。)
如下圖設背包限重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 分)