111 年 國立成功大學電機資訊學院碩士班─資訊聯招《程式設計》

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

第 1 題4 分

  1. [4%] The following C program converts a preorder expression to its postorder form. For example, "+AB++ABC" is converted to "AB+AB+C+" with the program. Please fill in the missing parts of the program in C language.
#include<stdio.h>
#include<stdlib.h>

#define MAX_INPUT 100000

typedef struct _Stack_node{
    char val;
    struct _Stack_node *prev;
} Stack_node;

typedef struct _Stack{
    Stack_node *top;
} Stack;

Stack *new_stack(){
    Stack *stk = malloc(sizeof(Stack));
    stk->top = NULL;
    return stk;
}

char Stack_pop(Stack *stk){
    char value = stk->top->val;
    Stack_node *tmp = stk->top;
    /** TODO (A) **/
    free(tmp);
    return value;
}

void Stack_push(Stack *stk, char value){
    Stack_node *new_node = malloc(sizeof(Stack_node));
    new_node->val = value;
    /** TODO (B) **/
    stk->top = new_node;
    return;
}

int Stack_is_empty(Stack *stk){
    return stk->top == NULL;
}

void pre_to_post(char *);
void post_to_pre(char *);

int main(){
    char input[MAX_INPUT];
    scanf("%s", input);
    pre_to_post(input);
    return 0;
}

void pre_to_post(char *input){
    Stack *stk = new_stack();
    for (int i = 0; input[i] != '\0'; ++i){
        switch(input[i]){
            case '+':
            case '-':
            case '*':
            case '/':
            case '^':
            case '%':
                Stack_push(stk, input[i]);
                break;
            default:
                printf("%c", input[i]);
                while (!Stack_is_empty(stk) && stk->top->val == 'A'){
                    char top = Stack_pop(stk);
                    printf("%c", Stack_pop(stk));
                }
                if (!Stack_is_empty(stk)) Stack_push(stk, 'A');
        }
    }
    printf("\n");
}

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

這一題的完整詳解

核心觀念

本題考查鏈結串列實作的堆疊。每個堆疊節點以 prev 指向下一個較底層的節點,stk->top 指向堆疊頂端。

  • 推入:新節點的 prev 指向原本的頂端,再讓 top 指向新節點。
  • 彈出:先保存頂端節點的值,再讓 top 移到下一個節點,最後釋放原頂端節點。

解題方法

在 Stack_pop 中,tmp 暫存目前的頂端節點,因此應將堆疊頂端移至 tmp->prev。在 Stack_push 中,新節點要連接到原本的頂端,才能保留堆疊中的節點鏈。

🔒

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

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

免費註冊

第 2 題2 分

  1. [2%] We rely on the tree data structure to represent a set of elements. Two elements are in the same set if they share the common root. Given two sets as follows, which is true if we union the two sets? Assume the union follows the height union rule.

🖼️【此處有附圖,請對照原卷】
The two sets (each tree written as node → its children):

  • Set 1: root 1; 1 → a, 2, 3; a → 4, 5.
  • Set 2: root 6; 6 → 7, b, 8; 7 → 9, 10; 9 → 12; 8 → 11.

(A) One tree with root 6; 6 → 1, 7, b, 8; 1 → a, 2, 3; a → 4, 5; 7 → 9, 10; 9 → 12; 8 → 11.
(B) Two trees: root 1 with 1 → 2, 3; and root 6 with 6 → 7, b, 8; 7 → 9, 10; 9 → 12; b → a; a → 4, 5; 8 → 11.
(C) One tree with root 1; 1 → a, 2, 3, 6; a → 4, 5; 6 → 7, b, 8; 7 → 9, 10; 9 → 12; 8 → 11.
(D) One tree with root 6; 6 → 1, a, 7, b, 8; 1 → 2, 3; a → 4, 5; 7 → 9, 10; 9 → 12; 8 → 11.
(E) None.

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 5 頁原卷第 6 頁原卷第 7 頁

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

這一題的完整詳解

核心觀念

本題考「依高度合併」(union by height):合併兩棵代表集合的樹時,將高度較矮的樹根接到高度較高的樹根底下,讓較高的樹保留為新樹根。

解題方法

高度以根到最深葉節點的邊數計算:

  • 集合 1:最長路徑為 1→a→41 \to a \to 4(或 1→a→51 \to a \to 5),高度為 22。
  • 集合 2:最長路徑為 6→7→9→126 \to 7 \to 9 \to 12,高度為 33。

集合 1 的高度較矮,因此把根 11 接到根 66 底下。兩棵樹原有的子節點關係維持不變,合併後根為 66,且 66 多了一個子節點 11。

選項分析

🔒

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

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

免費註冊

第 3 題5 分

  1. [2%, 3%] You are given the red-black tree in the following, where the dark colored nodes are red nodes. We insert the data item "62" into the tree. (i) Which of the followings is true? (ii) Please illustrate its 2-3-4 tree counterpart representation after 62 is inserted.

