110 年 國立臺灣大學資訊工程學系碩士班《資料結構與演算法》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題5 分

I. When CAN the worst case of Quicksort occur? ____

C1C_1: Quick Sort where the leftmost (or rightmost) element is always chosen as pivot.

C2C_2: The leftmost element is chosen as pivot and the array is already sorted in the SAME order.

C3C_3: The leftmost element is chosen as pivot and the array is already sorted in REVERSE order.

(A) C1C_1

(B) C2C_2

(C) C1C_1 and C2C_2

(D) C2C_2 and C3C_3

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

快速排序每一層要做一次 Θ(n)\Theta(n) 的分割。若每次選到的樞紐(pivot)都是目前子陣列的最小值或最大值,分割會極度不平衡(一邊 0 個、一邊 n−1n-1 個),遞迴式變成

T(n)=T(n−1)+Θ(n)=Θ(n2),T(n)=T(n-1)+\Theta(n)=\Theta(n^2),

這就是快速排序的最壞情況。

解題方法

題目問「最壞情況會在什麼情況下發生」,要找的是輸入資料與樞紐選法的具體組合:

  • C2C_2: 已排好的遞增陣列、選最左元素當樞紐。每次樞紐都是最小值,分割成 0 與 n−1n-1,必定是最壞情況。
  • C3C_3: 已排好的遞減陣列、選最左元素當樞紐。每次樞紐都是最大值,同樣必定是最壞情況。
  • C1C_1: 只描述「總是選最左(或最右)元素當樞紐」這個策略,沒有說明輸入資料。這個策略本身並不會造成最壞情況——對大多數輸入,它的表現是平均的 Θ(nlog⁡n)\Theta(n\log n);
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 4 題共用同一段題幹

A typical dynamic programming example is the snake sequence. Given a grid of numbers, find the maximum length snake sequence and print it. A snake sequence is made up of adjacent numbers in the grid such that for each number, the number on its right or the number below it is +1+1 or −1-1 in value. For example, if you are at location (x,y)(x,y) in the grid, you can either move right, i.e. (x+1,y)(x+1,y), if that number is ±1\pm 1 or move down, i.e. (x,y+1)(x,y+1), if that number is ±1\pm 1. The length of a snake sequence is defined as the number of moves. Given the following grid (a matrix with MM rows and NN columns):

9652876573161117\begin{matrix} 9 & 6 & 5 & 2 \\ 8 & 7 & 6 & 5 \\ 7 & 3 & 1 & 6 \\ 1 & 1 & 1 & 7 \end{matrix}

第 2-(a) 題5 分

What is the maximum LENGTH of a snake sequence? ____

(A) 6

(B) 7

(C) 5

(D) 4

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每個格子視為一個節點,只能向右或向下移動;相鄰格子的數值差必須為 11。這形成一個有向無環圖,因為移動只會往右或往下,不會回到先前的格子。

令 dp[i][j]dp[i][j] 表示「從第 ii 列、第 jj 欄出發,最多能走過幾個格子」。若右方或下方格子的數值與目前格子相差 11,就能延伸路徑:

dp[i][j]=1+max⁡{dp[i+1][j], dp[i][j+1]}dp[i][j] = 1+\max\{dp[i+1][j],\,dp[i][j+1]\}

其中只取符合移動方向且數值差為 11 的相鄰格子;若沒有符合條件的格子,則 dp[i][j]=1dp[i][j]=1。題目所問的移動次數,等於路徑格數減 11。

解題方法

由右下角往左上角計算各格的 dpdp 值。因為每格只依賴右方與下方的結果,這個順序能確保計算時所需的值已經求出。

例如,第二列第四欄的數值為 55,下方是 66,相差 11;從該格可經過 5→6→75\to6\to7,共 33 個格子,因此 dp[2][4]=3dp[2][4]=3。接著,第二列第三欄的 66 可向右接到 55,所以 dp[2][3]=1+dp[2][4]=4dp[2][3]=1+dp[2][4]=4。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(b) 題5 分

Time complexity of the above solution is ____.

(A) O(M×N)O(M \times N)

