110 地方特考三等 資訊處理 資料結構 考古題詳解

110 年・地方特考・三等・資訊處理
試題代碼 資料結構

第 一 題25 分

(一) 請分別寫出下圖二元樹的前序走訪法(preorder traversal)、中序走訪法(inorder traversal)、後序走訪法(postorder traversal)的結果。(6 分)

二元樹結構如下:

  • AA 為根節點。
  • AA 的左子樹根節點為 BB,右子樹根節點為 CC。
  • BB 的左、右子節點分別為 DD、EE。
  • CC 的左、右子節點分別為 FF、GG。
  • EE 的子節點為 HH。
  • GG 的子節點為 KK。

(二) 請在無法預知二元樹的節點數條件下,設計在程式中表示二元樹的資料結構。再假設二元樹已依前述結構儲存在程式,設計一副程式(或函式)的演算法,在提供樹根給此副程式(或函式)後,其執行二元樹中序走訪法的程序並輸出走訪結果。

此副程式(或函式)不可使用遞迴呼叫技術,但可添加其他資料結構。演算法的時間複雜度和空間複雜度須均為 O(n)O(n),nn 為二元樹的節點個數。演算法可以虛擬碼(pseudo-code)或以高階語言如 C 呈現。需分析說明副程式(或函式)演算法的時間複雜度和空間複雜度均為 O(n)O(n)。

提醒:若用遞迴呼叫技術設計,演算法部分不給分。(13 分)

(三) 請分別說明在程式執行過程,以第(二)子題非遞迴呼叫技術設計,相較於以遞迴呼叫技術設計,在時間與空間的效能優勢各為何?(6 分)

🖼️ 本題原卷含圖表。基於試題來源之版權考量,本站不轉載原卷影像; 題目文字已完整轉錄,圖表請自行參閱考選部公告之試題原檔。

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

這一題的完整詳解

核心觀念

本題考查二元樹的三種走訪順序,以及利用「鏈結節點表示法」與「堆疊(stack)」實作非遞迴中序走訪。

  • 前序:根 →\rightarrow 左子樹 →\rightarrow 右子樹
  • 中序:左子樹 →\rightarrow 根 →\rightarrow 右子樹
  • 後序:左子樹 →\rightarrow 右子樹 →\rightarrow 根

依考卷圖形判讀,HH 是 DD 的右子節點,KK 是 GG 的左子節點。


(一)三種走訪結果

樹的結構為:

  • AA 的左、右子節點為 BB、CC
  • BB 的左、右子節點為 DD、EE
  • DD 的右子節點為 HH
  • CC 的左、右子節點為 FF、GG
  • GG 的左子節點為 KK
  1. 前序走訪:根、左、右
A, B, D, H, E, C, F, G, KA,\ B,\ D,\ H,\ E,\ C,\ F,\ G,\ K
  1. 中序走訪:左、根、右
D, H, B, E, A, F, C, K, GD,\ H,\ B,\ E,\ A,\ F,\ C,\ K,\ G
  1. 後序走訪:左、右、根
H, D, E, B, F, K, G, C, AH,\ D,\ E,\ B,\ F,\ K,\ G,\ C,\ A

(二)二元樹資料結構與非遞迴中序走訪

資料結構設計

因節點數無法預先確定,使用動態配置記憶體的鏈結二元樹:

typedef struct Node {
 char data;
 struct Node *left;
 struct Node *right;
} Node;

每個節點包含:

  • data:儲存節點資料
  • left:指向左子樹
  • right:指向右子樹

另外使用堆疊儲存尚未處理的節點。

非遞迴中序走訪虛擬碼

Inorder(root):
 建立空堆疊 S
 current ← root

 while current ≠ NULL 或 S 不為空:
 while current ≠ NULL:
 Push(S, current)
 current ← current.left

 current ← Pop(S)
 輸出 current.data

 current ← current.right

執行方法

🔒

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

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

免費註冊

第 二 題20 分

二維方陣 AA 大小為 n×nn \times n。方陣中的元素除了主對角線之元素以及緊鄰它的上下兩條對角線之元素的值可能不為零外,方陣 AA 其他元素之值一定為零,以 5×55 \times 5 方陣為例如下:

[a00a01000a10a11a12000a21a22a23000a32a33a34000a43a44]\begin{bmatrix} a_{00} & a_{01} & 0 & 0 & 0 \\ a_{10} & a_{11} & a_{12} & 0 & 0 \\ 0 & a_{21} & a_{22} & a_{23} & 0 \\ 0 & 0 & a_{32} & a_{33} & a_{34} \\ 0 & 0 & 0 & a_{43} & a_{44} \end{bmatrix}

