110 公務人員升官等薦任 資訊處理 資料結構 考古題詳解

110 年・公務人員升官等・薦任・資訊處理
試題代碼 資料結構

第 一 題20 分

請試述下列名詞之意涵:

(一) B+ 樹(B+ Tree)

(二) 完美雜湊函數(Perfect Hash Function)

(三) 霍夫曼編碼(Huffman Coding)

(四) 拓撲排序(Topology Sort)

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

這一題的完整詳解

核心觀念: B+ 樹是適合外部記憶體索引的平衡多路搜尋樹。樹中所有葉節點位於同一層,索引鍵(或其分隔鍵)出現在內部節點;資料紀錄或指向資料紀錄的指標則存放於葉節點。葉節點通常依鍵值排序,並以指標串接,方便依序或範圍查詢。

解題方法: 說明時掌握「內部節點負責導引搜尋、葉節點存放資料項目」即可。搜尋鍵值時,從根節點依分隔鍵選擇子樹,直到抵達葉節點;範圍查詢則先找到起始鍵所在的葉節點,再沿葉節點鏈結順序掃描。

解題技巧: 不要把 B+ 樹和一般 B 樹混為一談:B+ 樹的資料項目集中在葉節點,內部節點主要作為索引;葉節點鏈結是支援順序及範圍查詢的重要特徵。樹保持平衡,因此搜尋、插入與刪除的高度通常為 O(log⁡n)O(\log n)。

(二)完美雜湊函數(Perfect Hash Function)

核心觀念: 完美雜湊函數是針對一個已知、固定的鍵集合設計的雜湊函數,使集合中的不同鍵映射至不同的雜湊位置,也就是在該鍵集合上沒有碰撞。若雜湊位置恰好涵蓋大小為 nn 的表格中的 nn 個位置,稱為最小完美雜湊函數。

解題方法: 判斷是否為完美雜湊函數,檢查指定鍵集合中是否存在兩個不同鍵 k1k_1、k2k_2,使得 h(k1)=h(k2)h(k_1)=h(k_2)。若沒有碰撞,即符合完美雜湊的條件。此性質是針對預先指定的鍵集合成立,不代表對所有可能輸入都沒有碰撞。

解題技巧: 「完美」不表示雜湊表一定最小,也不表示查詢任意未知鍵都不會發生碰撞。只有表格大小也恰為鍵集合大小時,才是「最小完美雜湊」。

(三)霍夫曼編碼(Huffman Coding)

核心觀念: 霍夫曼編碼是依符號出現頻率或機率建立的最佳前綴碼。頻率較高的符號通常取得較短的碼字,頻率較低的符號通常取得較長的碼字;

🔒

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

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

免費註冊

第 二 題30 分

給定一個環狀鏈結串列,節點資料結構宣告如下:

struct node { char info; struct node *next; };

typedef struct node NODE;

請用 C 語言或類似虛擬語言(pseudo code)寫出 void swapnodes(NODE *p) 函式,將兩個指定節點的位置交換。過程中不能更動節點內 info 內容,僅能修改節點內 next 指標,且兩個節點交換後仍保持環狀鏈結串列。

(一) 將指標 pp 後面連續兩個節點的位置交換,如下圖所示。(15 分)

交換節點前:A→B→C→D→EA \rightarrow B \rightarrow C \rightarrow D \rightarrow E

交換節點後:A→B→D→C→EA \rightarrow B \rightarrow D \rightarrow C \rightarrow E

其中,pp 指向節點 AA。

(二) 將指標 pp 前後節點的位置交換,如下圖所示。(15 分)

交換節點前:A→B→C→D→EA \rightarrow B \rightarrow C \rightarrow D \rightarrow E

交換節點後:A→D→C→B→EA \rightarrow D \rightarrow C \rightarrow B \rightarrow E

其中,pp 指向節點 CC。

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

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

這一題的完整詳解

核心觀念

本題考單向環狀鏈結串列的指標重接。節點的位置由 next 指標決定,因此交換節點時,只要重新指定相關節點的 next,不必也不能更動 info。

環狀串列沒有 NULL 尾端;最後一個節點的 next 會指回串列中的節點。以下第(一)小題假設環中至少有 3 個不同節點;第(二)小題假設環中至少有 4 個不同節點。