(B) O(M2)O(M^2)

(C) O(N2)O(N^2)

(D) O(M)O(M)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查動態規劃的時間複雜度。蛇形序列只能向右或向下移動,因此每個格子只需根據左方與上方相鄰格子的結果,計算到達該格子的最長序列長度。

解題方法

令 dp[i][j]dp[i][j] 表示以第 ii 列、第 jj 欄為終點的最長蛇形序列「移動次數」。計算每個格子時,只需檢查上方與左方是否相鄰且數值相差 11:

dp[i][j]=max⁡({dp[i−1][j]+1,若上方格子與目前格子相差 1不納入,否則,{dp[i][j−1]+1,若左方格子與目前格子相差 1不納入,否則)dp[i][j] = \max\left( \begin{cases} dp[i-1][j]+1, & \text{若上方格子與目前格子相差 }1\\ \text{不納入}, & \text{否則} \end{cases}, \begin{cases} dp[i][j-1]+1, & \text{若左方格子與目前格子相差 }1\\ \text{不納入}, & \text{否則} \end{cases} \right)
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(c) 題5 分

The last number of the maximum-length snake sequence is ____.

(A) 9(0,0)9(0,0)

(B) 6(3,2)6(3,2)

(C) 7(3,3)7(3,3)

(D) 1(2,3)1(2,3)

(E) 7(0,2)7(0,2)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

蛇形序列只能向右或向下移動,且相鄰兩格的數值差必須為 11;序列長度計算的是移動次數。座標寫成 (x,y)(x,y):xx 是欄(向右增加)、yy 是列(向下增加)。

令 dp[y][x]dp[y][x] 表示「以 (x,y)(x,y) 為終點的蛇形序列,最多移動幾次」。只能從左邊或上方走過來:

dp[y][x]=max⁡{dp[y][x−1]+1,左邊數值與目前差 1dp[y−1][x]+1,上方數值與目前差 10,兩者都不符合dp[y][x]=\max\begin{cases} dp[y][x-1]+1, & \text{左邊數值與目前差 }1\\ dp[y-1][x]+1, & \text{上方數值與目前差 }1\\ 0, & \text{兩者都不符合} \end{cases}

解題方法

由左上往右下逐格計算:

y\xy\backslash x0123
00010
11234
22005
30006
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(d) 題5 分

The third number of the maximum-length snake sequence is ____.

(A) 7(1,1)7(1,1)

(B) 7(0,2)7(0,2)

(C) 3(1,2)3(1,2)

(D) 6(2,1)6(2,1)

(E) 8(0,1)8(0,1)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考動態規劃。每一步只能向右或向下移動,且相鄰數字的差必須為 11。令 D[y][x]D[y][x] 表示「以座標 (x,y)(x,y) 為終點的最長蛇序列有幾次移動」;座標中的 xx 是欄、yy 是列。

若左邊或上方的格子與目前數字相差 11,就能接在序列後面:

D[y][x]=1+max⁡{D[y][x−1],D[y−1][x]}D[y][x]=1+\max\{D[y][x-1],D[y-1][x]\}

只取符合相鄰差為 11 的前驅;若沒有符合條件的前驅,則令 D[y][x]=0D[y][x]=0。

解題方法

依序計算每格的最長序列移動次數,得到:

0010123420050006\begin{matrix} 0 & 0 & 1 & 0 \\ 1 & 2 & 3 & 4 \\ 2 & 0 & 0 & 5 \\ 0 & 0 & 0 & 6 \end{matrix}

右下角的 77 對應 D[3][3]=6D[3][3]=6,所以最長序列有 66 次移動、共 77 個數字。回溯其前驅,可得:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3 題5 分

III. For questions with sequences, we constantly split the problem into a number of sub-problems that are smaller instances of the same problem, and we try to solve the smaller problems recursively. We call this type of algorithm ____.

(A) Dynamic programming

(B) Divide and conquer

(C) Greedy algorithms

(D) Quicksort

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考的是「分治法」(divide and conquer)的定義:把原問題拆成數個規模較小、性質相同的子問題,遞迴求解子問題,再合併結果以得到原問題的解。

分治法常見的三個步驟是:

  1. 分解:將問題拆成較小的子問題。
  2. 征服:遞迴求解各子問題;子問題夠小時直接處理。
  3. 合併:將子問題的解組合成原問題的解。

解題方法

題幹指出,對序列問題反覆拆成數個較小的同類問題,並以遞迴方式求解。這正符合分治法的「分解」與「征服」特徵,因此選擇 (B) Divide and conquer。

選項分析

  • (A) Dynamic programming(動態規劃):動態規劃也會處理子問題,但重點是利用子問題的重疊性,儲存並重用已算出的結果,以避免重複計算。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

There is a large enough array AA with indices pp and qq, which are initialized by 00. Functions f(x)f(x) and g()g() are defined as follows. Array AA and indices pp and qq can only be accessed in functions f(x)f(x) and g()g().

f(x):p←p+1A[p]←xg():x←A[p]p←p−1return x\begin{aligned} f(x):\quad &p \leftarrow p+1 \\ &A[p] \leftarrow x \\ g():\quad &x \leftarrow A[p] \\ &p \leftarrow p-1 \\ &\text{return }x \end{aligned}

第 4-(a) 題5 分

(a) Which data structure is operated by those functions? ____

(A) Queue

(B) Stack

(C) Hash

(D) Heap

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

堆疊(Stack)遵循「後進先出」(LIFO, Last In, First Out):最後放入的元素會最先取出。放入元素稱為 push,取出最上方元素稱為 pop。

解題方法

函式 f(x)f(x) 先令 pp 加 11,再將 xx 存入 A[p]A[p],也就是把元素放到目前堆疊頂端。函式 g()g() 讀取 A[p]A[p],再令 pp 減 11,因此取出的是最後放入的元素,且堆疊頂端往下移一格。

例如,依序呼叫 f(a)f(a)、f(b)f(b),接著呼叫 g()g(),會先取出 bb,符合後進先出的規則。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 4-(b) 題5 分

(b) If functions f(x)f(x) and g()g() are changed as follows:

f(x):A[q]←xq←q+1g():x←A[p]p←p+1return x\begin{aligned} f(x):\quad &A[q] \leftarrow x \\ &q \leftarrow q+1 \\ g():\quad &x \leftarrow A[p] \\ &p \leftarrow p+1 \\ &\text{return }x \end{aligned}

Which data structure is operated by those functions? ____

(A) Queue

(B) Stack

(C) Hash

(D) Heap

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

佇列(Queue)遵守「先進先出」(FIFO):先放入的元素會先被取出。常見實作方式是用兩個索引分別記錄佇列的前端與尾端:

  • pp 指向下一個要取出的元素。
  • qq 指向下一個要放入元素的位置。

解題方法

初始時 p=q=0p=q=0。執行 f(x)f(x) 時,先把 xx 放到 A[q]A[q],再將 qq 加一;執行 g()g() 時,先取出 A[p]A[p],再將 pp 加一。因此,元素依照放入順序依序取出。

例如依序執行 f(a)f(a)、f(b)f(b),陣列會依序存入 A[0]=aA[0]=a、A[1]=bA[1]=b,且 q=2q=2。接著呼叫兩次 g()g(),會依序讀取 A[0]A[0] 和 A[1]A[1],先取出 aa,再取出 bb,符合 FIFO。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

There is a binary tree stored in an array as:

T[]={+, a, ∗, null, null, −, d, null, null, null, null, b, c},T[]=\{+,\ a,\ *,\ \text{null},\ \text{null},\ -,\ d,\ \text{null},\ \text{null},\ \text{null},\ \text{null},\ b,\ c\},

in which T[i]T[i] is the parent of T[2i+1]T[2i+1] and T[2i+2]T[2i+2], where ii is an index and null means there is no element in the slot.

第 5-(a) 題5 分

(a) What is its postorder traversal result? ____

(A) +a∗−dbc+a*-dbc

(B) a+b−c∗da+b-c*d

(C) abc−d∗+abc-d*+

(D) +a∗−bcd+a*-bcd

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

二元樹的後序走訪(postorder)順序是「左子樹、右子樹、根節點」。以陣列表示時,索引為 ii 的節點,其左、右子節點分別位於 2i+12i+1 與 2i+22i+2;null 表示該位置沒有節點,不列入走訪結果。

解題方法

依索引關係還原樹:

  • 索引 00 的根節點是 ++,左子節點為索引 11 的 aa,右子節點為索引 22 的 ∗*。
  • aa 的兩個子節點位於索引 33、44,皆為 null。
  • ∗* 的左子節點是索引 55 的 −-,右子節點是索引 66 的 dd。
  • −- 的左、右子節點分別是索引 1111 的 bb 與索引 1212 的 cc。

依後序順序走訪:

  1. 左子樹只有 aa,先輸出 aa。
  2. 右子樹以 ∗* 為根:先走訪 −-,依序輸出其左子節點 bb、右子節點 cc,最後輸出 −-,得到 bc-;再輸出 dd,最後輸出 ∗*,得到 bc-d*。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 5-(b) 題5 分

(b) What is its BFS traversal result? ____

(A) +a∗−dbc+a*-dbc

(B) a+b−c∗da+b-c*d

(C) abc−d∗+abc-d*+

(D) +a∗−bcd+a*-bcd

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

BFS(廣度優先搜尋)依序拜訪二元樹的節點:先拜訪根節點,再由上而下、每層由左至右拜訪。陣列表示中,索引 ii 的節點,其左、右子節點分別位於 2i+12i+1 與 2i+22i+2;值為 null 的位置代表沒有節點,不列入遍歷結果。

解題方法

依陣列索引由小到大檢視非 null 節點,逐層列出:

層次節點
第 0 層T[0]=+T[0]=+
第 1 層T[1]=a, T[2]=∗T[1]=a,\ T[2]=*
第 2 層T[5]=−, T[6]=dT[5]=-,\ T[6]=d
第 3 層T[11]=b, T[12]=cT[11]=b,\ T[12]=c

例如,T[2]=∗T[2]=* 的子節點位置是 T[5]T[5] 與 T[6]T[6];T[5]=−T[5]=- 的子節點位置是 T[11]T[11] 與 T[12]T[12]。其餘相關位置為 null,不輸出。

依照每層由左至右的順序串接,BFS 結果為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

There are 10 hexadecimal data, 5353, 3B3B, 6666, 4343, 6060, 5B5B, 7C7C, 1414, 3030, 3737, inserted in the given order into an empty hash table. The table is implemented using a circular array of 10 slots, and one slot can only have one item. The hash function for the table is h(k)=k mod 9h(k)=k \bmod 9.

第 6-(a) 題5 分

(a) Which data is the first one that occurs a collision? ____

(A) 4343

(B) 5B5B

(C) 1414

(D) 3737

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

雜湊函數 h(k)=k mod 9h(k)=k\bmod 9 會先把資料視為十六進位數,轉成十進位後取除以 99 的餘數。餘數就是該資料的初始雜湊位置。若新資料的初始位置已被先前資料占用,就發生碰撞。

解題方法

依插入順序計算各資料的雜湊位置:

十六進位資料十進位值雜湊位置
5353838383 mod 9=283\bmod 9=2
3B3B595959 mod 9=559\bmod 9=5
6666102102102 mod 9=3102\bmod 9=3
4343676767 mod 9=467\bmod 9=4
6060969696 mod 9=696\bmod 9=6
5B5B919191 mod 9=191\bmod 9=1
7C7C124124124 mod 9=7124\bmod 9=7
1414202020 mod 9=220\bmod 9=2
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 6-(b) 題5 分

(b) If the hash table uses linear probing to resolve collisions and has no resizing mechanism, which position in the array is 3737 inserted? ____

(A) 3

(B) 8

(C) 4

(D) 0

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

線性探測(linear probing)遇到碰撞時,依序檢查下一個位置;到陣列尾端後回到位置 00。本題雜湊值為 h(k)=k mod 9h(k)=k\bmod 9,但陣列有 1010 個位置,索引為 00 至 99;線性探測時則依陣列長度 1010 循環。

解題方法

將各筆資料依序插入。十六進位數先換算成十進位,再計算其對 99 的餘數:

資料十進位值雜湊位置插入位置
531653_{16}8383 mod 9=283\bmod 9=22
3B163B_{16}5959 mod 9=559\bmod 9=55
661666_{16}102102 mod 9=3102\bmod 9=33
431643_{16}6767 mod 9=467\bmod 9=44
601660_{16}9696 mod 9=696\bmod 9=66
5B165B_{16}9191 mod 9=191\bmod 9=11
7C167C_{16}124124 mod 9=7124\bmod 9=77
141614_{16}2020 mod 9=220\bmod 9=28
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 7 題5 分

VII. There is a linked list with nn elements, which are x1,x2,…,xnx_1,x_2,\ldots,x_n. Let f(n)f(n) be the time complexity of inserting a new element xn+1x_{n+1} to the tail of the list, and g(n)g(n) be that of deleting the last element xnx_n. If there is only one pointer pointed to the head of the list, we know access to the list is time-consuming, and functions f(n)f(n) and g(n)g(n) are denoted as f1(n)f_1(n) and g1(n)g_1(n) in this case. To improve it, we may also add another pointer pointed to the tail of it, so the functions f(n)f(n) and g(n)g(n) become f2(n)f_2(n) and g2(n)g_2(n). Which of the following option is false if nn becomes large? ____

(A) f1(n)g1(n)=1\frac{f_1(n)}{g_1(n)}=1

(B) f2(n)g2(n)=n\frac{f_2(n)}{g_2(n)}=n

(C) f1(n)f2(n)=n\frac{f_1(n)}{f_2(n)}=n

(D) g1(n)g2(n)=1\frac{g_1(n)}{g_2(n)}=1

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查單向鏈結串列在只有頭指標、以及同時持有頭尾指標時,從尾端插入與刪除的時間複雜度。

以下依一般題意,假設串列為單向鏈結串列。即使有尾指標,每個節點仍只連向下一個節點;尾指標無法直接找到尾節點的前一個節點。

解題方法

只有頭指標時,若要在尾端插入,必須從頭節點沿著串列走到最後一個節點,花費 Θ(n)\Theta(n)。刪除最後一個節點也要找到倒數第二個節點,花費同樣是 Θ(n)\Theta(n)。因此,兩者的成本比值為 11。

同時有頭指標與尾指標時,插入尾端可以直接使用尾指標,花費 Θ(1)\Theta(1);刪除尾端仍須從頭開始尋找倒數第二個節點,花費 Θ(n)\Theta(n)。因此:

f2(n)g2(n)=Θ(1)Θ(n)=Θ(1n)\frac{f_2(n)}{g_2(n)} = \frac{\Theta(1)}{\Theta(n)} = \Theta\left(\frac{1}{n}\right)

題目選項以大 nn 下的成本比例表示,故此比值不會是 nn。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

Given the following graph, try to find its minimum spanning tree.

🖼️【此處有附圖,請對照原卷】

第 8-(a) 題5 分

(a) What is the sixth edge that Kruskal’s algorithm includes (the numbering of the inclusion order starts from 1, not 0)? ____

(A) 6

(B) 7

(C) 8

(D) 9

🖼️ 本題附圖:
第 8-(a) 題附圖
圖看不清楚?展開原卷第 3 頁核對
原卷第 3 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Kruskal 演算法依邊的權重由小到大檢查;只有在加入該邊不會形成環時,才將它納入最小生成樹。題目問的是「第六條被納入的邊」,因此被檢查但因成環而略過的邊不計入納入順序。

解題方法

圖中較小的邊依序為:FB=1FB=1、HC=2HC=2、BC=3BC=3、IH=4IH=4、IF=5IF=5、AB=6AB=6、AE=7AE=7、EC=8EC=8、DE=9DE=9。

依 Kruskal 演算法逐一檢查:

權重邊處理結果納入順序
1FBFB納入第 1 條
2HCHC納入第 2 條
3BCBC納入,連接兩個不同連通分量第 3 條
4IHIH納入第 4 條
5IFIF略過;
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 8-(b) 題5 分

(b) What is the sixth vertex that Prim’s algorithm includes if starting from vertex AA (the numbering of the inclusion order starts from 1, not 0)? ____

(A) CC

(B) EE

(C) HH

(D) II

🖼️ 本題附圖:
第 8-(b) 題附圖
圖看不清楚?展開原卷第 3 頁核對
原卷第 3 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Prim 演算法從指定起點開始,逐步加入一個尚未納入的頂點;每一步都選擇一條連接「已納入頂點」與「未納入頂點」且權重最小的邊。題目問的是加入頂點的順序,起點 AA 算第 1 個。

解題方法

圖中與前幾步選擇相關的邊為:AA 到 B、E、D、CB、E、D、C 的權重分別是 6、7、12、136、7、12、13;BB 到 F、CF、C 的權重是 1、31、3;FF 到 II 的權重是 55;CC 到 HH 的權重是 22;HH 到 II 的權重是 44。

從 AA 開始,逐步比較連接已納入頂點與未納入頂點的邊:

  1. 第 1 個:起點 AA。
  2. 第 2 個:從 AA 出發,最小邊是 A ⁣− ⁣BA\!-\!B,權重 66,加入 BB。
  3. 第 3 個:目前候選邊中,B ⁣− ⁣FB\!-\!F 的權重 11 最小,加入 FF。
  4. 第 4 個:目前最小候選邊是 B ⁣− ⁣CB\!-\!C,權重 33,加入 CC。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9 題5 分

IX. What is the value of the maximum flow for the following stst-flow network? ____

🖼️【此處有附圖,請對照原卷】

(A) 16

(B) 17

(C) 18

(D) 19

🖼️ 本題附圖:
第 9 題附圖
圖看不清楚?展開原卷第 3 頁核對
原卷第 3 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考有向網路的最大流。每條邊的流量不得超過容量,且除源點 ss、匯點 tt 外,每個節點都須滿足流入量等於流出量。依最大流最小割定理,最大流值等於最小割的容量。

解題方法

圖中的邊與容量為:s→As\to A(10)、s→Cs\to C(10)、A→CA\to C(2)、A→BA\to B(4)、A→DA\to D(8)、C→DC\to D(9)、D→BD\to B(6)、D→tD\to t(10)、B→tB\to t(10)。

先考慮割集左側 {s,C}\{s,C\},右側為其餘節點。從左側流向右側的邊只有 s→As\to A 和 C→DC\to D,因此割容量為

10+9=1910+9=19

所以最大流不可能超過 19。

接著列出一組總流量為 19 的可行流:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 10 題5 分

X. The Knuth-Morris-Pratt (KMP) algorithm is a string-matching algorithm. Its core is the prefix function. Given a pattern P[1..m]P[1..m], the prefix function for the pattern PP is a function π:{1,2,…,m}→{0,1,…,m−1}\pi:\{1,2,\ldots,m\}\to\{0,1,\ldots,m-1\}. What is π[7]\pi[7] for the following pattern PP? ____

i12345678910P[i]ababababcaπ[i]\begin{array}{c|cccccccccc} i & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 \\ \hline P[i] & a & b & a & b & a & b & a & b & c & a \\ \pi[i] & & & & & & & & & & \end{array}

(A) 4

(B) 5

(C) 6

(D) 7

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

KMP 的前綴函數 π[i]\pi[i] 表示子字串 P[1..i]P[1..i] 的「最長真前綴」,同時也是它的「後綴」的長度。真前綴不能等於整個子字串,因此 π[i]≤i−1\pi[i]\le i-1。

解題方法

題目要計算 π[7]\pi[7],先取出前 7 個字元:

P[1..7]=abababaP[1..7]=\texttt{abababa}

依序檢查長度為 6 到 1 的真前綴與後綴,找出相同的最大長度:

長度真前綴後綴是否相同
6abababbababa否
5ababaababa是
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 11 題5 分

XI. Many string-matching algorithms build finite automata. Below is a partially-completed state transition function for a string ss of length 10 over the alphabet {A,B,C}\{A,B,C\}. It is possible to reconstruct ss from the partial table. How many A’s does the string ss have? ____

0123456789A452B0073C00010\begin{array}{c|cccccccccc} & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\ \hline A & & & & 4 & 5 & & 2 & & & \\ B & & & & 0 & 0 & & 7 & & & 3 \\ C & & & & 0 & 0 & & 0 & & & 10 \end{array}

(A) 4

(B) 5

(C) 6

(D) 7

登入後即可作答並保存紀錄。

這一題的完整詳解

讀表(依原卷)

0123456789
A452
B0073
C00010

核心觀念

字串比對自動機中,狀態 qq 表示「已經比對成功 ss 的前 qq 個字元」。轉移函數

δ(q,a)=最大的 k,使 s[1..k] 是 s[1..q] a 的後綴.\delta(q,a)=\text{最大的 }k\text{,使 }s[1..k]\text{ 是 }s[1..q]\,a\text{ 的後綴}.

兩個重要推論:

  1. 前進的轉移:δ(q,a)=q+1\delta(q,a)=q+1 代表 a=s[q+1]a=s[q+1]。
  2. 退回的轉移:δ(q,a)=k≤q\delta(q,a)=k\le q 代表 s[1..k]s[1..k] 是 s[1..q]as[1..q]a 的後綴,可以推出字元之間的相等關係。

解題方法

設 s=s1s2⋯s10s=s_1s_2\cdots s_{10}。

  1. 前進的轉移直接給出字元:
    • δ(3,A)=4⇒s4=A\delta(3,A)=4\Rightarrow s_4=A
    • δ(4,A)=5⇒s5=A\delta(4,A)=5\Rightarrow s_5=A
    • δ(6,B)=7⇒s7=B\delta(6,B)=7\Rightarrow s_7=B
    • δ(9,C)=10⇒s10=C\delta(9,C)=10\Rightarrow s_{10}=C
  2. δ(6,A)=2\delta(6,A)=2:s1s2s_1s_2 是 s1⋯s6As_1\cdots s_6A 的後綴,所以 s2=As_2=A、s1=s6s_1=s_6。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 1 題共用同一段題幹

What can you infer from the facts that PROBLEMA is NP-complete and PROBLEMA linear-time reduces to PROBLEMB?

C1C_1: If there exists an O(N3)O(N^3) algorithm for PROBLEMB, then P=NPP=NP.

C2C_2: If there does not exist an O(N3)O(N^3) algorithm for PROBLEMB, then P≠NPP\ne NP.

C3C_3: If there exists an O(N3)O(N^3) algorithm for PROBLEMB, then there exists an O(N3)O(N^3) algorithm for PROBLEMA.

C4C_4: If there exists an O(N3)O(N^3) algorithm for PROBLEMA, then there exists an O(N3)O(N^3) algorithm for PROBLEMB.

第 12 題5 分


(A) C1C_1 and C3C_3

(B) C1C_1 and C4C_4

(C) C2C_2 and C3C_3

(D) C2C_2 and C4C_4

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

線性時間歸約 A≤LBA \leq_L B 表示可以在 O(n)O(n) 時間內,將 AA 的任一輸入轉換成 BB 的輸入,且轉換前後的答案一致。因為轉換花費線性時間,轉換後輸入的長度至多為原輸入長度的線性倍數。

題目給定 PROBLEMA 是 NP-complete,且 PROBLEMA 線性時間歸約至 PROBLEMB。若 PROBLEMB 有多項式時間演算法,就能透過歸約得到 PROBLEMA 的多項式時間演算法;而 NP-complete 問題若能在多項式時間內求解,便有 P=NPP=NP。

解題方法

假設 PROBLEMB 有 O(N3)O(N^3) 演算法。對長度為 nn 的 PROBLEMA 輸入,先花 O(n)O(n) 時間歸約成 PROBLEMB 輸入。新輸入長度至多為 O(n)O(n),因此求解 PROBLEMB 花費:

O((O(n))3)=O(n3)O((O(n))^3)=O(n^3)

加上歸約時間後,整體仍是 O(n3)O(n^3)。所以 PROBLEMA 也有 O(N3)O(N^3) 演算法。由於 PROBLEMA 是 NP-complete,這代表 P=NPP=NP。

因此 C1C_1 與 C3C_3 成立,正確選項為 (A)。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 1 題共用同一段題幹

The VERTEX-COVER problem is to find a vertex cover of size kk in a given graph GG. In the SUBSET-SUM problem, given a finite set S⊂NS\subset\mathbb{N} and a target t∈Nt\in\mathbb{N}, we ask whether there is a subset S′⊆SS'\subseteq S whose elements sum to tt. The VERTEX-COVER problem is polynomial-time reducible to the SUBSET-SUM problem. Given an instance ⟨G,k⟩\langle G,k\rangle of the VERTEX-COVER problem, one can construct a corresponding instance ⟨S,t⟩\langle S,t\rangle of the SUBSET-SUM problem. Given the following graph GG and k=3k=3, {v1,v3,v4}\{v_1,v_3,v_4\} is the vertex cover of size k=3k=3. The corresponding set S={1,4,16,64,256,1040,1041,1093,1284,1344}S=\{1,4,16,64,256,1040,1041,1093,1284,1344\} is constructed as the following table. What is the target tt?

🖼️【此處有附圖,請對照原卷】

e4e3e2e1e0decimalx0001111041x1100101284x2110001344x3001001040x4010111093y0000011y1000104y20010016y30100064y410000256\begin{array}{c|ccccc|r} & e_4 & e_3 & e_2 & e_1 & e_0 & \text{decimal} \\ \hline x_0 & 0 & 0 & 1 & 1 & 1 & 1041 \\ x_1 & 1 & 0 & 0 & 1 & 0 & 1284 \\ x_2 & 1 & 1 & 0 & 0 & 0 & 1344 \\ x_3 & 0 & 0 & 1 & 0 & 0 & 1040 \\ x_4 & 0 & 1 & 0 & 1 & 1 & 1093 \\ \hline y_0 & 0 & 0 & 0 & 0 & 1 & 1 \\ y_1 & 0 & 0 & 0 & 1 & 0 & 4 \\ y_2 & 0 & 0 & 1 & 0 & 0 & 16 \\ y_3 & 0 & 1 & 0 & 0 & 0 & 64 \\ y_4 & 1 & 0 & 0 & 0 & 0 & 256 \end{array}

第 13 題5 分


(A) 2389

(B) 3417

(C) 3754

(D) 3758

🖼️ 本題附圖:
第 13 題附圖
圖看不清楚?展開原卷第 4 頁核對
原卷第 4 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是以子集合和表示頂點覆蓋的多項式時間歸約。每個頂點對應一個數 xix_i,其最高位記錄是否選入頂點覆蓋,其餘位記錄該頂點連接哪些邊;每條邊另有一個數 yiy_i,可補足該邊的位數。

解題方法

原卷圖中,頂點列為 v0,…,v4v_0,\ldots,v_4,邊 e0,…,e4e_0,\ldots,e_4;題目指定的頂點覆蓋是 {v1,v3,v4}\{v_1,v_3,v_4\}。表格在 e4,…,e0e_4,\ldots,e_0 之前另有一個頂點選取位,各頂點列該位皆為 11。因此選取 x1,x3,x4x_1,x_3,x_4 後,最高位總和為 33,符合 k=3k=3。

從表中讀出這三個頂點數:

x1=1284,x3=1040,x4=1093x_1=1284,\qquad x_3=1040,\qquad x_4=1093

先相加:

1284+1040+1093=34171284+1040+1093=3417

依圖中邊位 e4,…,e0e_4,\ldots,e_0 的順序,三列相加後各位分別為 1,1,1,2,11,1,1,2,1。每條邊的目標位數設為 22:已有兩個端點被選到的邊,其位數已達 22;只被一個端點覆蓋的邊,則用對應的 yiy_i 補足。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題