請以一維陣列 BB 設計儲存此方陣 AA 之結構。陣列 BB 之索引值自 00 開始,且陣列 BB 的元素數量須小於或等於 3×n−23 \times n - 2。

設計的結構須包含:

  1. 如何有效率地決定儲存方陣 AA 之元素 aija_{ij}。
  2. 如何自陣列 BB 中取得或決定方陣中元素 aija_{ij} 值。

其中 0≤i,j≤n−10 \le i,j \le n-1,而 ii 與 jj 分別為元素在方陣 AA 中之列號與行號。(20 分)

🖼️ 本題原卷含圖表。基於試題來源之版權考量,本站不轉載原卷影像; 題目文字已完整轉錄,圖表請自行參閱考選部公告之試題原檔。

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

這一題的完整詳解

核心觀念

本題考查「特殊矩陣的壓縮儲存」。矩陣 AA 只有三條對角線上的元素可能不為零:

  • 下對角線:ai,i−1a_{i,i-1},共有 n−1n-1 個。
  • 主對角線:ai,ia_{i,i},共有 nn 個。
  • 上對角線:ai,i+1a_{i,i+1},共有 n−1n-1 個。

因此需要儲存的元素總數為

(n−1)+n+(n−1)=3n−2(n-1)+n+(n-1)=3n-2

符合題目限制。

解題方法

採用一維陣列 BB,依序儲存「下對角線、主對角線、上對角線」。

陣列配置

B[0…n−2]:存放下對角線B[n−1…2n−2]:存放主對角線B[2n−1…3n−3]:存放上對角線\begin{aligned} B[0 \ldots n-2]&:存放下對角線\\ B[n-1 \ldots 2n-2]&:存放主對角線\\ B[2n-1 \ldots 3n-3]&:存放上對角線 \end{aligned}

具體定義如下:

B[i−1]=ai,i−1,1≤i≤n−1B[i-1]=a_{i,i-1}, \quad 1\le i\le n-1 B[n−1+i]=ai,i,0≤i≤n−1B[n-1+i]=a_{i,i}, \quad 0\le i\le n-1 B[2n−1+i]=ai,i+1,0≤i≤n−2B[2n-1+i]=a_{i,i+1}, \quad 0\le i\le n-2

以題目中的 5×55\times5 矩陣為例:

B=[a10,a21,a32,a43,a00,a11,a22,a33,a44,a01,a12,a23,a34]B= [ a_{10},a_{21},a_{32},a_{43}, a_{00},a_{11},a_{22},a_{33},a_{44}, a_{01},a_{12},a_{23},a_{34} ]

陣列索引如下:

BB 的索引儲存內容
00a10a_{10}
11a21a_{21}
22a32a_{32}
33a43a_{43}
44a00a_{00}
55a11a_{11}
66a22a_{22}
77a33a_{33}
88a44a_{44}
99a01a_{01}
1010a12a_{12}
1111a23a_{23}
1212a34a_{34}

由 BB 取得 aija_{ij}

給定 0≤i,j≤n−10\le i,j\le n-1,分三種情況判斷:

1. 位於下對角線

當

i=j+1i=j+1

表示 aija_{ij} 位於下對角線,因此

aij=B[i−1]a_{ij}=B[i-1]

2. 位於主對角線

當

i=ji=j

表示 aija_{ij} 位於主對角線,因此

aij=B[n−1+i]a_{ij}=B[n-1+i]

3. 位於上對角線

當

j=i+1j=i+1
🔒

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

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

免費註冊

第 三 題25 分

(一) 請畫出下圖以鏈結串列(linked list)為基礎的相鄰串列(adjacency list)結構表示之結果。(5 分)

原卷圖示可辨識之節點標示為 00、11、22、33、44;圖形連線於文字層未擷取,請參考原卷圖示。

(二) 請運用一維陣列設計一資料結構,採循序串列(sequential list)架構,其仍舊以類似子題(一)相鄰串列策略表示無向圖(undirected graph)節點與邊的關係,但僅以一維陣列呈現第(一)子題之相鄰串列概念。

圖之節點與邊的關係僅以此一維陣列元素記錄並呈現,不可使用其他資料結構。另外,陣列中亦需記錄此陣列中用來記錄與圖相關資訊之元素個數。除了說明資料結構外,也請寫出下圖以此資料結構表示之一維陣列結果。(8 分)

原卷圖示可辨識之節點標示為 00、11、22、33、44;圖形連線於文字層未擷取,請參考原卷圖示。

(三) 請列出兩項在程式中,以第(一)子題之鏈結串列(linked list)表示圖,比以第(二)子題一維陣列表示圖適合的應用情境或效能優勢。另外,也請列出兩項在程式中,以第(二)子題一維陣列表示圖,比以第(一)子題鏈結串列(linked list)表示圖適合的應用情境或效能優勢。(12 分)

