資料結構與演算法

這個系列記錄資料結構與演算法的學習筆記。每篇筆記包含概念說明、ASCII 視覺化圖解、Java 實作程式碼與時間/空間複雜度分析。


學習路線建議

不知道從哪裡開始?依照以下難度分級,循序漸進學習:

難度說明建議對象
⭐ 入門最基礎的資料結構與演算法,先從這些開始初學者、非本科轉職
⭐⭐ 進階需要入門基礎,面試常考有基礎想加強、準備面試
⭐⭐⭐ 挑戰較複雜的結構與技巧,競程或進階面試才會用到競程選手、資深工程師

⭐ 入門(先學這些):Array、Linked List、Stack、Queue、Hash Table、Linear Search、Sorting basics

⭐⭐ 進階:Tree、Heap、Graph、Binary Search、Dynamic Programming、Recursion、Two Pointers、Sliding Window

⭐⭐⭐ 挑戰:Trie、AVL Tree、Segment Tree、Advanced Graph、Backtracking、String Algorithms、Math Algorithms


資料結構(Data Structures)

基礎資料結構

#主題難度說明
01Array 陣列連續記憶體、隨機存取、動態擴容
02Linked List 鏈結串列單向/雙向、插入刪除 O(1)、指標操作
03Stack 堆疊LIFO、括號匹配、運算式求值
04Queue 佇列FIFO、Circular Queue、BFS 應用
05Hash Table 雜湊表雜湊函數、碰撞處理、O(1) 查找
06Tree 樹⭐⭐BST、遍歷方式、前中後序
07Heap 堆積⭐⭐Min/Max Heap、Priority Queue、Heapify
08Graph 圖⭐⭐鄰接表/矩陣、BFS/DFS、有向/無向

進階資料結構

#主題難度說明
09Trie 前綴樹⭐⭐⭐字串搜尋、自動補全、前綴匹配
10AVL Tree 自平衡樹⭐⭐⭐旋轉操作、平衡因子、O(log n) 保證
11Segment Tree 線段樹⭐⭐⭐區間查詢、區間更新、Lazy Propagation
12Fenwick Tree 樹狀陣列⭐⭐⭐前綴和、單點更新、BIT
13Union-Find 並查集⭐⭐⭐路徑壓縮、按秩合併、連通分量
14LRU Cache⭐⭐HashMap + 雙向鏈結串列、O(1) 操作
15Deque 雙端佇列⭐⭐頭尾皆可操作、滑動視窗應用
16Skip List 跳躍表⭐⭐⭐多層索引、機率平衡、Redis 應用
17Bloom Filter 布隆過濾器⭐⭐⭐機率型資料結構、空間效率、誤判率

演算法(Algorithms)

基礎演算法

#主題難度說明
01Searching 搜尋Linear Search、Binary Search
02Sorting 排序Bubble、Selection、Insertion、Merge、Quick Sort
03Dynamic Programming 動態規劃⭐⭐Fibonacci、LCS、背包、Coin Change、LIS
03-2Dynamic Programming 動態規劃(下)⭐⭐六個經典問題
04Recursion 遞迴⭐⭐階乘、費氏數列、河內塔、回溯法
05Graph Algorithms 圖演算法⭐⭐Dijkstra、Bellman-Ford、Floyd-Warshall、拓撲排序
05-2Graph Algorithms 圖演算法(下)⭐⭐拓撲排序與工程應用
06Greedy 貪婪演算法⭐⭐活動選擇、分數背包、Huffman、Kruskal

進階演算法與技巧

#主題難度說明
07String Algorithms 字串演算法⭐⭐⭐KMP、Rabin-Karp、Z Algorithm、Manacher
08Bit Manipulation 位元運算⭐⭐AND/OR/XOR、位元技巧、常見應用
09Two Pointers 雙指標⭐⭐相向指標、同向指標、快慢指標
10Sliding Window 滑動視窗⭐⭐固定/可變視窗、最大/最小子陣列
11More Sorting 進階排序⭐⭐⭐Heap、Counting、Radix、Bucket、Shell Sort
12Advanced Graph 進階圖論⭐⭐⭐Prim、Tarjan SCC、割點橋、二分圖匹配
13Backtracking 回溯法⭐⭐⭐N-Queens、排列組合、子集生成
14Divide and Conquer 分治法⭐⭐合併排序、快速冪、最近點對
15Monotone Stack 單調堆疊⭐⭐⭐下一個更大元素、柱狀圖最大矩形
16Prefix Sum 前綴和⭐⭐一維/二維前綴和、差分陣列
17Math Algorithms 數學演算法⭐⭐⭐GCD、質數篩、快速冪、組合數學

刷題路線與反模式

#主題說明
23LeetCode 刷題路線:從 Easy 到 Hard 的跨主題推進地圖隨機刷 LeetCode 是最沒效率的方式——做了 200 題但面試還是不會
24演算法選型 Anti-patterns:七種讓系統性能崩潰的錯誤選擇演算法選錯不是「性能不夠好」