解題方法

(一)交換 p 後面連續兩個節點

令 b = p->next、c = b->next、d = c->next。原本的連結是:

p→b→c→dp \to b \to c \to d

交換 b、c 的位置後,改接成:

p→c→b→dp \to c \to b \to d

void swapnodes(NODE *p)
{
 if (p == NULL)
 return;

 NODE *b = p->next;
 NODE *c = b->next;
 NODE *d = c->next;

 /* 確保 p、b、c 是不同節點 */
 if (b == p || c == p || b == c)
 return;

 p->next = c;
 c->next = b;
 b->next = d;
}

本題圖中 p 指向 A,因此 b 是 B、c 是 C、d 是 D。重接後為 A → B → D → C → E;環狀串列的最後一個節點仍照原本的 next 指標接回環中。

(二)交換 p 前後的節點

令 b 為 p 的前一個節點,d = p->next 為 p 的後一個節點。由於是單向串列,無法直接沿 next 找前一個節點;先從環中尋找 a,使得 a->next->next == p。如此 a->next 就是 b。

再令 e = d->next。原本的連結是:

🔒

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

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

免費註冊

第 三 題20 分

二維平面空間內包含資料節點,編號為 1 到 11。依編號由小到大加入此二維平面空間。

節點 1 加入時,將空間分割為左右兩個二維空間。之後每加入一資料節點時,若包覆此節點的二維空間為前次分割為上下空間,則此次分割為左右空間;反之,則此次分割為上下空間。

原卷附有空間分割示意圖及其對應的二元樹:左圖顯示加入 6 個資料節點後之空間分割結果,右圖顯示對應的二元樹。圖中包含資料節點 1 至 11,以及對應二元樹節點 1 至 6。

若繼續加入節點 7 到 11,請回答下列問題:

(一) 此二維空間平面分割結果將為何?(10 分)

(二) 對應的二元樹將為何?(10 分)

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

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

這一題的完整詳解

核心觀念

本題考的是二維 KD-tree(k-d 樹)。每個資料節點都在其所在的區域內新增一條分割線,方向依序交替:

  • 前次分割左右空間(垂直線),本次分割上下空間(水平線)。
  • 前次分割上下空間(水平線),本次分割左右空間(垂直線)。

二元樹的左右子樹依分割軸的座標大小決定:垂直線左側進左子樹、右側進右子樹;水平線下側進左子樹、上側進右子樹。圖中的節點 3 位於節點 2 水平分割線下方,且是節點 2 的左子節點,可確認水平分割時下側對應左子樹。

解題方法

沿著二元樹逐層比較新節點與各分割節點的位置,直到找到該節點所屬的空區域;再依該區域的分割方向規則,決定新節點要畫出的分割線。

  1. 節點 7:先在節點 1 的左側,再位於節點 2 分割線下方,接著在節點 3 垂直線右側,到達節點 6 所在區域。節點 6 分割上下空間,節點 7 位於分割線上方,因此是節點 6 的右子節點。節點 7 新增垂直分割線。
  2. 節點 8:沿相同路徑到節點 6,位於節點 6 水平分割線上方,進入節點 7 的區域;又位於節點 7 垂直線右側,因此是節點 7 的右子節點。節點 8 新增水平分割線。
  3. 節點 9:位於節點 1 右側,進入節點 5 的區域;又在節點 5 水平分割線上方,因此是節點 5 的右子節點。節點 9 新增垂直分割線。
  4. 節點 10:位於節點 1 左側,進入節點 2 的區域;又在節點 2 水平分割線上方,因此是節點 2 的右子節點。節點 10 新增垂直分割線。
  5. 節點 11:位於節點 1 右側,進入節點 5 的區域;
🔒

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

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

免費註冊

第 四 題30 分

給予如下之加權雙向圖,邊上的加權值表示此邊的成本。

圖中節點為 aa、bb、cc、dd、ee、ff,各邊及其成本如下:

  • a−ba-b:66
  • a−ca-c:77
  • a−da-d:99
  • b−cb-c:44
  • b−db-d:55
  • c−dc-d:22
  • c−ec-e:33
  • d−fd-f:1010
  • e−fe-f:88