🖼️ 本題原卷含圖表。基於試題來源之版權考量,本站不轉載原卷影像; 題目文字已完整轉錄,圖表請自行參閱考選部公告之試題原檔。

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

這一題的完整詳解

核心觀念

本題考察無向圖的兩種表示法:

  1. 相鄰串列(adjacency list):每個頂點保存一條串列,記錄與該頂點直接相連的所有頂點。
  2. 鏈結串列與循序串列的差異:
  • 鏈結串列適合資料數量變動、插入與刪除頻繁的情況。
  • 一維陣列適合資料結構固定、需要連續記憶體與快速索引的情況。

由圖可辨識的邊為:

(0,1), (0,2), (0,3), (2,3), (3,4)(0,1),\ (0,2),\ (0,3),\ (2,3),\ (3,4)

因為是無向圖,每條邊必須在兩個端點的相鄰串列中各記錄一次。


(一)以鏈結串列表示相鄰串列

各頂點的相鄰頂點如下:

  • 頂點 00:連接 1,2,31,2,3
  • 頂點 11:連接 00
  • 頂點 22:連接 0,30,3
  • 頂點 33:連接 0,2,40,2,4
  • 頂點 44:連接 33

可表示為:

0 ─→ 1 ─→ 2 ─→ 3 ─→ NULL
1 ─→ 0 ─→ NULL
2 ─→ 0 ─→ 3 ─→ NULL
3 ─→ 0 ─→ 2 ─→ 4 ─→ NULL
4 ─→ 3 ─→ NULL

每條無向邊均出現兩次,例如邊 (0,3)(0,3) 同時記錄於頂點 00 與頂點 33 的串列中。

相鄰頂點的排列順序不影響圖形所代表的內容,因此上述順序只要正確記錄所有相鄰頂點即可。


(二)以一維陣列表示相鄰串列

資料結構設計

設一維陣列為 BB,採用下列格式:

  • B[0]B[0]:記錄目前使用的陣列元素數量,不包含 B[0]B[0] 本身。
  • B[1]B[1] 至 B[5]B[5]:分別記錄頂點 00 至頂點 44 的相鄰資料起始位置。
  • B[6]B[6] 以後:依序存放各頂點的相鄰頂點。
  • 頂點 ii 的相鄰資料範圍為:
  • 起點:B[i+1]B[i+1]
  • 終點:下一個頂點的起始位置減 11
  • 最後一個頂點的終點為 B[0]B[0]

此設計不使用其他資料結構,所有索引、頂點與數量資訊均存放於同一個一維陣列中。

陣列內容

依序將相鄰頂點存放如下:

  • 頂點 00:1,2,31,2,3
  • 頂點 11:00
  • 頂點 22:0,30,3
  • 頂點 33:0,2,40,2,4
  • 頂點 44:33

因此:

索引0123456789101112131415
BB15691012151230030243

其中:

🔒

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

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

免費註冊

第 四 題30 分

區間堆積(interval heap)是一種優先佇列(priority queue),請回答下列相關問題。

(一) 從一個沒有元素的區間堆積開始,依序插入 4040、3030、6060、1515、1414、1919、8080、1212、9090 等元素。請畫出最後區間堆積的樹狀結構圖。(9 分)

(二) 請自第(一)子題建構的區間堆積中刪除元素 1212,並畫出刪除該元素後區間堆積的樹狀結構圖。(3 分)

(三) 請以一維陣列設計資料結構儲存區間堆積。該資料結構可以透過節點對應之陣列索引值 indexindex 構成的數學式,計算出其父節點 parentparent、左子節點 leftleft、右子節點 rightright 與兄弟節點 brotherbrother 等在陣列中的索引值。

假設此一維陣列之起始索引值為 00,請列出由 indexindex 構成的計算 parentparent、leftleft、rightright、brotherbrother 的數學式。並請畫出以此一維陣列儲存第(一)子題建構完成的區間堆積的結果。(12 分)

(四) 舉例並說明一既需要提供最高優先元素,也需要提供最低優先元素的優先佇列的應用實例或系統。(6 分)

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

這一題的完整詳解

核心觀念

區間堆積(interval heap)是雙端優先佇列(double-ended priority queue),每個節點儲存一個區間 [L,R][L,R],並滿足:

  1. 節點內部:L≤RL\le R。
  2. 所有左端點形成最小堆積(min-heap):

Lparent≤LchildL_{\text{parent}}\le L_{\text{child}}

  1. 所有右端點形成最大堆積(max-heap):

Rparent≥RchildR_{\text{parent}}\ge R_{\text{child}}