競程與進階主題(35-63)

#主題說明
35Suffix Array 後綴陣列Suffix Array 把字串所有後綴排序後壓進一個整數陣列
36Computational Geometry 計算幾何基礎從叉積判斷轉向方向開始
37Red-Black Tree 紅黑樹紅黑樹是 Java TreeMap、Linux 排程器、Nginx 計時器的核心——它用「…
38 B+Tree 資料庫索引的核心結構MySQL InnoDB、PostgreSQL、NTFS 都用 B+Tree 做索引——不…
39HyperLogLog 用 1.5 KB 計算十億個不同用戶Google 用 HyperLogLog 計算搜尋獨立用戶數
40Count-Min Sketch & Cuckoo Filter 串流資料的頻率與過濾Cloudflare 用 Count-Min Sketch 做即時 DDoS 偵測
41KD-Tree & R-Tree 空間索引:找最近的那個點Google Maps 找最近的加油站、Uber 媒合最近的司機、遊戲引擎碰撞偵測——這些…
42進階 DP:當狀態不再是一個數字Edit Distance 讓 Google 的拼字修正、Git diff、DNA 比對都…
43網路流:最大流、最小割、二分圖匹配工廠到倉庫最多能運多少貨?航班座位如何分配才能服務最多旅客?這些問題都是網路流——最大流定…
44[[44-rolling-hash|Rolling Hash 滾動雜湊:O(1) 的子字串比較]]找最長公共子字串、判斷兩個子字串是否相同——如果每次都逐字元比較是 O(m)
45隨機化演算法:讓最壞情況消失QuickSort 的最壞情況是 O(n²)
46歐拉路徑:每條邊走且只走一次「一筆畫問題」——能不能不抬筆畫完一個圖形?柯尼斯堡七橋問題讓歐拉在 1736 年發現了圖…
47[[47-meet-in-middle|Meet in the Middle:把 O(2ⁿ) 砍成 O(2^(n/2))]]n=40 的子集和問題
48掃描線:把二維問題拆成一維問題的連續處理n 個矩形重疊的面積、地圖上線段的所有交點、最近點對——這些二維問題直接算是 O(n²)
49莫隊演算法:把亂序查詢變成有序移動q 個區間查詢
50Aho-Corasick 自動機:同時搜尋所有關鍵字敏感詞過濾要同時比對 10 萬個關鍵字——用 KMP 逐個比對是 O(k×n)
51組合博弈論:Nim 遊戲與 Sprague-Grundy 定理兩堆石子
52[[52-fft|FFT 快速傅立葉變換:O(n²) 乘法變 O(n log n)]]兩個大數相乘(比如兩個 100 萬位的數字)直接算是 O(n²)
53[[53-two-sat|2-SAT:O(n) 解布林可滿足性問題]]一般 SAT 是 NP-complete
54[[54-binary-lifting|Binary Lifting:O(log n) 跳祖先、找 LCA]]樹上「往上跳 k 步」暴力需要 O(k)
55[[55-centroid-decomposition|重心分解:O(n log n) 處理所有樹上路徑]]樹上有多少條路徑長度 ≤ k?暴力枚舉所有點對是 O(n²)
56樹鏈剖分 HLD:把樹上路徑轉成線段樹區間樹上路徑的和/最大值查詢
57Tarjan 離線 LCA:一次 DFS 回答所有 LCA 查詢Binary Lifting 是線上 LCA——O(n log n) 預處理
59Treap 與 Splay Tree:不靠嚴格規則的平衡樹AVL/紅黑樹靠嚴格旋轉,這兩條改用隨機與自我調整——好寫又能玩區間操作
60Sparse Table:靜態區間查詢 O(1)資料不會變時,線段樹那個 log 是白付的稅——冪等區間查詢一步到位
61單調佇列:為什麼滑動視窗最大值天生要用它暴力掃每個視窗是 O(nk),單調佇列讓每個元素只進出各一次
62持久化線段樹(主席樹):查得到歷史的每一個版本一般線段樹改一次舊版本就沒了——路徑複製只多 O(log n) 就保留全部版本
63Fibonacci Heap 與 Link-Cut Tree:把攤還成本壓到極致一個把 decrease-key 壓到 O(1),一個在會塌會長的森林上還能查路徑

閱讀建議

  • 入門者:從 ⭐ 入門的文章開始,建立資料結構與演算法的基礎觀念。
  • 面試準備:重點看 ⭐⭐ 進階,特別是 03 動態規劃、09 雙指標、10 滑動視窗、13 回溯法。
  • 競程選手:⭐⭐⭐ 挑戰級的進階資料結構(11-13)和進階圖論(12)是常見考點。
  • 實務開發:05 Hash Table、14 LRU Cache、17 Bloom Filter 在生產系統中最常出現。

此資料夾下有 65 條筆記。