動態規劃(Dynamic Programming)— 方法論完整教材
既有教材把動態規劃嵌在個別問題裡:0/1 背包、子集和、編輯距離、漢彌爾頓路徑的狀態壓縮。本篇把「怎麼設計一題 DP」抽成可遷移的方法:狀態、轉移、順序、還原方案。讀完再回去看那些專題,會知道它們只是同一套骨架的不同填法。
阅读文章 →模糊搜尋(Fuzzy Search / Approximate String Matching)— 完整教材
從「字串距離」到「近似匹配演算法」與「索引結構」,一份內含 9 個手動推演例子、完整可編譯 C++ 程式碼的中階教材。
阅读文章 →圖論演算法完整教材
「圖」(Graph)是電腦科學中最具表達力的資料結構之一。任何牽涉到「物件」與「物件之間關係」的問題,幾乎都能用圖來建模:社群網路的朋友關係、地圖上的道路、網頁之間的超連結、程式的相依性、晶片上的線路、金融交易的金流、分子的原子鍵結……。一旦把問題抽象成圖,我們就能套用一整套成熟、強大且效率經過嚴格證明的演算法來求解。
阅读文章 →貪心演算法(Greedy Algorithms)— 方法論完整教材
貪心每次做當下看起來最好的選擇,並且不再反悔。它比動態規劃快,也比動態規劃容易寫錯:很多問題「看起來能貪」其實不能。本篇用交換論證說明什麼時候貪心是對的,並把活動選擇、分數背包、霍夫曼編碼做成可手算的完整例子。
阅读文章 →Hash 演算法 — 完整教材(概念到應用)
本教材依「資料結構用的 Hash」與「密碼學用的 Hash」兩條主線編排,並對應 Hash/cpp/ 內的 C++ 範例程式。
阅读文章 →堆積與優先佇列(Binary Heap / Priority Queue)— 完整教材
本篇補上既有排序教材裡「堆積排序」只有程式、沒有資料結構本身的缺口。讀完應能獨立實作二元堆積、說明 build-heap 為什麼是線性時間,並知道 Dijkstra、Prim、Top-K 為什麼都站在優先佇列上。
阅读文章 →KMP (Knuth-Morris-Pratt) 字串匹配演算法 — 完整教學
字串匹配問題(String Matching / Pattern Search):
阅读文章 →Knuth–Morris–Pratt (KMP) 字串匹配演算法 — 完整教材
適用對象:演算法初學者到中階;含完整理論、6 個手動推演例子、可編譯的 C++ 程式碼,以及進階應用。
阅读文章 →KMP 與 LPS 演算法 — 完整教學(含多範例逐步推導)
本教材把 LPS(Longest Proper Prefix–Suffix) 與 KMP(Knuth–Morris–Pratt) 當成兩個獨立但相依的主題。 > LPS 不只是 KMP 的副產物,它本身就是一個強大的字串工具;KMP 則是 LPS 最有名的應用之一。
阅读文章 →數論演算法(GCD、擴展歐幾里得、模反元素、快速冪)— 完整教材
分析教材把歐幾里得演算法與快速冪當成 (O(log n)) 的例子,沒有把它們接成「模意義下的除法」。競賽與密碼學導論裡,這四個是同一條鏈:gcd 判斷互質,擴展版求出係數,係數就是模反元素,快速冪用來算大指數。本篇只做到正確計算與複雜度,不討論如何攻擊實際系統。
阅读文章 →順序統計與快速選擇(Quickselect)— 完整教材
排序教材在最後說:只要第 (k) 小的元素時,不必把整個陣列排完。本篇把這件事做成演算法。平均線性時間的快速選擇足夠日常使用;最壞線性時間的中位數的中位數用來說明「最壞 (O(n)) 做得到」,實作較少逐行抄它。
阅读文章 →前綴和、差分與雙指標 — 完整教材
很多「區間加總」與「有序陣列上的配對」不需要線段樹,也不需要二元搜尋。前綴和把重複的區間加總收成一次相減,差分把區間修改收成兩個端點,雙指標把有序陣列上的 (O(n^2)) 配對收成 (O(n))。三者都是後面 DP、線段樹與二分答案的前置工具,本站原先散落在各篇裡,沒有放在一起。
阅读文章 →遞迴 (Recursion) — 完整教學
遞迴 (Recursion) 是指一個函式直接或間接地呼叫自己的程式技巧。
阅读文章 →線段樹與樹狀陣列(Segment Tree / Fenwick Tree)— 完整教材
前綴和能算靜態區間和,改一個元素就要重建。堆積只會取極值,不會做「區間和」。線段樹與樹狀陣列補上的是:陣列會改,又要很快問區間。NTUCPC 這類大綱把兩者放在基礎資料結構的後段;本站先前沒有獨立教材。
阅读文章 →排序演算法全集(C++17)
每個檔案都是獨立、可編譯執行的示範程式,內含:原理註解、複雜度分析、 穩定性說明、多組測試(含空陣列、單元素、已排序、反向、重複元素等邊界情況)。
阅读文章 →排序演算法 — 教材(含 C++ 範例)
排序問題: 給定長度為 (n) 的序列,將元素依鍵值(通常為數值)遞增(或遞減)排列。
阅读文章 →Splay Tree(伸展樹)演算法完整教學
Splay Tree(伸展樹) 由 Daniel Sleator 與 Robert Tarjan 在 1985 年提出,是一種自我調整的二元搜尋樹(Self-adjusting BST)。
阅读文章 →堆疊、佇列與鏈結串列 — 完整教材
本資料夾裡已有 singly_linked_list.cpp、stack_array.cpp、queue_array.cpp、deque_array.cpp 等可編譯實作,README 也列了操作清單。缺的是「為什麼是這兩種順序、複雜度怎麼來、用錯會怎樣」。圖的 BFS/DFS、回溯、運算式括號,都只是這兩個抽象資料型別。
阅读文章 →第三方支付平台前後端完整教學 — 類 Stripe / PayPal 架構、API 對接與 Webhook
本教材介紹第三方支付平台的全端架構與 API 對接方式,並以類似 Stripe.com、PayPal 的產品型態作為參考。 > 內容涵蓋商戶前端、商戶後端、支付平台、收單銀行、卡組織、Webhook、退款、對帳、安全與錯誤處理。 > > 注意:Stripe、PayPal 的實際 API 會隨版本與地區改變。本文使用教學用 API 形狀說明設計思想,實作時應以官方文件與合約為準。
阅读文章 →Tree、Binary Tree、Balanced Binary Tree — 完整教學
樹 (Tree) 是一種非線性的資料結構,由節點(node)和邊(edge)組成。
阅读文章 →字典樹(Trie)— 完整教材
雜湊表把字串整條折成一個數,查詢是期望 (O(1)) 或 (O(L))((L) 是字串長),但「所有以 ca 開頭的鍵」「最長的符合前綴」要不是掃全表,就是另外建索引。字典樹把這個前綴結構直接做成樹。KMP 教材提到的 Aho–Corasick、模糊搜尋教材裡的 Trie+編輯距離,都從這一棵樹出發。
阅读文章 →練習題完全詳解 不可判定性 · 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 不可判定
阅读文章 →第一部分:選擇題(第 1–10 題,共 50 分)
Cook–Levin 定理(1971/1973)的內容是:SAT 是 NP-complete。也就是說: 它是歷史上第一個被證明為 NP-complete 的問題,也是後續所有 NP-completeness 歸約鏈的起點。
阅读文章 →第一部分:選擇題(第 1–10 題,共 50 分)
本題考三個核心性質的定義。設演算法 A 針對判定問題 X: 課程定義:X 可判定 存在 sound + complete + terminating 的演算法;X 遞迴可枚舉 存在 sound + complete 的演算法(不要求終止),即擁有「半判定程序」。
阅读文章 →