S SmartDocs

演算法與資料結構

排序、樹、雜湊、圖論演算法、KMP、LeetCode 練習與演算法分析教材。

Algorithms 更新於 2026-10-24

動態規劃(Dynamic Programming)— 方法論完整教材

既有教材把動態規劃嵌在個別問題裡:0/1 背包、子集和、編輯距離、漢彌爾頓路徑的狀態壓縮。本篇把「怎麼設計一題 DP」抽成可遷移的方法:狀態、轉移、順序、還原方案。讀完再回去看那些專題,會知道它們只是同一套骨架的不同填法。

閱讀文章 →
Algorithms 更新於 2026-05-29

模糊搜尋(Fuzzy Search / Approximate String Matching)— 完整教材

從「字串距離」到「近似匹配演算法」與「索引結構」,一份內含 9 個手動推演例子、完整可編譯 C++ 程式碼的中階教材。

閱讀文章 →
Algorithms 更新於 2026-06-21

圖論演算法完整教材

「圖」(Graph)是電腦科學中最具表達力的資料結構之一。任何牽涉到「物件」與「物件之間關係」的問題,幾乎都能用圖來建模:社群網路的朋友關係、地圖上的道路、網頁之間的超連結、程式的相依性、晶片上的線路、金融交易的金流、分子的原子鍵結……。一旦把問題抽象成圖,我們就能套用一整套成熟、強大且效率經過嚴格證明的演算法來求解。

閱讀文章 →
Algorithms 更新於 2026-10-24

貪心演算法(Greedy Algorithms)— 方法論完整教材

貪心每次做當下看起來最好的選擇,並且不再反悔。它比動態規劃快,也比動態規劃容易寫錯:很多問題「看起來能貪」其實不能。本篇用交換論證說明什麼時候貪心是對的,並把活動選擇、分數背包、霍夫曼編碼做成可手算的完整例子。

閱讀文章 →
Algorithms 更新於 2026-04-19

Hash 演算法 — 完整教材(概念到應用)

本教材依「資料結構用的 Hash」與「密碼學用的 Hash」兩條主線編排,並對應 Hash/cpp/ 內的 C++ 範例程式。

閱讀文章 →
Algorithms 更新於 2026-10-24

堆積與優先佇列(Binary Heap / Priority Queue)— 完整教材

本篇補上既有排序教材裡「堆積排序」只有程式、沒有資料結構本身的缺口。讀完應能獨立實作二元堆積、說明 build-heap 為什麼是線性時間,並知道 Dijkstra、Prim、Top-K 為什麼都站在優先佇列上。

閱讀文章 →
Algorithms 更新於 2026-03-06

KMP (Knuth-Morris-Pratt) 字串匹配演算法 — 完整教學

字串匹配問題(String Matching / Pattern Search):

閱讀文章 →
Algorithms 更新於 2026-05-24

Knuth–Morris–Pratt (KMP) 字串匹配演算法 — 完整教材

適用對象:演算法初學者到中階;含完整理論、6 個手動推演例子、可編譯的 C++ 程式碼,以及進階應用。

閱讀文章 →
Algorithms 更新於 2026-04-26

KMP 與 LPS 演算法 — 完整教學(含多範例逐步推導)

本教材把 LPS(Longest Proper Prefix–Suffix) 與 KMP(Knuth–Morris–Pratt) 當成兩個獨立但相依的主題。 > LPS 不只是 KMP 的副產物,它本身就是一個強大的字串工具;KMP 則是 LPS 最有名的應用之一。

閱讀文章 →
Algorithms 更新於 2026-10-24

數論演算法(GCD、擴展歐幾里得、模反元素、快速冪)— 完整教材

分析教材把歐幾里得演算法與快速冪當成 (O(log n)) 的例子,沒有把它們接成「模意義下的除法」。競賽與密碼學導論裡,這四個是同一條鏈:gcd 判斷互質,擴展版求出係數,係數就是模反元素,快速冪用來算大指數。本篇只做到正確計算與複雜度,不討論如何攻擊實際系統。

閱讀文章 →
Algorithms 更新於 2026-10-24

順序統計與快速選擇(Quickselect)— 完整教材

排序教材在最後說:只要第 (k) 小的元素時,不必把整個陣列排完。本篇把這件事做成演算法。平均線性時間的快速選擇足夠日常使用;最壞線性時間的中位數的中位數用來說明「最壞 (O(n)) 做得到」,實作較少逐行抄它。

閱讀文章 →
Algorithms 更新於 2026-10-24

前綴和、差分與雙指標 — 完整教材

很多「區間加總」與「有序陣列上的配對」不需要線段樹,也不需要二元搜尋。前綴和把重複的區間加總收成一次相減,差分把區間修改收成兩個端點,雙指標把有序陣列上的 (O(n^2)) 配對收成 (O(n))。三者都是後面 DP、線段樹與二分答案的前置工具,本站原先散落在各篇裡,沒有放在一起。