(一) 使用 Kruskal’s algorithm 找最小成本擴張樹(Minimal Cost Spanning Tree, MST)。執行過程中,將邊(edge)逐步加入此 MST 的順序為何?請以邊所對應的兩端節點表示此邊。(5 分)

(二) 使用 Prim’s algorithm 找出最小成本擴張樹(MST),從節點 aa 出發。執行過程中,將邊(edge)逐步加入此 MST 的順序為何?請以邊所對應的兩端節點表示此邊。(5 分)

(三) 使用 Dijkstra’s algorithm 找出從節點 aa(來源節點)到其五個節點(目的節點)之最短路徑(shortest path)。執行過程中,逐步找出最短路徑的目的節點順序為何?從節點 aa 到目的節點之最短路徑被找出,表示演算法不再檢視此目的節點之其他可能最短路徑。(10 分)

(四) 來源節點 aa 出發到其他五個目的節點之最短路徑走法與成本分別為何?(10 分)

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

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

這一題的完整詳解

核心觀念

本題考查最小成本擴張樹與單一起點最短路徑:

  • Kruskal 演算法:依邊權重由小到大檢查,若加入該邊不會形成環,就將它加入擴張樹。
  • Prim 演算法:從指定起點開始,每次選擇連接已納入節點與未納入節點、且權重最小的邊。
  • Dijkstra 演算法:每次確定目前暫定距離最小的未處理節點,再用該節點更新鄰點距離。

依原頁圖形,實際邊權重為:

ab=6, ac=7, bc=9, be=4, bd=5, ce=3, de=2, ef=8, df=10ab=6,\ ac=7,\ bc=9,\ be=4,\ bd=5,\ ce=3,\ de=2,\ ef=8,\ df=10

題目文字列出的邊與原頁圖形不一致;以下依題目要求,以原頁圖形為準作答。

解題方法

(一)Kruskal 演算法

將邊依權重由小到大排列:

de(2), ce(3), be(4), bd(5), ab(6), ac(7), ef(8), bc(9), df(10)de(2),\ ce(3),\ be(4),\ bd(5),\ ab(6),\ ac(7),\ ef(8),\ bc(9),\ df(10)

依序檢查:

  1. 加入 dede,連接 d,ed,e。
  2. 加入 cece,將 cc 接入。
  3. 加入 bebe,將 bb 接入。
  4. bdbd 會形成環,略過。
  5. 加入 abab,將 aa 接入。
  6. acac 會形成環,略過。
  7. 加入 efef,將 ff 接入。六個節點已連通,共有五條邊,完成 MST。

加入 MST 的邊順序:

de, ce, be, ab, efde,\ ce,\ be,\ ab,\ ef

總成本為 2+3+4+6+8=232+3+4+6+8=23。

(二)Prim 演算法,從 aa 出發

每次從已納入的節點集合,挑選通往集合外節點且權重最小的邊:

  1. 從 aa 出發,候選邊為 ab(6),ac(7)ab(6), ac(7),加入 abab。
  2. 已納入 {a,b}\{a,b\},最小候選邊為 be(4)be(4),加入 bebe。
  3. 已納入 {a,b,e}\{a,b,e\},最小候選邊為 de(2)de(2),加入 dede。
  4. 已納入 {a,b,d,e}\{a,b,d,e\},最小候選邊為 ec(3)ec(3),加入 ecec。
  5. 尚未納入的節點只剩 ff,加入 ef(8)ef(8)。

加入 MST 的邊順序:

ab, be, de, ec, efab,\ be,\ de,\ ec,\ ef

總成本同為 2323。

(三)Dijkstra 演算法的目的節點順序

以 aa 為來源,初始暫定距離為:

d(a)=0,d(b)=6,d(c)=7d(a)=0,\quad d(b)=6,\quad d(c)=7

其餘節點距離為無限大。

  1. 確定 bb,距離為 66。更新 d(d)=6+5=11d(d)=6+5=11、d(e)=6+4=10d(e)=6+4=10。
  2. 確定 cc,距離為 77。
🔒

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

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

免費註冊

其他考古題