111 地方特考四等 資訊處理 資料處理概要 考古題詳解
第 一 題15 分
設 與 分別含有 及 個元素之兩個數列陣列。
(一)試設計一演算法 ,將 與 內之元素合併成一個新陣列 。合併後 內之元素需依小而大排序;該演算法的執行時間需最佳。
(二)試計算所設計出之演算法 的執行時間複雜度。
登入後即可作答並保存紀錄。
核心觀念
本題的核心在於「陣列合併(Merging)」與「內部排序(Internal Sorting)」的演算法設計與時間複雜度分析,涉及以下關鍵理論:
- 比較排序法(Comparison-based Sort)的理論下限: 對於任意未排序的 個元素,基於比較的排序演算法在最差及平均情況下的時間複雜度下限為 。常見能達到最優執行時間()的演算法包含合併排序法(Merge Sort)與堆積排序法(Heap Sort)。
- 已排序序列的雙指標合併法(Two-pointer Merge): 若兩數列已分別由小到大排序,可利用雙指標進行線性掃描比對,在 的最佳線性時間內完成合併。
- 時間複雜度表示法(Big- Notation): 以輸入規模 與 同步評估運算步數。
解題方法
本題題幹未明確註記輸入陣列 與 是否「已事先由小到大排序」;在歷屆公職考試命題中,此類題目常有兩種命題意圖。為求解答嚴謹周全,以下依兩種情境分別給出最佳演算法設計與複雜度推導:
(一)演算法設計
情境一: 與 為任意數列(未預先排序,一般情況)
若 與 初始狀態未排序,最佳策略為:將 與 依序複製至長度為 的陣列 中,接著對陣列 執行最佳比較排序演算法(此處採用時間複雜度穩定且最差情況仍為 的合併排序法 )。
演算法虛擬碼(Pseudocode):
Algorithm Sort(M, N, P, m, n)
Input:
M: 大小為 m 的數列陣列(索引 1 至 m)
N: 大小為 n 的數列陣列(索引 1 至 n)
m, n: 陣列 M 與 N 的元素個數
Output:
P: 大小為 m + n 的已由小到大排序陣列(索引 1 至 m + n)
1. // 步驟一:將 M 與 N 的元素複製到新陣列 P
2. for i <- 1 to m do
3. P[i] <- M[i]
4. for j <- 1 to n do
5. P[m + j] <- N[j]
6. // 步驟二:對陣列 P 進行合併排序
7. MergeSort(P, 1, m + n)
end Sort
Algorithm MergeSort(A, left, right)
1. if left < right then
2. mid <- floor((left + right) / 2)
3. MergeSort(A, left, mid)
4. MergeSort(A, mid + 1, right)
5. Merge(A, left, mid, right)
end MergeSort
情境二: 與 各自已依由小到大排序(特例情況/經典合併程序)
若命題者將「合併兩已排序陣列」簡稱為「」,則無須重新排序,直接採用雙指標比對法(Two-pointer Merge)即可在線性時間內完成,此時執行時間最優。
演算法虛擬碼(Pseudocode):
第 二 題15 分
設 為一字串,描述著一個以後置運算式(postfix expression)表示之數學運算式,例如 。
其中每一個運算元(operand)皆僅為一個位數整數,且只有「」、「」、「」、「」四種可能運算子(operator)。
(一)寫出一演算法 ,利用堆疊(Stack)計算該後置運算式,並傳回該運算結果。
(二)以您所設計之演算法,來計算數學運算式 。寫出在執行過程中每一步驟 Stack 及 PFExp 的內容。
以下是您可能會用到的副程式:
- :移除 Stack 中最前面的整數,並傳回被移除的整數。
- :將整數 放入 Stack 的最前面。
- :將一字元 轉成一整數,並傳回該整數。
- :移除 PFExp 中最前面的字元,並傳回該字元。
- :如 PFExp 為一空字串時,傳回 TRUE,否則傳回 FALSE。
登入後即可作答並保存紀錄。
核心觀念
本題評量資料結構中「堆疊(Stack)」之核心應用——後置運算式(Postfix Expression / 逆波蘭表示法 RPN)之求值演算法與程式追蹤(Tracing)能力。
- 後置運算式特性: 運算子(Operator)位於其對應的運算元(Operand)之後。其最大優勢在於不需括號與運算子優先權比較,只要由左至右掃描即可完成求值。
- 堆疊(Stack)的 LIFO(後進先出)特性:
- 遇運算元(數值):直接推入(Push)堆疊暫存。
- 遇雙元運算子:自堆疊連續彈出(Pop)兩個數值進行計算,並將計算結果推回(Push)堆疊中。
- 左右運算元的順序性(關鍵重點): 因堆疊為後進先出,當彈出兩個運算元時:
- 第一個彈出者為右運算元(Right Operand,設為 )。
- 第二個彈出者為左運算元(Left Operand,設為 )。
- 運算時必須以 計算,此順序對非交換律的運算(減法「」、除法「」)至關重要。
解題方法
(一)演算法設計
依題意,題目已規範以下內建副程式:
EMPTY(PFExp):判斷字串是否已空。First_Char(PFExp):取出並移除字串首字元。DECV(C):將字元數字轉為對應整數。PUSHStack(Stack, V):將數值置入堆疊頂端。POPStack(Stack):彈出堆疊頂端數值。
演算法虛擬碼(Pseudocode):
int postfix_math(string PFExp) {
Stack S; // 宣告並初始化堆疊 S
char token; // 存放當前讀取的字元
int op1, op2; // op1 為左運算元,op2 為右運算元
int result; // 存放單步運算結果
while (!EMPTY(PFExp)) {
token = First_Char(PFExp); // 取得並移除 PFExp 第一個字元
// 若為運算元(0~9之單一位數整數)
if (token >= '0' && token <= '9') {
PUSHStack(S, DECV(token));
}
// 若為運算子(+、-、*、/)
else {
op2 = POPStack(S); // 先彈出者為右運算元
op1 = POPStack(S); // 後彈出者為左運算元
switch (token) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
}
PUSHStack(S, result); // 將運算結果推回堆疊
}
}
// 迴圈結束後,堆疊頂端即為最終運算式之解
return POPStack(S);
}
(二)逐步追蹤執行過程
輸入運算式:。
注意:題意定義 First_Char(PFExp) 會移除最前面的字元,因此每讀取一個字元後, 長度即減少 。
第 三 題5 分
假設 為一個符合第一正規化要求之關聯表格,且 包含有屬性為 ,以下描述其屬性間之功能相依的關係性:
(一)決定出表格 之最合適的主要鍵(primary key)。
(二)將 轉化成符合第二正規化要求的關聯表格,並指出關聯表格的主要鍵。
(三)將(二)轉化後的關聯表格,轉成符合第三正規化要求之表格,並標出表格的主要鍵。
(※需寫出推導過程)
登入後即可作答並保存紀錄。
核心觀念
本題評量關聯式資料庫理論中「功能相依(Functional Dependency, FD)」與「正規化(Normalization)」的推導能力:
- 候選鍵(Candidate Key)與主要鍵(Primary Key, PK):
- 若屬性子集合 能決定表格之全體屬性(即屬性閉包 ),且其任何真子集皆無法決定全體屬性(具備極小性 Minimality),則 為候選鍵。
- 若候選鍵只有一組,該候選鍵即為最適之主要鍵。
- 第一正規化(1NF):表格中所有屬性之值皆為不可再分割的單一原子值(Atomic value)。題目已給定 符合 1NF。
- 第二正規化(2NF):
- 符合 1NF。
- 消除部分功能相依(Partial Functional Dependency):每個「非主屬性(Non-prime attribute)」都必須完全功能相依於候選鍵,不可僅相依於候選鍵的真子集。
- 第三正規化(3NF):
- 符合 2NF。
- 消除傳遞功能相依(Transitive Functional Dependency):表格中不可存在非主屬性傳遞相依於候選鍵。換言之,對於表格中每一個非平庸功能相依 , 必須為超鍵(Superkey),或 必須為主屬性。
解題方法與推導過程
(一)決定表格 最合適的主要鍵
- 屬性全體集合:
- 已知功能相依集合 :
- 分析屬性出現位置:
- 出現在箭頭右方(被決定者)的屬性集合:
- 未出現在箭頭右方的屬性集合:
- 由於屬性 與 從未被任何其他屬性決定,因此任何候選鍵都必須包含屬性組合 。
- 計算屬性閉包 :
- 初始:
- 依 :加入
- 依 :加入
- 依 :加入
- 由於 涵蓋全體屬性,故 為超鍵(Superkey)。
- 檢驗極小性(Minimality):
- 檢查真子集 之閉包:依 ,得 。
- 檢查真子集 之閉包: 無法單獨決定其他屬性,得 。
- 之任何真子集皆無法決定全體屬性,故 為極小超鍵(即候選鍵)。
- 判定主要鍵:
- 因所有候選鍵必含 ,而 本身已為候選鍵,故不存在其他候選鍵。 為全表唯一的候選鍵,即為最合適的主要鍵。
(二)將 轉化成符合第二正規化(2NF)要求的關聯表格
- 找出違反 2NF 的部分功能相依:
- 主要鍵為 。
- 主屬性(屬於候選鍵之屬性):。
- 非主屬性:。
- 檢視給定之功能相依:。 決定者 為主要鍵 的真子集,而被決定者 為非主屬性。此即部分功能相依,違反 2NF。
- 進行 2NF 分解:
- 將造成部分相依的屬性獨立建立新表格:
- 取出屬性 建立關聯表格 ,其主要鍵為 。
- 原表格中移除已抽離的非主屬性 ,保留主要鍵及其完全功能相依之其餘屬性:
- 建立關聯表格 ,其主要鍵為 。
- 檢驗 2NF 符合性:
- 表格 :主要鍵為單一屬性 ,不存在主鍵真子集,符合 2NF。
第 四 題3 分
以下為某種程式語言的 pseudo codes,其中 為主程式, 為被呼叫的副程式。
p(int y, int x, int z)
{
x = x + z;
z = x + 1;
x = y + z;
y = z;
}
main()
{
x = 2;
y = 5;
p(x, y, 3);
print x, y;
}
(一)若副程式是以傳名呼叫(passed by name)法,則主程式印出的結果為何?
(二)若副程式是以傳址呼叫(passed by reference)法,則主程式印出的結果為何?
(三)若副程式是以傳值呼叫(passed by value)法,則主程式印出的結果為何?
登入後即可作答並保存紀錄。
核心觀念
本題考驗程式語言(Programming Languages)中程序呼叫與參數傳遞機制(Parameter Passing Mechanisms)的底層運作原理,以及對形式參數(Formal Parameters)與實際引數(Actual Arguments)位置綁定的細心度:
- 參數對稱陷阱(Position vs. Identifier Binding):
副程式定義為
p(int y, int x, int z),主程式呼叫為p(x, y, 3)。參數傳遞依「位置」對應而非「變數名稱」:
- 形參
y對應主程式的變數x。 - 形參
x對應主程式的變數y。 - 形參
z對應常數值3。
- 三大參數傳遞機制之定義:
- 傳值呼叫(Passed by Value):將實參的數值複製給形參。副程式在獨立的記憶體堆疊(Stack Frame)中運作,內部對參數的任何修改皆為區域操作,不影響主程式的原始變數。
- 傳址呼叫(Passed by Reference):將實參的記憶體位址傳遞給形參,形參成為實參的「別名(Alias)」。副程式內部對形參的讀寫,直接作用於主程式對應的記憶體空間。若實參為常數(如
3),編譯器會配置臨時匿名空間傳入。 - 傳名呼叫(Passed by Name):源自 Algol 60 的代換規則(Textual Substitution),其本質為延遲求值(Lazy Evaluation / Thunk)。副程式本體內的形參直接被實參表達式的「文字」取代,每次執行該敘述時,皆在呼叫端的環境中重新求值。
解題方法
在追蹤程式執行前,先建立參數對照關係表:
副程式形式參數(p) | 主程式實際引數(main) | 呼叫時初始值 |
|---|---|---|
第 1 個參數:y | 主程式變數 x | |
第 2 個參數:x | 主程式變數 y | |
第 3 個參數:z | 常數 3 |
(一)傳名呼叫(Passed by Name)之推導
將副程式 p 中的形式參數,以主程式傳入的實際引數進行純文字巨集代換:
- 所有
y替換為x(代表主程式的變數x) - 所有
x替換為y(代表主程式的變數y) - 所有
z替換為3
文字代換後的程式碼展開如下:
y = y + 3; // 對應原式:x = x + z;
3 = y + 1; // 對應原式:z = x + 1;
y = x + 3; // 對應原式:x = y + z;
x = 3; // 對應原式:y = z;
逐步追蹤分析:
y = y + 3;主程式的 。3 = y + 1;語法/執行錯誤。常數3屬於純右值(R-value),不可作為被賦值的左值(L-value)。在 Algol 60 標準規範下,對常數引數指派會產生編譯錯誤或執行時期中斷(Error),無法正常印出結果。- 若考題假設「常數不可指派而略過該錯誤行(或常數指派無效)」進行純文字代換:
- 第 3 行
y = x + 3;(此時主程式 )。 - 第 4 行
x = 3;主程式 。 - 最終主程式輸出為 。
(二)傳址呼叫(Passed by Reference)之推導
第 五 題10 分
以下顯示一 Ethernet 2000 網路架構:
PC1 PC4
00-13-46-9A-63-74 00-E0-4C-39-00-1F
fa0/1
PC2 fa0/2 Switch 1 fa0/4 PC5
80-C1-6E-F3-E7-6A 00-03-FF-C0-CD-98
fa0/3
PC3 PC6
00-F1-EE-50-DC-92 09-54-11-2d-c5-22
(一)當剛打開網路系統後,PC1 向 PC3 傳遞資料,描述 Switches 傳送該資料的過程及資料內容的變化。
(二)隨後 PC5 向 PC1 傳遞資料,描述 Switches 傳送該資料的過程及資料內容的變化。
登入後即可作答並保存紀錄。
核心觀念
本題考 Ethernet 交換器(Switch)的自動學習、查表轉送與未知目的位址泛洪:
- 交換器收到框架時,依來源 MAC 位址及進入埠學習並更新 MAC 位址表。
- 再依目的 MAC 位址查表:查得到,就只從對應埠轉送;查不到,就向同一 VLAN 的其他埠泛洪,不送回來源埠。
- 交換器轉送時不改變框架的來源、目的 MAC 位址或上層資料內容。
(一)PC1 傳送資料給 PC3
假設兩台交換器剛啟動、MAC 位址表皆為空,且 PC1 已取得 PC3 的目的 MAC 位址。PC1 的 MAC 位址是 00-13-46-9A-63-74,PC3 的是 00-F1-EE-50-DC-92。
- Switch 1 收到框架:框架由 fa0/1 進入。Switch 1 學到
00-13-46-9A-63-74 → fa0/1。因為查不到 PC3 的 MAC 位址,便由 fa0/2、fa0/3、fa0/4 泛洪,不送回 fa0/1。 - Switch 2 收到框架:框架由 fa0/4 進入。Switch 2 學到
00-13-46-9A-63-74 → fa0/4。由於也查不到 PC3 的位置,便由 fa0/1、fa0/2、fa0/3 泛洪,不送回 fa0/4。 - PC3 收到框架:PC3 確認目的 MAC 位址是自己的,接收資料;其他收到框架副本的主機因目的位址不符而丟棄。
此時已學到的位址表項目如下:
| 交換器 | MAC 位址表 |
|---|---|
| Switch 1 | 00-13-46-9A-63-74 → fa0/1 |
| Switch 2 | 00-13-46-9A-63-74 → fa0/4 |
(二)PC5 傳送資料給 PC1
PC5 的 MAC 位址是 00-03-FF-C0-CD-98,目的 PC1 的 MAC 位址是 00-13-46-9A-63-74。PC1 的位置已在前一段傳輸中被兩台交換器學到。
- Switch 2 收到框架:框架由 fa0/2 進入。Switch 2 學到
00-03-FF-C0-CD-98 → fa0/2。