🖼️【此處有附圖,請對照原卷】
The given tree (R = red node, B = black node; each line lists a node's left and right children):

  • 50(B): left 10(B), right 80(R)
  • 80(R): left 65(B), right 90(B)
  • 65(B): left 60(R), right 70(R)

Options for (i):
(A) 65(B): left 50(R), right 80(R); 50(R): left 10(B), right 60(B); 60(B): right 62(R); 80(R): left 70(B), right 90(B)
(B) 50(B): left 10(B), right 80(R); 80(R): left 65(B), right 90(B); 65(B): left 60(R), right 70(R); 60(R): right 62(B)
(C) 50(B): left 10(B), right 65(R); 65(R): left 60(B), right 80(B); 60(B): right 62(R); 80(B): left 70(R), right 90(R)
(D) 50(B): left 60(R), right 70(R); 60(R): left 10(B), right 62(B); 70(R): left 65(B), right 80(B); 80(B): right 90(R)

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 7 頁原卷第 8 頁原卷第 9 頁

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

這一題的完整詳解

核心觀念

紅黑樹的紅色節點可與其黑色父節點合併,對應成 2-3-4 樹中的同一個多鍵節點。例如,黑節點 8080 的左子節點 6565 是紅色,便合併成包含 65,8065,80 的節點。

紅黑樹插入後須維持兩個重要條件:紅節點不能有紅色子節點;從根到各葉節點的黑節點數必須相同。插入的新節點先標成紅色,再依違反條件的情形重新著色或旋轉。

解題方法

插入 6262 時,依二元搜尋樹規則沿著 50→80→65→6050 \to 80 \to 65 \to 60 往下,因此 6262 成為 6060 的右子節點,並先標成紅色。

此時 6060 是紅色,與新插入的紅色節點相連;而 6060 的叔節點 7070 也是紅色。先將 6060、7070 改成黑色,並將其父節點 6565 改成紅色。接著 6565 與原本為紅色的 8080 相連,形成相對於 5050 的「右左」情形。對 8080 右旋、再對 5050 左旋,並調整顏色後,得到:

  • 根節點 6565 為黑色。
  • 6565 的左右子節點 5050、8080 為紅色。
  • 5050 的子節點為黑色的 1010、6060,且 6262 是 6060 的紅色右子節點。
  • 8080 的子節點為黑色的 7070、9090。

這與選項 A 相符。

2-3-4 樹表示

插入前,紅黑樹對應的 2-3-4 樹為:根節點包含 50,8050,80;其三個子節點分別包含 1010、60,65,7060,65,70、9090。

插入 6262 時,走到包含 60,65,7060,65,70 的滿節點。將該節點分裂,提升中間鍵 6565,再將 6262 放入左側分裂出的節點。插入後為:

🔒

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

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

免費註冊

第 4 題4 分

  1. [4%] You are given a Bloom filter with the three hash functions as follows, where modf(.)modf(.) returns the fractional part of a floating point number.
f1(x)=floor(modf(x∗0.31)∗16)f2(x)=floor(modf(x∗0.24)∗16)f3(x)=floor(modf(x∗0.13)∗16)\begin{aligned} f_1(x) &= floor(modf(x * 0.31) * 16) \\ f_2(x) &= floor(modf(x * 0.24) * 16) \\ f_3(x) &= floor(modf(x * 0.13) * 16) \end{aligned}

Bloom Filter

Index0123456789101112131415
Value0110010001001100

Which of the followings is (are) true?
(A) 8 is not in
(B) 8 may be in
(C) 8 is in
(D) 9 is not in
(E) 9 may be in
(F) 9 is in

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

這一題的完整詳解

核心觀念

Bloom filter(布隆過濾器)用多個雜湊函數,將元素映射到位元陣列中的位置。查詢元素時:

  • 只要其中一個對應位置是 00,就能確定元素不在集合中。
  • 若所有對應位置都是 11,只能判定元素可能在集合中;其他元素也可能把這些位置設為 11,因此不能據此確定元素真的存在。

本題位元陣列中值為 11 的位置是 1,2,5,9,12,131,2,5,9,12,13。

解題方法

對每個數字分別計算三個雜湊位置。modf(y)modf(y) 取 yy 的小數部分,再乘以 1616 並向下取整。

查詢 8:

f1(8)=⌊modf(8×0.31)×16⌋=⌊0.48×16⌋=7f2(8)=⌊modf(8×0.24)×16⌋=⌊0.92×16⌋=14f3(8)=⌊modf(8×0.13)×16⌋=⌊0.04×16⌋=0\begin{aligned} f_1(8) &= \lfloor modf(8 \times 0.31) \times 16 \rfloor = \lfloor 0.48 \times 16 \rfloor = 7 \\ f_2(8) &= \lfloor modf(8 \times 0.24) \times 16 \rfloor = \lfloor 0.92 \times 16 \rfloor = 14 \\ f_3(8) &= \lfloor modf(8 \times 0.13) \times 16 \rfloor = \lfloor 0.04 \times 16 \rfloor = 0 \end{aligned}

位置 77、1414、00 的位元都是 00。只要有一個位置為 00,就能確定 88 不在集合中。

查詢 9:

🔒

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

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

免費註冊

第 5 題2 分

  1. [2%] A B-tree is shown in the following. We remove the data items 70, 10, 60 and 95 in order over the B-tree. What is the resultant of B-tree after the deletions?

🖼️【此處有附圖,請對照原卷】
The B-tree: root [50, 80] with three children [10, 20], [60, 70] and [90, 95]; each of the three children has three empty (external) child pointers.

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 9 頁原卷第 10 頁

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

這一題的完整詳解

核心觀念

本題考 B-tree 刪除時的借鍵與合併。依圖中的節點結構,每個非根節點至少有 1 個鍵;刪除後若節點變成空節點,就發生下溢。此時若相鄰兄弟有多餘的鍵,便透過父節點的分隔鍵借鍵;若兄弟也只有最少鍵數,則與兄弟及父節點分隔鍵合併。

解題方法

依序刪除,每一步都維持鍵值排序與 B-tree 的最少鍵數限制。

初始樹為:

             [50, 80]
          /      |       \
     [10, 20] [60, 70] [90, 95]
  1. 刪除 70:中間葉節點由 [60, 70] 變成 [60],仍有 1 個鍵,不需調整。
             [50, 80]
          /      |       \
     [10, 20]   [60]   [90, 95]
  1. 刪除 10:左側葉節點由 [10, 20] 變成 [20],仍符合最少鍵數。
             [50, 80]
          /      |       \
       [20]     [60]   [90, 95]
  1. 刪除 60:中間葉節點變空,發生下溢。右兄弟 [90, 95] 有多餘的鍵,因此借鍵:父節點的分隔鍵 80 下移到中間葉節點,右兄弟最小鍵 90 上移成父節點分隔鍵。
🔒

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

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

免費註冊

第 6 題5 分

  1. [2%, 3%] You are given a Patricia as follows. We insert 1001, 1100, 0000 and 0001 in order into the Patricia. (i) Please show the resultant Patricia after the four data items are inserted. (ii) Please also depict its compressed binary trie counterpart.

🖼️【此處有附圖,請對照原卷】
The given Patricia: the header node holds 1000 with bit number 0, and its child pointer leads to the node 0010 with bit number 1; node 0010's left pointer points to itself and its right pointer points back to the header node 1000.

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 10 頁

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

這一題的完整詳解

核心觀念

Patricia 是路徑壓縮的二元搜尋樹:節點記錄分辨鍵值所需的位元位置,跳過共同前綴;左右指標分別代表該位元為 00 或 11。指標可能指回自身或先前節點,這是 Patricia 的線索式指標,不代表新增鍵值。

以下由左至右將四個位元的位置編為 11 到 44;標頭節點的位元編號為 00。原圖已有鍵值 10001000 與 00100010。

解題方法

每次插入時,先沿 Patricia 指標搜尋,再比較新鍵值與搜尋到的既有鍵值,找出由左至右第一個不同的位元。在搜尋路徑上,將新節點插入適當位置:新鍵值在該位元為 00 或 11 的指標指向自身,另一側指向原有節點或子樹。

插入鍵值與搜尋到的鍵值比較新節點位元新增後的連結
10011001與 10001000 首次在第 44 位不同44第 44 位為 11,右指向自身;左指向標頭 10001000
11001100與 10001000 首次在第 22 位不同22第 22 位為 11,右指向自身;左接原有的 10011001 子樹
00000000與 00100010 首次在第 33 位不同33第 33 位為 00,左指向自身;右指向 00100010
00010001與 00000000 首次在第 44 位不同44第 44 位為 11,右指向自身;左指向 00000000

因此,完成插入後的 Patricia 指標如下。L、R 分別表示左、右指標:

節點(鍵值,位元編號)LR
標頭(1000,01000, 0)標頭00100010
0010,10010, 10000000011001100
0000,30000, 30001000100100010
0001,40001, 40000000000010001
🔒

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

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

免費註冊

第 7 題2 分

  1. [2%] Consider the graph as follows. The DFS traversal is performed, starting from node 1. What are the potential sequences for the traversal?

🖼️【此處有附圖,請對照原卷】
The undirected graph has nodes 1–9 and edges (1,3), (1,7), (1,8), (2,4), (2,5), (2,8), (2,9), (3,5), (3,6), (4,6), (7,9).

(A) 1 7 9 2 4 6 3 5 8
(B) 1 3 6 4 2 5 9 7 8
(C) 1 7 8 3 5 6 4 2 9
(D) 1 8 2 4 6 3 5 9 7
(E) 1 2 5 6 4 2 9 7 8

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 10 頁原卷第 11 頁

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

這一題的完整詳解

核心觀念

深度優先搜尋(DFS)從起點開始,沿著尚未拜訪的相鄰節點深入;只有當目前節點沒有尚未拜訪的相鄰節點時,才會回溯。題目未指定相鄰節點的拜訪順序,因此只要能依某種鄰點順序完成 DFS,該序列就是可能的遍歷順序。

解題方法

逐一檢查選項:每個新拜訪的節點都必須與目前 DFS 路徑上的節點相鄰;而某節點的 DFS 子樹尚未完成前,不可先跳去另一個分支。以下以題目圖中的無向邊為準。

選項分析

  • **(A) 正確。**可依序沿著 1→7→9→2→4→6→3→51\to7\to9\to2\to4\to6\to3\to5 深入。節點 55 的鄰點都已拜訪後回溯至 22,再拜訪尚未拜訪的 88。因此序列 1,7,9,2,4,6,3,5,81,7,9,2,4,6,3,5,8 符合 DFS。
  • **(B) 正確。**可沿著 1→3→6→4→2→51\to3\to6\to4\to2\to5 深入。從 55 回溯至 22 後,接著走 2→9→72\to9\to7;
🔒

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

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

免費註冊

第 8 題4 分

  1. [4%] The following is a hash table with linear probing. Assume the hash function is f(x)=x mod 17f(x) = x \bmod 17 for indexing the hash table. Data items 23, 52, 11, 1, 50, 99, 65, 20, 35, 34 and 82 are inserted into the hash table in order. Please fill the five blanks in the table.
keyvalue
034
1(A)?
2(B)?
3(C)?
4(D)?
5(E)?
623
7
8
9
10
1111
12
13
1499
1565
1650

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

這一題的完整詳解

核心觀念

線性探測(linear probing)是開放定址法的一種。新資料先依雜湊函數計算起始位置:

f(x)=x mod 17f(x)=x\bmod 17

若該位置已被占用,就依序檢查下一格,直到找到空格。索引走到 16 後會繞回 0,因此探測位置按模 17 循環。

解題方法

依題目給定的插入順序逐一放入資料;每次先算雜湊位置,若位置被占用,就向後探測。

插入值雜湊位置探測與放入位置
2323 mod 17=623\bmod17=66 空,放入 6
5252 mod 17=152\bmod17=11 空,放入 1
1111 mod 17=1111\bmod17=1111 空,放入 11
11 mod 17=11\bmod17=11 已有 52,探測到 2,放入 2
5050 mod 17=1650\bmod17=1616 空,放入 16
9999 mod 17=1499\bmod17=1414 空,放入 14
6565 mod 17=1465\bmod17=1414 已有 99,探測到 15,放入 15
2020 mod 17=320\bmod17=33 空,放入 3
3535 mod 17=135\bmod17=11、2、3 已占用,探測到 4,放入 4
🔒

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

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

免費註冊

第 9 題4 分

  1. [1%, 1%, 1%, 1%] The following C program implements Quick sort. Please fill the four missing parts of the program.
int Partition(int *arr, int front, int end){
    int pivot = arr[end];
    int i = front -1;
    for (int j = front; j < end; j++) {
        if (arr[j] < pivot) {
            _(A)_;
            swap(&arr[i], &arr[j]);
        }
    }
    i++;
    swap(&arr[i], &arr[end]);
    _(B)_;
}
void QuickSort(int *arr, int front, int end){
    if (front < end) {
        int pivot = Partition(arr, front, end);
        QuickSort(___C___);
        QuickSort(___D___);
    }
}

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

這一題的完整詳解

核心觀念

本題使用 Lomuto 分割法實作快速排序。每次分割時,選擇子陣列最後一個元素 arr[end] 作為樞紐值 pivot,並將小於樞紐值的元素移到左側,最後把樞紐值放到它排序後的位置。

掃描過程中,i 表示「目前已整理好的小於樞紐值區域」的最後一個索引;j 則逐一掃描 front 到 end - 1 的元素。遇到小於 pivot 的元素時,先將 i 右移,再交換 arr[i] 與 arr[j]。

解題方法

初始時 i = front - 1,代表左側尚無已確認小於樞紐值的元素。因此,遇到 arr[j] < pivot 時,空格 (A) 必須讓 i 前進一格:

i++;

掃描結束後,i + 1 是樞紐值應放置的位置。程式先執行 i++,再將 arr[i] 與 arr[end] 交換,因此此時 i 就是樞紐值的最終索引。空格 (B) 回傳這個索引:

return i;

快速排序取得樞紐索引 pivot 後,遞迴排序它左右兩側的子陣列。樞紐值已在正確位置,因此兩次遞迴都不包含 pivot:

  • 左側:front 到 pivot - 1
  • 右側:pivot + 1 到 end

所以 (C) 為 arr, front, pivot - 1,(D) 為 arr, pivot + 1, end。

完整程式碼

🔒

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

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

免費註冊
📄 以下 2 題共用同一段題幹
  1. [2%, 2%] The following data structure represents a binary tree, and it contains a function named "unknown".
struct node{
    int data;
    struct node *left, *right;
};

void unknown(struct node *p) {
    struct node *q;
    if (p -> left != NULL) unknown(p->left);
    if (p -> right != NULL) unknown(p->right);
    q=p->left;
    p->left=p->right;
    p->right=q;
}

第 10-(i) 題2 分

(i) Which of the order does the function perform?
(A) preorder
(B) inorder
(C) postorder
(D) level order
(E) None of the above.

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

這一題的完整詳解

核心觀念

二元樹的深度優先走訪順序,取決於「處理目前節點」相對於走訪左、右子樹的時機:

  • 前序:目前節點 → 左子樹 → 右子樹
  • 中序:左子樹 → 目前節點 → 右子樹
  • 後序:左子樹 → 右子樹 → 目前節點
  • 層序:依樹的層次由上而下,通常使用佇列。

解題方法

觀察 unknown 的執行順序:

  1. 若左子節點存在,先遞迴呼叫 unknown(p->left)。
  2. 若右子節點存在,再遞迴呼叫 unknown(p->right)。
  3. 兩個遞迴呼叫都完成後,才交換目前節點的左右子指標。

因此,每個節點都是在左、右子樹處理完後才執行交換;交換就是此函式對目前節點的處理動作。順序符合「左子樹 → 右子樹 → 目前節點」,所以是後序走訪。

選項分析

🔒

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

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

免費註冊

第 10-(ii) 題2 分

(ii) You are given the following input. Once the unknown(r) is performed, what is the value of the rightmost leaf node?
(A) 7
(B) 6
(C) 3
(D) 2
(E) None of the above

🖼️【此處有附圖,請對照原卷】
The input tree (r points to the root; each line lists a node's children):

  • 20: left 18, right 15
  • 18: left 13, right 12
  • 13: right 3
  • 12: left 6, right 7
  • 15: left 10, right 11
  • 10: left 2, right 4
  • 11: left 5, right 9
🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 13 頁

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

這一題的完整詳解

核心觀念

unknown 會先遞迴處理左右子樹,再交換目前節點的左右指標。對每個節點都執行這個操作後,整棵二元樹會左右鏡射。

交換操作為:

q = p->left;
p->left = p->right;
p->right = q;

因此,鏡射後的最右側路徑,對應到原樹最左側的路徑。

解題方法

沿原樹最左側往下追蹤:

  1. 從根節點 2020 往左到 1818。
  2. 從 1818 往左到 1313。
  3. 節點 1313 原本只有右子節點 33。鏡射後,33 成為 1313 的左子節點。

所以鏡射後最右側的葉節點是 33。

此函式會處理每個節點一次,時間複雜度為 O(n)O(n);遞迴堆疊空間複雜度為 O(h)O(h),其中 nn 是節點數,hh 是樹高。

選項分析

🔒

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

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

免費註冊
📄 以下 3 題共用同一段題幹
  1. [2%, 2%, 2%] A job priority queue is implemented using a Min-Heap in which a lower key value represents a higher priority. The jobs are entered and stored in the Min-Heap as shown in the following array QQ.
index012345678910111213141516
key value--681012241513201826

第 11-(i) 題2 分

(i) [Step 1] Next job is extracted from the job queue for execution. What is the value of Q[4]Q[4] in the remaining job queue?
(A) 15
(B) 18
(C) 20
(D) 26
(E) None of the above

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

這一題的完整詳解

核心觀念

Min-Heap(最小堆積)滿足:每個父節點的鍵值都小於或等於其子節點,因此根節點是目前優先權最高的工作。以 1 為起始索引時,索引 ii 的左右子節點分別是 2i2i 與 2i+12i+1。

取出根節點後,將最後一個元素移到根部,再向下調整:每次與鍵值較小的子節點交換,直到堆積性質恢復。

解題方法

原堆積的根節點為 Q[1]=6Q[1]=6,最後一個元素為 Q[10]=26Q[10]=26。取出 66 後,將 2626 移至根部,並依序向下調整:

  1. 在 2626 的子節點 88、1010 中,較小者是 88,交換。
  2. 此時 2626 位於索引 22,其子節點為 1212、2424;較小者是 1212,交換。
  3. 此時 2626 位於索引 44,其子節點為 2020、1818;較小者是 1818,交換。

調整後的堆積如下:

索引123456789
鍵值81210182415132026

因此 Q[4]=18Q[4]=18。

🔒

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

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

免費註冊

第 11-(ii) 題2 分

(ii) [Step 2] After Step (1) is executed, next job is extracted from the job queue for execution. What is the value of Q[5]Q[5] in the remaining job queue?
(A) 13
(B) 15
(C) 18
(D) 24
(E) None of the above

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

這一題的完整詳解

核心觀念

Min-Heap 的每個父節點鍵值都不大於子節點。以陣列表示、索引從 1 開始時,索引 ii 的左右子節點分別是 2i2i 與 2i+12i+1。

取出最小值時,先移除根節點,再將最後一個元素移到根部,沿著較小的子節點向下調整,直到 Min-Heap 性質恢復。

解題方法

題面未提供 Step (1) 的內容,因此以下依可見資料,假設 Step (1) 未改動題目所列的 Min-Heap,並直接執行一次取出最小值。

原始堆積有 1010 個元素,根節點 Q[1]=6Q[1]=6 是最小值。移除 66 後,把最後一個元素 2626 移到根部:

[26,8,10,12,24,15,13,20,18][26,8,10,12,24,15,13,20,18]

接著向下調整:

  1. 2626 的子節點是 88、1010,選較小的 88 交換。
  2. 2626 移到索引 22,子節點是 1212、2424,選較小的 1212 交換。
  3. 2626 移到索引 44,子節點是 2020、1818,選較小的 1818 交換。

調整後的堆積為:

🔒

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

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

免費註冊

第 11-(iii) 題2 分

(iii) [Step 3] After step (2) is executed, a new job with priority 11 is inserted in to the job queue. What is the value of Q[9]Q[9] in the remaining job queue?
(A) 18
(B) 20
(C) 24
(D) 26
(E) None of the above

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

這一題的完整詳解

核心觀念

這題考最小堆積(Min-Heap)的兩種操作:取出最小值,以及插入新值。以 1 起算的陣列表示堆積時,索引 ii 的父節點是 ⌊i/2⌋\lfloor i/2 \rfloor,左右子節點分別是 2i2i 與 2i+12i+1。每次操作都要維持「父節點鍵值不大於子節點」的堆積性質。

解題方法

題目中的 Q[0]Q[0] 不使用,初始堆積共有 10 個元素。

先執行 Step 1:取出最小值。 根節點 66 被取出,以最後一個元素 2626 補到根節點,再向下調整:

  • 2626 與子節點 8、108、10 比較,和較小的 88 交換。
  • 2626 與子節點 12、2412、24 比較,和較小的 1212 交換。
  • 2626 與子節點 20、1820、18 比較,和較小的 1818 交換。

此時堆積為:

[8, 12, 10, 18, 24, 15, 13, 20, 26][8,\ 12,\ 10,\ 18,\ 24,\ 15,\ 13,\ 20,\ 26]

再執行 Step 2:取出下一個最小值。 根節點 88 被取出,以最後一個元素 2626 補到根節點,並向下調整:

  • 2626 與子節點 12、1012、10 比較,和較小的 1010 交換。
  • 2626 與子節點 15、1315、13 比較,和較小的 1313 交換。

Step 2 後的堆積為:

[10, 12, 13, 18, 24, 15, 26, 20][10,\ 12,\ 13,\ 18,\ 24,\ 15,\ 26,\ 20]

執行 Step 3:插入鍵值 1111。 新值先放在下一個空位 Q[9]Q[9],再沿父節點方向上浮:

  • Q[9]=11Q[9]=11,父節點 Q[4]=18Q[4]=18,交換。
  • 此時 Q[4]=11Q[4]=11,父節點 Q[2]=12Q[2]=12,交換。
🔒

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

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

免費註冊
📄 以下 4 題共用同一段題幹
  1. [2%, 2%, 2%, 2%] Consider the two missing parts for the decrease key operation in F-heap.
DecreaseKey(H, x, k){
  if k > x.key return "error"
  x.key = k
  y = x.p     //note: x.p represents the parent node of x
  if y ≠ NIL and (1) {
    CUT(H, x, y)
    CASCADING-CUT(H, y)
  }
  if x.key < H.min.key
    H.min = x
}

CUT(H, x, y){
  x.p = (2)
  x.mark = FALSE
}

CASCADING-CUT(H, y){
  z = y.p
  if z ≠ NIL
    if y.mark == FALSE
      y.mark = TRUE
    else {
      CUT(H, y, z)
      CASCADING-CUT(H, z)
    }
}

第 12-(i) 題2 分

(i) Which of the following for (1) is true?
(A) x.key<y.keyx.key < y.key
(B) x.key>y.keyx.key > y.key
(C) x.key≥y.keyx.key \ge y.key
(D) x.key≤y.keyx.key \le y.key

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

這一題的完整詳解

核心觀念

F-heap 是最小堆,父節點與子節點須符合堆序性質:

x.key≥y.keyx.key \ge y.key

其中 yy 是 xx 的父節點。DecreaseKey 將 x.keyx.key 調小後,只有在 x.keyx.key 小於父節點的鍵值時,才會違反堆序性質,必須把 xx 從 yy 的子節點串列中切下。

解題方法

設原本父節點為 yy。調整鍵值後比較 x.keyx.key 與 y.keyy.key:

  • 若 x.key<y.keyx.key < y.key,堆序性質遭到破壞,執行 CUT,再對 yy 執行 CASCADING-CUT。
  • 若 x.key=y.keyx.key = y.key,仍符合 x.key≥y.keyx.key \ge y.key,不必切下。
  • 若 x.key>y.keyx.key > y.key,也仍符合堆序性質,不必切下。

因此,條件 (1) 應為:

x.key < y.key

選項分析

🔒

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

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

免費註冊

第 12-(ii) 題2 分

(ii) Which of the followings is true for (2)?
(A) NILNIL
(B) yy
(C) xx
(D) None of the above

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

這一題的完整詳解

核心觀念

Fibonacci heap 的 DecreaseKey 若使節點 xx 的鍵值小於父節點 yy 的鍵值,就必須將 xx 從 yy 的子節點中切下,放入根串列。切下後,xx 不再有父節點,因此應令 x.p=NILx.p=NIL。

此外,切下的節點成為根節點,標記必須重設為 FALSE,避免沿用它作為非根節點時的標記狀態。

解題方法

查看 CUT(H, x, y) 的用途:它將 xx 從父節點 yy 的子節點串列移除,並把 xx 加入 Fibonacci heap 的根串列。切下後,xx 已沒有父節點,所以:

x.p=NILx.p=NIL

因此,空格 (2) 應填 NIL。

選項分析

🔒

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

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

免費註冊

第 12-(iii) 題2 分

(iii) What is the amortized time complexity of function DecreaseKey?
(A) O(1)O(1)
(B) O(n)O(n)
(C) O(lg⁡n)O(\lg n)
(D) O(lg⁡n2)O(\lg n^2)

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

這一題的完整詳解

核心觀念

斐波那契堆(Fibonacci heap)的 DecreaseKey 會在新鍵值小於父節點鍵值時,將節點切下並移到根串列;若父節點已標記,則繼續向上連鎖切割。單次操作最壞可能切割多個節點,但用攤銷分析計算,時間複雜度為 O(1)O(1)。

常用勢能函數為

Φ(H)=t(H)+2m(H)\Phi(H)=t(H)+2m(H)

其中 t(H)t(H) 是根串列中的根數,m(H)m(H) 是標記節點數。勢能用來抵銷連鎖切割所需的實際成本。

解題方法

若觸發切割,令 cc 為連鎖切割的次數。實際操作成本為 O(c+1)O(c+1):包含最初切下節點,以及後續的 cc 次連鎖切割。

勢能變化方面:

  • 最初切下的節點與 cc 個連鎖切下的節點都成為根,根數增加 c+1c+1。
  • 每次連鎖切割都清除一個原本已標記節點的標記,標記數至少減少 cc;停止處若將一個未標記節點標記,標記數最多增加 11。

因此,勢能變化至多為

ΔΦ≤(c+1)+2(1−c)=3−c\Delta\Phi \le (c+1)+2(1-c)=3-c

攤銷成本等於實際成本加上勢能變化:

O(c+1)+(3−c)=O(1)O(c+1)+(3-c)=O(1)
🔒

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

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

免費註冊

第 12-(iv) 題2 分

(iv) What is the time complexity of inserting node into F-heap?
(A) O(1)O(1)
(B) O(n)O(n)
(C) O(lg⁡n)O(\lg n)
(D) O(lg⁡n2)O(\lg n^2)

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

這一題的完整詳解

核心觀念

F-heap(Fibonacci heap)將節點分成根串列與各棵子樹。插入新節點時,先建立一個獨立節點,再把它加入根串列;若新節點的鍵值小於目前的最小值,更新 H.min。

插入時不執行合併樹的整理工作;這類整理會延後到 Extract-Min 操作。因此,插入只需常數次指標操作,時間複雜度為 O(1)O(1)。

解題方法

設新節點為 xx,插入步驟如下:

  1. 將 xx 設為獨立根節點,令 x.p = NIL。
  2. 將 xx 加入根串列。
  3. 若堆為空,令 H.min = x;否則比較鍵值,必要時更新 H.min。

以上步驟不依賴堆中節點數 nn,所以插入的時間複雜度為 O(1)O(1);額外空間也是 O(1)O(1)。若計入新節點本身,整個堆的空間為 O(n)O(n)。

🔒

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

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

免費註冊

第 13 題10 分

  1. (10%) Give asymptotic tight bound (Θ\Theta) for T(n)T(n) where T(n)=2T(n4)+nlog⁡(n)T(n) = 2T\left(\frac{n}{4}\right) + \sqrt{n}\log(n). (Assume that T(n)T(n) is a constant for sufficiently small nn.)

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

這一題的完整詳解

核心觀念

這題考遞迴式的漸近緊界,可用 Master 定理或遞迴樹分析。對遞迴式

T(n)=aT(nb)+f(n)T(n)=aT\left(\frac{n}{b}\right)+f(n)

先比較 f(n)f(n) 與 nlog⁡ban^{\log_b a}。本題 a=2a=2、b=4b=4,因此

nlog⁡42=nn^{\log_4 2}=\sqrt n

而 f(n)=nlog⁡n=Θ(nlog⁡42log⁡n)f(n)=\sqrt n\log n=\Theta\left(n^{\log_4 2}\log n\right)。

解題方法

由 Master 定理第二種情形,若

f(n)=Θ(nlog⁡balog⁡kn)f(n)=\Theta\left(n^{\log_b a}\log^k n\right)

則

T(n)=Θ(nlog⁡balog⁡k+1n)T(n)=\Theta\left(n^{\log_b a}\log^{k+1}n\right)

本題 k=1k=1,所以

T(n)=Θ(nlog⁡2n)T(n)=\Theta\left(\sqrt n\log^2 n\right)
🔒

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

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

免費註冊

第 14 題10 分

  1. (10%) Given a sequence K=⟨k1,k2,k3,k4,k5⟩K = \langle k_1, k_2, k_3, k_4, k_5 \rangle of five distinct keys in sorted order (so that k1<k2<k3<k4<k5k_1 < k_2 < k_3 < k_4 < k_5) and six dummy keys d0,d1,d2,d3,d4,d5d_0, d_1, d_2, d_3, d_4, d_5 representing values not in KK, we have a probability pip_i for kik_i and a probability qiq_i for did_i. Determine the cost of an optimal binary search tree for KK with the following probabilities:
ii012345
pip_i0.080.150.050.10.12
qiq_i0.040.10.080.10.060.12

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

這一題的完整詳解

核心觀念

本題考二元搜尋樹的最佳化建構。搜尋成功時,鍵 kik_i 的機率為 pip_i;搜尋失敗時,會落在相鄰鍵之間的虛擬鍵 did_i,其機率為 qiq_i。最佳二元搜尋樹要讓所有成功與失敗搜尋的期望比較次數最小。

令 e[i,j]e[i,j] 表示以 ki,…,kjk_i,\ldots,k_j 為鍵的最佳搜尋成本,並令 e[i,i−1]=qi−1e[i,i-1]=q_{i-1}。若選 krk_r 為根,左右子樹的深度都增加一層,因此:

e[i,j]=min⁡i≤r≤j(e[i,r−1]+e[r+1,j]+w(i,j))e[i,j] = \min_{i\le r\le j} \left(e[i,r-1]+e[r+1,j]+w(i,j)\right)

其中

w(i,j)=∑t=ijpt+∑t=i−1jqtw(i,j)=\sum_{t=i}^{j}p_t+\sum_{t=i-1}^{j}q_t

解題方法

將鍵依區間長度由短到長計算,每次比較區間內各鍵作為根時的成本。以下列出每個區間的最佳成本;括號內是使成本最小的根鍵。

區間最佳成本(根)區間最佳成本(根)
[1,1][1,1]0.36 (k1)0.36\ (k_1)[2,2][2,2]0.51 (k2)0.51\ (k_2)
[3,3][3,3]0.41 (k3)0.41\ (k_3)[4,4][4,4]0.42 (k4)0.42\ (k_4)
[5,5][5,5]0.48 (k5)0.48\ (k_5)[1,2][1,2]0.89 (k2)0.89\ (k_2)
[2,3][2,3]0.99 (k2)0.99\ (k_2)[3,4][3,4]0.86 (k4)0.86\ (k_4)
[4,5][4,5]1.04 (k5)1.04\ (k_5)[1,3][1,3]1.37 (k2)1.37\ (k_2)
[2,4][2,4]1.57 (k3)1.57\ (k_3)[3,5][3,5]1.52 (k4)1.52\ (k_4)
[1,4][1,4]1.98 (k2)1.98\ (k_2)[2,5][2,5]2.35 (k4)2.35\ (k_4)

完整區間 [1,5][1,5] 的總權重為

w(1,5)=∑i=15pi+∑i=05qi=0.5+0.5=1w(1,5)=\sum_{i=1}^{5}p_i+\sum_{i=0}^{5}q_i=0.5+0.5=1

依序試各鍵作為根:

根鍵成本
k1k_1q0+e[2,5]+w(1,5)=0.04+2.35+1=3.39q_0+e[2,5]+w(1,5)=0.04+2.35+1=3.39
🔒

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

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

免費註冊

第 15 題10 分

  1. (10%) Given a directed and strongly connected graph G=(V,E)G = (V, E), please design an algorithm to determine whether it contains a (directed) cycle of odd length.

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

這一題的完整詳解

核心觀念

奇數長度的有向環,是沿著有向邊出發並回到起點,且邊數為奇數的封閉路徑。做法是把每個頂點拆成兩種狀態,記錄目前走過的邊數奇偶性:

  • (v,0)(v,0):走到頂點 vv 時,路徑長度為偶數。
  • (v,1)(v,1):走到頂點 vv 時,路徑長度為奇數。

每走過一條邊,奇偶性就切換一次。因此,從 (s,0)(s,0) 能到達 (s,1)(s,1),代表存在一條從 ss 出發、回到 ss 的奇數長度有向封閉路徑。

解題方法

任選一個頂點 ss,在上述狀態圖上從 (s,0)(s,0) 執行 BFS 或 DFS。對原圖的每條有向邊 (u,v)(u,v),狀態轉移如下:

(u,0)→(v,1),(u,1)→(v,0)(u,0)\to(v,1),\qquad (u,1)\to(v,0)

若搜尋能到達 (s,1)(s,1),便判定存在奇數長度有向環;否則判定不存在。

這個判定仰賴題目給定的強連通性。若原圖含有奇數長度有向環,設環上的頂點為 uu。由強連通性,存在從 ss 到 uu 的有向路徑,以及從 uu 回到 ss 的有向路徑。將這兩段路徑合起來,再比較「不繞環」與「多繞一次奇數環」的封閉路徑,兩者長度奇偶性相反,因此其中一條是奇數長度。

反過來說,若存在從 ss 回到 ss 的奇數長度有向封閉路徑,將它拆解為若干有向環,這些環的長度總和為奇數,因此至少有一個環的長度是奇數。

偽程式碼

🔒

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

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

免費註冊

第 16 題10 分

  1. (10%) Find a feasible solution or determine that no feasible solution exists for the following system of difference constraints:
x1−x3≤1x2−x3≤−4x4−x5≤2x3−x4≤7x5−x1≤5x4−x2≤10x1−x2≤2x5−x3≤−1\begin{aligned} x_1 - x_3 &\le 1 \\ x_2 - x_3 &\le -4 \\ x_4 - x_5 &\le 2 \\ x_3 - x_4 &\le 7 \\ x_5 - x_1 &\le 5 \\ x_4 - x_2 &\le 10 \\ x_1 - x_2 &\le 2 \\ x_5 - x_3 &\le -1 \end{aligned}

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

這一題的完整詳解

核心觀念

差分限制式可寫成 xi−xj≤cx_i-x_j\le c。將它轉成有向邊 j→ij\to i,邊權重為 cc。若 did_i 是頂點 ii 的距離,則每條邊都須滿足:

di≤dj+cd_i\le d_j+c

因此,圖中若有負權重環,沿環相加會得到 0<00<0 的矛盾,系統無解;若沒有負權重環,Bellman–Ford 演算法可求出一組可行值。

解題方法

先固定 x3=0x_3=0 作為基準。由第二條限制式:

x2−x3≤−4x_2-x_3\le -4

取 x2=−4x_2=-4。第七條限制式給出 x1−x2≤2x_1-x_2\le2,因此可取 x1=−2x_1=-2。再取 x5=−1x_5=-1、x4=0x_4=0,得到候選解:

(x1,x2,x3,x4,x5)=(−2,−4,0,0,−1)(x_1,x_2,x_3,x_4,x_5)=(-2,-4,0,0,-1)

逐條代入檢查:

限制式左側代入結果檢查
x1−x3≤1x_1-x_3\le1−2−0=−2-2-0=-2−2≤1-2\le1
x2−x3≤−4x_2-x_3\le-4−4−0=−4-4-0=-4−4≤−4-4\le-4
x4−x5≤2x_4-x_5\le20−(−1)=10-(-1)=11≤21\le2
x3−x4≤7x_3-x_4\le70−0=00-0=00≤70\le7
x5−x1≤5x_5-x_1\le5−1−(−2)=1-1-(-2)=11≤51\le5
x4−x2≤10x_4-x_2\le100−(−4)=40-(-4)=44≤104\le10
🔒

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

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

免費註冊

第 17 題10 分

  1. (10%) Given a finite set XX and a family FF of subsets of XX such that every element of XX belongs to at least one subset in FF, the set-covering problem is to find a minimum-size subset ζ⊆F\zeta \subseteq F whose members cover all of XX: X=⋃S∈ζSX = \bigcup_{S \in \zeta} S. The following algorithm is a δ\delta-approximation algorithm to find a set cover ζ\zeta satisfying ∣ζ∣≤δ∣ζ∗∣|\zeta| \le \delta |\zeta^*| where ζ∗\zeta^* is an optimal solution. Please compute the minimum value of δ\delta.
GREEDY-SET-COVER(X, F)
1  U = X
2  ζ = ∅
3  while U ≠ ∅
4      select an S ∈ F that maximizes |S ∩ U|
5      U = U − S
6      ζ = ζ ∪ {S}
7  return ζ

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

這一題的完整詳解

核心觀念

這題考的是貪婪集合覆蓋法的近似比。每一輪選擇能覆蓋最多尚未覆蓋元素的集合,直到所有元素都被覆蓋。

令 n=∣X∣n=|X|,令 HnH_n 為第 nn 個調和數:

Hn=1+12+13+⋯+1nH_n=1+\frac12+\frac13+\cdots+\frac1n

貪婪集合覆蓋法的標準近似保證為 HnH_n,且 Hn≤1+ln⁡nH_n\le 1+\ln n。

解題方法

分析時,把每輪選出的集合平均分攤成本給該輪新覆蓋的元素。若某輪新覆蓋 kk 個元素,便對每個元素收取 1/k1/k 的成本;該輪總成本因此為 11,所有輪次的總成本就是演算法選出的集合數 ∣ζ∣|\zeta|。

接著固定一個最優解中的集合 S∗S^*,令 r=∣S∗∣r=|S^*|。當 S∗S^* 尚有 tt 個元素未覆蓋時,因為 S∗S^* 本身是可選集合,貪婪法選出的集合至少也會新覆蓋 tt 個元素。因此,該輪每個新覆蓋元素分攤的成本至多為 1/t1/t。

沿著元素被覆蓋的順序,S∗S^* 中元素的分攤成本總和至多為:

🔒

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

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

免費註冊

其他考古題