閱讀文章 →
Algorithms 更新於 2026-03-28

遞迴 (Recursion) — 完整教學

遞迴 (Recursion) 是指一個函式直接或間接地呼叫自己的程式技巧。

閱讀文章 →
Algorithms 更新於 2026-10-24

線段樹與樹狀陣列(Segment Tree / Fenwick Tree)— 完整教材

前綴和能算靜態區間和,改一個元素就要重建。堆積只會取極值,不會做「區間和」。線段樹與樹狀陣列補上的是:陣列會改,又要很快問區間。NTUCPC 這類大綱把兩者放在基礎資料結構的後段;本站先前沒有獨立教材。

閱讀文章 →
Algorithms 更新於 2026-07-03

排序演算法全集(C++17)

每個檔案都是獨立、可編譯執行的示範程式,內含:原理註解、複雜度分析、 穩定性說明、多組測試(含空陣列、單元素、已排序、反向、重複元素等邊界情況)。

閱讀文章 →
Algorithms 更新於 2026-10-24

排序演算法 — 教材(含 C++ 範例)

排序問題: 給定長度為 (n) 的序列,將元素依鍵值(通常為數值)遞增(或遞減)排列。

閱讀文章 →
Algorithms 更新於 2026-04-26

Splay Tree(伸展樹)演算法完整教學

Splay Tree(伸展樹) 由 Daniel Sleator 與 Robert Tarjan 在 1985 年提出,是一種自我調整的二元搜尋樹(Self-adjusting BST)。

閱讀文章 →
Algorithms 更新於 2026-10-24

堆疊、佇列與鏈結串列 — 完整教材

本資料夾裡已有 singly_linked_list.cpp、stack_array.cpp、queue_array.cpp、deque_array.cpp 等可編譯實作,README 也列了操作清單。缺的是「為什麼是這兩種順序、複雜度怎麼來、用錯會怎樣」。圖的 BFS/DFS、回溯、運算式括號,都只是這兩個抽象資料型別。

閱讀文章 →
Algorithms 更新於 2026-04-26

第三方支付平台前後端完整教學 — 類 Stripe / PayPal 架構、API 對接與 Webhook

本教材介紹第三方支付平台的全端架構與 API 對接方式,並以類似 Stripe.com、PayPal 的產品型態作為參考。 > 內容涵蓋商戶前端、商戶後端、支付平台、收單銀行、卡組織、Webhook、退款、對帳、安全與錯誤處理。 > > 注意:Stripe、PayPal 的實際 API 會隨版本與地區改變。本文使用教學用 API 形狀說明設計思想,實作時應以官方文件與合約為準。

閱讀文章 →
Algorithms 更新於 2026-10-24

Tree、Binary Tree、Balanced Binary Tree — 完整教學

樹 (Tree) 是一種非線性的資料結構,由節點(node)和邊(edge)組成。

閱讀文章 →
Algorithms 更新於 2026-10-24

字典樹(Trie)— 完整教材

雜湊表把字串整條折成一個數,查詢是期望 (O(1)) 或 (O(L))((L) 是字串長),但「所有以 ca 開頭的鍵」「最長的符合前綴」要不是掃全表,就是另外建索引。字典樹把這個前綴結構直接做成樹。KMP 教材提到的 Aho–Corasick、模糊搜尋教材裡的 Trie+編輯距離,都從這一棵樹出發。

閱讀文章 →
Automata 更新於 2026-07-15

練習題完全詳解 不可判定性 · NP 完備 · DPLL · 2SAT · 機率圖靈機 · 單純形法 · TSP 5CCS2FC2 Foundations of Computing II — 測驗題逐題解析

(A) L 是 NP-hard: 。NP-hard 的意思是「至少跟 NP 裡的每一個問題一樣難」。NP 裡的每個問題都是可判定的(頂多用指數時間暴力搜尋所有證書即可判定);而 L 連「可判定」都做不到,也就是說任何 NP 問題若能解,也遠遠碰不到 L 的難度天花板——L 嚴格難於 NP 中的一切問題,因此是 NP-hard。反過來想更清楚:如果 L 竟然「不比某個 NP 問題難」,那 L 的難度就被一個可判定問題罩住,與 L 不可判定

閱讀文章 →
Automata 更新於 2026-07-23

第一部分:選擇題(第 1–10 題,共 50 分)

Cook–Levin 定理(1971/1973)的內容是:SAT 是 NP-complete。也就是說: 它是歷史上第一個被證明為 NP-complete 的問題,也是後續所有 NP-completeness 歸約鏈的起點。

閱讀文章 →
Automata 更新於 2026-07-23

第一部分:選擇題(第 1–10 題,共 50 分)

本題考三個核心性質的定義。設演算法 A 針對判定問題 X: 課程定義:X 可判定 存在 sound + complete + terminating 的演算法;X 遞迴可枚舉 存在 sound + complete 的演算法(不要求終止),即擁有「半判定程序」。

閱讀文章 →