因此,根節點的左端點是全體元素的最小值,右端點是全體元素的最大值。

本題不是選擇題,無選項分析。


(一)依序插入元素並畫出最後區間堆積

解題方法

插入時遵循以下原則:

  • 若目前最後一個節點只有一個元素,先將新元素放入同一節點,形成區間。
  • 若新元素小於父節點左端點,沿左端點最小堆積向上調整。
  • 若新元素大於父節點右端點,沿右端點最大堆積向上調整。
  • 每次調整後,都必須維持節點內 L≤RL\le R。

依序處理如下。

插入 4040

[40,40][40,40]

插入 3030

放入根節點並排序:

[30,40][30,40]

插入 6060

新增節點 [60,60][60,60]。因為 60>4060>40,沿右端點向上調整:

[30,60]/[40,40]\begin{array}{c} [30,60]\\ /\\ [40,40] \end{array}

插入 1515

放入最後節點,形成 [15,40][15,40]。因為 15<3015<30,與根節點左端點交換:

[15,60]/[30,40]\begin{array}{c} [15,60]\\ /\\ [30,40] \end{array}

插入 1414

新增節點 [14,14][14,14]。因為 14<1514<15,向上調整:

[14,60]/\[30,40][15,15]\begin{array}{c} [14,60]\\ /\quad\backslash\\ [30,40]\quad [15,15] \end{array}

插入 1919

放入最後節點 [15,15][15,15],形成:

[15,19][15,19]

此時仍符合堆積條件。

插入 8080

新增節點 [80,80][80,80]。因為 80>4080>40,先與父節點右端點交換,再與根節點右端點交換:

[14,80]/\[30,60][15,19]/[40,40]\begin{array}{c} [14,80]\\ /\quad\backslash\\ [30,60]\quad [15,19]\\ /\\ [40,40] \end{array}

插入 1212

放入最後節點 [40,40][40,40],形成 [12,40][12,40]。

因為 12<3012<30,先與父節點左端點交換,成為 [12,60][12,60];再因為 12<1412<14,與根節點左端點交換:

[12,80]/\[14,60][15,19]/[30,40]\begin{array}{c} [12,80]\\ /\quad\backslash\\ [14,60]\quad [15,19]\\ /\\ [30,40] \end{array}

插入 9090

新增節點 [90,90][90,90]。因為 90>6090>60,先與父節點右端點交換,再與根節點右端點交換:

[12,90]/\[14,80][15,19]/\[30,40][60,60]\begin{array}{c} [12,90]\\ /\quad\backslash\\ [14,80]\quad [15,19]\\ /\quad\backslash\\ [30,40]\quad [60,60] \end{array}

最後區間堆積

[12,90]/\[14,80][15,19]/\[30,40][60,60]\boxed{ \begin{array}{c} [12,90]\\ /\quad\backslash\\ [14,80]\quad [15,19]\\ /\quad\backslash\\ [30,40]\quad [60,60] \end{array} }

驗算:

  • 左端點:12,14,15,30,6012,14,15,30,60,符合最小堆積。
  • 右端點:90,80,19,40,6090,80,19,40,60,符合最大堆積。
  • 每個節點均滿足左端點 ≤\le 右端點。

(二)刪除元素 1212

解題方法

1212 是根節點的最小元素。刪除根節點左端點後,以最後一個節點的元素 6060 補入根節點,再沿左端點最小堆積向下調整。

原結構:

[12,90]/\[14,80][15,19]/\[30,40][60,60]\begin{array}{c} [12,90]\\ /\quad\backslash\\ [14,80]\quad [15,19]\\ /\quad\backslash\\ [30,40]\quad [60,60] \end{array}

刪除 1212,以 6060 補至根節點:

[60,90]/\[14,80][15,19]/[30,40]\begin{array}{c} [60,90]\\ /\quad\backslash\\ [14,80]\quad [15,19]\\ /\\ [30,40] \end{array}

根節點左端點 6060 應與子節點中較小的左端點 1414 交換:

[14,90]/\[60,80][15,19]/[30,40]\begin{array}{c} [14,90]\\ /\quad\backslash\\ [60,80]\quad [15,19]\\ /\\ [30,40] \end{array}

此時 6060 位於節點 [60,80][60,80],仍大於其子節點 [30,40][30,40] 的左端點 3030,因此繼續向下調整。交換後並維持節點內部順序:

[14,90]/\[30,80][15,19]/[40,60]\boxed{ \begin{array}{c} [14,90]\\ /\quad\backslash\\ [30,80]\quad [15,19]\\ /\\ [40,60] \end{array} }

(三)以一維陣列儲存區間堆積

核心設計

🔒

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

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

免費註冊

其他考古題