111 地方特考三等 資訊處理 資料結構 考古題詳解
第 一 題
請用 Big-O 符號來表示下列函式的成長速率,並說明之:
(一) 。(5 分)
(二) 。(10 分)
登入後即可作答並保存紀錄。
核心觀念
- 大 O 符號(Big-O Notation)定義: 若存在正實數常數 與正整數 ,使得對所有 ,均滿足 ,則記為 ,表示 為 的漸近上限(Asymptotic Upper Bound)。
- 基本函數成長速率階層(Growth Rate Hierarchy): 當 時,常見函數之成長速率階層為:
- 多項式項之漸近支配原則(Dominance Rule): 若函數為多個項之和,其漸近成長速率取決於成長最快的「最高次方項(支配項,Dominant Term)」,低階項與常數係數在漸近分析中皆可忽略。
解題方法
本題給定之函數包含三項相加:
- 常數項:
- 根號項:
- 對數項:
步驟一:比較各項之成長速率
-
比較 與常數項 : 因此 成長速率遠大於常數項。
-
比較 與 : 利用羅必達法則(L'Hôpital's Rule)求極限(對分子分母分別對 微分): 極限值為 ,證明 的成長速率嚴格大於 。
步驟二:確定支配項並給出漸近上限 在各項中, 為成長最快的支配項。 當 時,恆有 且 ,因此: 選取常數 、,滿足大 O 定義 。
故其成長速率為 。
解題技巧
- 速判竅門:將所有含 的項改寫為指數次方形式。,而任何正次方多項式 (即使 )在 時均遠大於對數函數 。因此一眼即可鎖定 為支配項。
- 常見陷阱:部分考生誤以為 比 大,或將兩者混淆為同階。切記「多項式勝過對數(Polynomial beats Logarithm)」。
【答案】
第二小題:
核心觀念
- 分治法遞迴關係式(Divide-and-Conquer Recurrence): 形式為 ,其中 表示子問題數量, 表示每次切割縮小之倍率, 為分割與合併子問題的成本。
第 二 題
常用的算術運算式(Arithmetic Expression)有中序運算式(Infix Expression)、前序運算式(Prefix Expression)及後序運算式(Postfix Expression)三種表示法。考慮下列算術運算式:
請回答下列問題:
(一) 請寫出其前序運算式(Prefix Expression)。(5 分)
(二) 請繪出其算術運算樹(Expression Tree)。(5 分)
(三) 請說明如何以此算術運算樹計算出算術運算式的值,並一步一步列出運算過程。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題評量**二元樹(Binary Tree)**於算術運算式的應用,核心觀念包含:
- 算術運算式的三種表示法:
- 中序運算式(Infix Expression):運算子置於兩運算元中間,如 。人類易讀,但需依賴括號與運算子優先順序。
- 前序運算式(Prefix Expression,波蘭表示法):運算子置於兩運算元之前,如 。不需括號即可唯一確定運算順序。
- 後序運算式(Postfix Expression,逆波蘭表示法):運算子置於兩運算元之後,如 。
- 算術運算樹(Expression Tree)的結構特性:
- 為一棵嚴格二元樹(Strict Binary Tree)。
- 葉節點(Leaf Nodes):皆為運算元(Operands,數值)。
- 內部節點(Internal Nodes):皆為運算子(Operators,如 )。
- 樹走訪(Tree Traversal)與運算式之對應關係:
- 前序走訪(Preorder: V-L-R) 產生前序運算式。
- 中序走訪(Inorder: L-V-R) 產生中序運算式(配合括號還原優先權)。
- 後序走訪(Postorder: L-R-V) 產生後序運算式,且為運算樹求值(Evaluation)的自然順序。
解題方法
題目給定之中序算術運算式為:
(一) 前序運算式(Prefix Expression)推導
利用括號化法(Fully Parenthesized Method)或直接由運算子優先權進行由外而內的轉換:
- 最外層主運算子為中央的 :
- 轉換左子運算式 :
- 主運算子為 :
- 轉換 :
- 轉換 :
- 左子運算式前序為:
- 轉換右子運算式 :
- 主運算子為 :
- 轉換 :
- 轉換 :
- 右子運算式前序為:
- 合併全式:
(二) 繪製算術運算樹(Expression Tree)
依據運算式之結合順序與階層關係,自頂向下建立二元運算樹:
- 根節點為最外層乘號 。
- 左子樹代表 。
- 右子樹代表 。
算術運算樹之結構圖如下:
[ × ] (根節點)
/ \
/ \
[ - ] [ + ]
/ \ / \
[ × ] [ + ] [ / ] [ × ]
/ \ / \ / \ / \
(6) [-] (1) (2)[+] (3)(5) (4)
/ \ / \
(5) (3) (4) (2)
節點階層關係說明:
- 根節點為 ,其左子節點為 ,右子節點為 。
- 左子樹節點 :
- 左子節點為 (其左子節點為 ,右子節點為 ,此 之子節點為 與 )。
- 右子節點為 (其子節點為 與 )。
- 右子樹節點 :
- 左子節點為 (其左子節點為 ,此 之子節點為 與 ;右子節點為 )。
- 右子節點為 (其子節點為 與 )。
(三) 運算樹求值原理與步驟
第 三 題
回顧二元樹結構,其為 路樹(-ary Trees,亦稱多元樹、 元樹)的一個特例,請回答下列相關問題:
(一) 給出 路樹的定義。(5 分)
(二) 若用陣列來表示一個 路樹,請說明如何利用陣列的索引值來表示節點間的親子連結關係。意即,假設陣列索引起始值為 ,若節點 在陣列的第 個位置,節點 的第 個子節點的位置為何?另一方面,節點 的 parent 位置為何?(10 分)
(三) 基於此 路樹結構及二元搜尋樹(Binary Search Tree)的概念,我們可以定義出一個多元搜尋樹。當 的時候,可以稱此搜尋樹為四元搜尋樹。請給出 -樹(-tree)的定義,並比較與四元搜尋樹的差異。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題評量多元樹(-ary Tree)的基礎理論、陣列循序儲存表示法,以及自平衡多元搜尋樹的進階結構。核心涵蓋:
- 路樹(-ary Tree)的結構定義:以遞迴方式定義空樹或由根節點與最多 棵互斥之 路子樹所組成之有序樹(Ordered Tree)。
- 完全 路樹(Complete -ary Tree)的陣列索引對映:利用階層順序(Level-order)循序存放於陣列中,推導「0 起始索引(0-based indexing)」下父節點與子節點之整數映射公式。
- 多元搜尋樹(Multi-way Search Tree)與 -樹(-Tree):
- 四元搜尋樹(4-ary Search Tree)的鍵值(Keys)排列與子樹區間劃分規則。
- -樹(亦稱 2-3-4 樹,為階數為 4 之 B-樹)的大小性質(Size Property)與深度平衡性質(Depth Property)。
解題方法與推導
(一) 路樹的定義
路樹(-ary Tree)為一種有限節點的集合 ,其遞迴定義如下:
- 基底情況(Base Case): 可以為空集合(Empty tree)。
- 遞迴情況(Recursive Step): 由一個稱為根節點(Root)的節點,以及 個互斥的子集合 所組成。其中每個子集合 ()本身亦為一棵 路樹,稱為根節點的第 個子樹(Subtree)。
重要性質:
- 樹中任意節點的分支度(Degree,即擁有子節點的個數)至多為 ()。
- 各子樹之間具有嚴格的順序關係(即 Ordered Tree),不可任意對調。當 時,即為二元樹(Binary Tree)。
(二) 陣列表示法之親子節點索引推導
當使用陣列以階層順序(Level-order)表示完全 路樹(Complete -ary Tree),且陣列起始索引為 (根節點位於索引 )時:
1. 第 個子節點的位置推導
- 根節點(索引 )之前有 個節點,其子節點依序排列於陣列索引 。
- 若節點 位於索引 ,代表在節點 之前(包括其祖先與同一層左側節點)共有 個節點。
- 根據完全樹的排滿規則,這 個節點共產生 個子節點,再加上根節點本身(佔用索引 ),因此節點 的第一個子節點起始位置必為:
- 子節點編號 之定義可採兩種常規慣例:
- 慣例 A(子節點編號以 起算,即 ): 節點 的第 個子節點索引為:
- 慣例 B(子節點編號以 起算,即 ): 節點 的第 個子節點索引為:
2. 父節點(Parent)的位置推導
- 設某非根節點位於陣列索引 (),其父節點索引為 。
- 根據子節點公式,該節點必為父節點 的某個子節點:
- 將等式兩邊同時減去 :
- 兩邊同除以 並取下高斯符號(Floor,即無條件捨去):
- 因此,對於任意非根節點 (索引 ),其父節點索引固定為:
(三) -樹的定義與四元搜尋樹之差異
1. 四元搜尋樹(4-ary Search Tree)的定義
四元搜尋樹為二元搜尋樹在 時的推廣,滿足:
- 每個內部節點至多包含 個子節點,以及至多 個搜尋鍵值(Keys)。
- 若節點包含 個子節點(),則該節點包含 個鍵值 ,將數值範圍劃分為 個區間。
第 四 題
二元堆積(Binary Heap)是一種優先佇列(Priority Queue),主要用來管理具有優先權順序的資料物件。每個資料物件具有一個可以界定大小或前後順序的鍵值(Key),我們在此假設鍵值越低的資料物件有越高的優先權。
(一) 請完整描述最小堆積(Min-Heap)的定義與相關的操作功能。(5 分)
(二) 請說明堆積排序(Heap Sort)的方法並分析其時間複雜度。(5 分)
(三) 若有兩個二元樹 及 ,其節點具有堆積特性且高度分別是 與 ,請提供一個方法將此兩個二元樹結合成為一個節點具有堆積特性的二元樹 。此方法的時間須為 。(10 分)
登入後即可作答並保存紀錄。
核心觀念
- 二元堆積(Binary Heap)與最小堆積性質(Min-Heap Property):
- 結構性(Structural Property):二元堆積在本質上是一棵「完全二元樹(Complete Binary Tree)」,除底層外每一層皆被填滿,且底層節點由左至右緊密排列。
- 順序性(Heap-Order Property):最小堆積規定對於任一非根節點 ,其父節點鍵值小於或等於該節點鍵值,即 ;因此全樹之最小值必儲存於樹根(Root)。
- 堆積排序(Heap Sort):
- 採「由底向上建堆(Bottom-up Heapify)」與「連續萃取樹根(Extract)」兩階段進行。
- 建堆時間為 ,每次萃取並維護堆積耗時 ,排序 次耗時 ,總時間複雜度為 ,且為原處排序(In-place Sorting,空間複雜度 )。
- 具堆積特性之二元樹合併(Merging Heaps via Sift-Down):
- 題目指定為具堆積特性且高度為對數級別的二元樹(非強制要求維持完全二元樹之陣列連續性)。
- 可利用「取一葉節點作為新樹根、原二樹為左右子樹」,再針對新樹根進行一次「下濾(Sift-Down / Heapify-Down)」調整,於樹高深度 內完成合併。
解題方法
(一) 最小堆積(Min-Heap)的定義與相關操作功能
- 完整定義: 最小堆積為滿足以下兩項特性的二元樹:
- 完全二元樹(Complete Binary Tree):設樹高為 ,第 層至第 層的節點數均達到最大容量;第 層(最底層)的所有葉節點由左至右依序填入,無間隙。
- 最小堆積序性(Min-Heap Order):除樹根外,樹中任意節點 均滿足 。換言之,任意子樹的根節點鍵值必小於或等於其左、右子節點之鍵值,樹根保證為整棵樹的最小值。
- 相關操作功能:
Find-Min(查詢最小值): 直接回傳樹根節點之鍵值。 時間複雜度:。Insert(x)(插入節點): 將新元素放入完全二元樹最底層由左至右的第一個空位(即最後一個節點的下一個位置),隨後執行「上濾(Sift-Up / Percolate-Up)」:將新節點與其父節點比較,若新節點鍵值較小則互換,重複此步驟直至滿足堆積序性或抵達樹根。 時間複雜度:( 為節點數)。Extract-Min/Delete-Min(刪除最小值): 取出樹根節點,將最底層最後一個葉節點搬移至樹根位置,隨後執行「下濾(Sift-Down / Percolate-Down)」:將該節點與其左、右子節點中鍵值較小者比較,若其鍵值較大則互換,重複向下推移直至滿足堆積序性或成為葉節點。 時間複雜度:。Build-Heap(建構堆積): 給定包含 個未排序元素的陣列,由最後一個非葉節點(索引 )由後往前至根節點,對每一節點依序呼叫下濾調整。 時間複雜度:。
(二) 堆積排序(Heap Sort)的方法並分析其時間複雜度
- 方法說明(以遞增排序為例,採用最大堆積 Max-Heap):
- 步驟一:建構堆積(Build-Heap) 將大小為 的未排序輸入陣列視為一棵完全二元樹,由最後一個非葉節點 開始往第 個節點逆序遍歷,對每一節點執行下濾(Max-Heapify),建立最大堆積(樹根為全域最大值)。
- 步驟二:排序與萃取(Sorting Phase) 重複以下動作共 回合:
-
將樹根(陣列首項,即未排序區域之最大值)與目前堆積之最後一個葉節點(未排序區域末項)交換,使最大值歸位至最終位置。
-
將堆積有效大小減 (將歸位的最大值排除於堆積之外)。
-
對新的樹根執行下濾(Max-Heapify),重新維護其最大堆積性質。 當所有元素處理完畢,陣列即完成遞增排序。
-
時間複雜度分析:
- 建構堆積階段: 設樹高為 。高度為 的層級最多有 個節點,且高度為 的節點下濾最多需 次比較與置換。總耗時為:
- 排序與萃取階段: 共進行 次交換與下濾。每次下濾花費時間與當前樹高成正比,最多需 次比較與交換。總耗時為:
- 整體時間複雜度: 堆積排序在最佳、最差與平均情況下,時間複雜度均穩定為 。此外,排序過程直接在輸入陣列上交換,額外空間複雜度為 。
(三) 結合兩棵具堆積特性之二元樹 與 之方法與複雜度分析
第 五 題
下圖是一個加權圖 ,其中 是點集合而 是邊集合。
(原卷圖形未包含於文字層擷取結果,請參考原卷。)
(一) 請使用相鄰矩陣(Adjacency Matrix)表示法來表示加權圖 。(5 分)
(二) 不考慮權重,從節點 開始並按照字母順序對 進行廣度優先尋訪(Breadth-First Search, BFS),請繪出尋訪完後所產生的 BFS 樹(BFS Tree)。(5 分)
(三) 請利用 Prim's 演算法,從節點 起始,找出一個最小擴張樹(Minimum Spanning Tree),請以圖示方式一步步畫出過程與結果,並說明 Prim's 演算法的時間複雜度。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查加權無向圖的相鄰矩陣、廣度優先尋訪(BFS)與最小擴張樹(MST)。
相鄰矩陣以列、欄代表頂點;若兩頂點間有邊,填入邊權重,若無邊則填入 。BFS 不考慮權重,依指定的字母順序探索尚未拜訪的相鄰頂點。Prim 演算法則從指定起點開始,每次選擇一條連接「已納入頂點」與「尚未納入頂點」的最小權重邊。
圖中頂點為 ;無向邊及權重為: 。
(一)加權相鄰矩陣
頂點依字母順序排列為 。主對角線填 ;沒有直接相連的頂點填 。因為圖是無向圖,矩陣對稱。
(二)由 開始的 BFS 樹
忽略邊權重,並按字母順序檢查每個頂點的相鄰點。
- 從 開始;其相鄰點為 ,依序納入佇列。
- 處理 ,發現尚未拜訪的 。
- 處理 ,發現尚未拜訪的 ; 已拜訪,不再加入。
- 處理 時, 已拜訪。其餘頂點也都已發現,尋訪完成。
因此 BFS 樹的邊為 ,可表示為:
g
/ | \
b f h
/ | \ \
a c d i