算法与数据结构
复杂度分析与算法设计
- 001入门算法分析基础与学习路线算法分析(Algorithm Analysis)的形式化定义、五类渐近记号(Bachmann 1894《Analytische Zahlentheorie》大 O 符号、Landau 1909《Handbuch》推广、Knuth 1976《Big Omicron and Big Omega and Big Theta》SIGACT News 12(3):36-44 系统化)、计算复杂性类(Hartmanis-Stearns 1965《On the Computational Complexity of Algorithms》Trans. AMS 117:285-306、Cobham 1964/Edmonds 1965 P 类、Cook 1971《The Complexity of Theorem-Proving Procedures》STOC、Karp 1972《Reducibility Among Combinatorial Problems》STOC 197-206)、主定理(Bentley-Haken-Saxe 1980 SIGACT News 12(3):36-44)、摊还分析(Sleator-Tarjan 1985《Amortized Efficiency of List Update and Paging Rules》CACM 28(2):202-208)、随机化分析(Rabin 1976)、时空权衡策略与系统化学习路线图,涵盖 Turing 1936《On Computable Numbers》Proc. LMS 42:230-265、Knuth 1968 TAOCP Vol.1、Cormen-Leiserson-Rivest 1990《Introduction to Algorithms》第 1 版的历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 1-4 章、Kleinberg-Tardos 第 2-5 章、Sedgewick 第 1 章风格习题。
- 002中级排序算法排序(Sorting)算法的形式化定义、比较排序下界 $\Omega(n \log n)$ 的决策树证明、冒泡/选择/插入/希尔/归并/堆排/快排七大经典排序、计数/基数/桶排序三种线性时间非比较排序、内省排序(Musser 1997)与 Timsort(Peters 2002)的工业级混合方案,涵盖 von Neumann 1945 归并、Shell 1959 希尔、Hoare 1961 快排、Williams 1964 堆排、Musser 1997 内省、Peters 2002 Timsort 的历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 2/6/8 章风格习题。
- 003入门栈与队列栈(Stack)与队列(Queue)的形式化定义、LIFO/FIFO 原理、顺序栈/链式栈/循环队列/链式队列/双端队列/单调栈/单调队列的实现与复杂度分析,涵盖 Bauer-Samelson 1955 叠加原理、Dijkstra 1965 信号量、Hoare 1978 CSP 等历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 10 章风格习题。
- 004中级搜索算法搜索(Search)算法的形式化定义、状态空间图模型、完备性与最优性证明、线性搜索 $O(n)$、二分搜索 $O(\log n)$、哈希查找 $O(1)$、BFS/DFS 图搜索 $O(V+E)$、双向 BFS、迭代深化 DFS(IDDFS)、A* 启发式搜索(Hart-Nilsson-Raphael 1968)、IDA* 内存受限搜索(Korf 1985)、Minimax + Alpha-Beta 剪枝博弈树搜索(Shannon 1950、Knuth-Moore 1975)的原理、实现与对比分析,涵盖 Shannon 1950 国际象棋程序、Dijkstra 1959 最短路径、Hart-Nilsson-Raphael 1968 A*、Korf 1985 IDA* 等历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 22 章、Russell-Norvig 第 3 章风格习题。
- 005中级链表单链表、双链表与环形链表的原理、操作复杂度分析与多语言实现,涵盖常见面试题型。
- 006中级哈希表哈希表(Hash Table)的形式化定义、哈希函数设计(除法/乘法/全域/多项式滚动)、冲突处理(链地址法/开放寻址法/布谷鸟哈希)、扩容与再哈希、一致性哈希、Bloom Filter 与 LRU/LFU 缓存的工程实现,附 Python/C++/Java 多语言实现与 CLRS 第 11 章风格习题。
- 007中级树树(Tree)的形式化定义、二叉树遍历、二叉搜索树(BST)、AVL 树、红黑树、B 树/B+ 树、Splay 伸展树、Treap 树堆、Trie 字典树、LSM 树的原理、复杂度分析与多语言实现,附 Python/C++/Java 实现与 CLRS 第 12-13 章风格习题。
- 008中级图算法图的形式化定义、表示方法、遍历算法、最短路径、最小生成树、强连通分量与拓扑排序,附正确性证明、复杂度分析与多语言实现,覆盖 CLRS 4th 风格教学大纲。
- 009中级分治算法分治(Divide and Conquer)算法的形式化定义、三步范式(分解-解决-合并)、递推关系 $T(n) = aT(n/b) + f(n)$ 与主定理(Master Theorem, Bentley-Haken-Saxe 1980)三种情况的完整证明、分治与递归的关系、归并排序(von Neumann 1945 EDVAC)、快速排序(Hoare 1961)、Karatsuba 大整数乘法(Karatsuba-Ofman 1963 Soviet Physics-Doklady 7:595-596)、Strassen 矩阵乘法(Strassen 1969 Numerische Mathematik 13(4):354-356)、快速傅里叶变换 FFT(Cooley-Tukey 1965 Mathematics of Computation 19:297-301)、最近点对(Bentley-Shamos 1976)的原理、实现与对比分析,涵盖 von Neumann 1945 EDVAC、Karatsuba 1960 莫斯科大学研讨会、Cooley-Tukey 1965 IBM Watson、Strassen 1969 突破 $O(n^3)$、Bentley-Haken-Saxe 1980 主定理的历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 2/4/7 章、Kleinberg-Tardos 第 5 章风格习题。
- 010中级贪心算法贪心(Greedy)算法的形式化定义、贪心选择性质与最优子结构、拟阵理论(Edmonds 1971)统一框架、交换论证/保持领先/势能下降三大正确性证明方法、活动选择、哈夫曼编码(Huffman 1952)、Kruskal 最小生成树(Kruskal 1956)、Prim 最小生成树(Prim 1957)、Dijkstra 单源最短路(Dijkstra 1959)、分数背包、任务调度、区间调度的原理、实现与对比分析,涵盖 Huffman 1952 MIT、Kruskal 1956 Proc. AMS、Prim 1957 BSTJ、Dijkstra 1959 Numerische Mathematik、Rado 1957、Edmonds 1971 Mathematical Programming 的历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 16/23/24 章、Kleinberg-Tardos 第 4 章风格习题。
- 011中级递归与回溯递归(Recursion)的形式化定义、递归三要素(基线条件/递归条件/状态收缩)、递归树模型与主定理回顾、尾递归优化(TCO)、记忆化递归(Memoization)、回溯算法(Backtracking, Golomb-Baumert 1965 JACM 12(4):516-524)的系统化模板(选择-递归-撤销)、子集/排列/组合/N 皇后(Bezzel 1848)/数独/分割/括号生成/单词搜索的原理、实现与剪枝优化(排序剪枝/边界剪枝/条件剪枝/记忆化剪枝/位运算剪枝)、分支限界法(Land-Doig 1960)与 Dancing Links(Knuth 2000)的原理、对比分析与工程实践,涵盖 McCarthy 1960 LISP 递归系统化、Golomb-Baumert 1965 回溯法、Tarjan 1972 DFS、Bezzel 1848 N 皇后、Land-Doig 1960 分支限界、Knuth 2000 Dancing Links 的历史脉络,附 Python/C++/Java 多语言实现与 CLRS第4/22章、Kleinberg-Tardos第5章、Sedgewick第2章风格习题。
- 012进阶字符串算法字符串匹配的形式化定义(模式串在主串中的出现位置搜索)、KMP/Boyer-Moore/Rabin-Karp/Sunday/Z 函数等单模式匹配、Aho-Corasick 多模式匹配、后缀数组(倍增/DC3/SA-IS 线性算法)、后缀自动机(endpos 等价类)、后缀树(Ukkonen 线性算法)以及字符串动态规划(LCS、编辑距离、最长回文)的系统化讲解,覆盖复杂度证明、多语言实现(Python/C++/Java)、工程实践与 CLRS 风格习题。
- 013中级动态规划动态规划的 Bellman 最优性原理、最优子结构与重叠子问题形式化定义、状态转移方程代数表示、复杂度分析,覆盖一维/二维/区间/树形/状压/数位 DP 与背包、LCS、LIS、编辑距离等经典问题,附多语言实现、工程案例与 CLRS 风格习题。
- 014入门数组与动态数组数组(Array)与动态数组(Dynamic Array)的连续内存模型、随机访问 $O(1)$ 原理、倍增扩容均摊 $O(1)$ 分析、行优先/列优先多维布局、稀疏数组 CSR/CSC、双指针/滑动窗口/前缀和/差分等核心技巧,涵盖 Von Neumann 1945 EDVAC、Iverson 1962 APL、Stepanov 1994 STL 等历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 10 章、Sedgewick 第 1 章风格习题。
- 015进阶平衡树与高级树二叉搜索树(BST)、AVL 树(Adelson-Velsky-Landis 1962《An algorithm for the organization of information》Dokl. Akad. Nauk SSSR 146:263-266)、2-3 树(Hopcroft 1970)、红黑树(Bayer 1972 原始版对称二叉 B 树;Guibas-Sedgewick 1978《A Dichromatic Framework for Balanced Trees》FOCS 19th Annual Symposium 现代版;Sedgewick 2008 Left-Leaning Red-Black BST)、B 树(Bayer-McCreight 1972《Organization and Maintenance of Large Ordered Indexes》Acta Informatica 1(3):173-189)、B+ 树(Knuth 1973 TAOCP Vol.3 系统化;Comer 1979《The Ubiquitous B-Tree》Computing Surveys 11(2):121-137)、Splay 树(Sleator-Tarjan 1985《Self-Adjusting Binary Search Trees》JACM 32(3):652-686 DOI:10.1145/3828.3835)、Treap(Seidel-Aragon 1996)、AA 树(Andersson 1993)的形式化定义、旋转操作、平衡不变式与摊还分析、复杂度证明,覆盖 MySQL InnoDB B+ 树聚簇索引 / Linux CFS 红黑树 / Java TreeMap / C++ std::map / PostgreSQL B-tree 等工业案例,附 Python / C++ / Java 多语言实现与 CLRS / Sedgewick 风格习题。
- 016中级堆与优先队列堆(Heap)与优先队列(Priority Queue)的完全二叉树数组表示、最大堆/最小堆的堆序性质、上浮与下沉操作、Floyd 建堆 $O(n)$ 证明、堆排序、Top-K 问题、索引堆、二项堆、Fibonacci 堆、配对堆的对比分析,涵盖 Williams 1964 Algorithm 232 Heapsort、Floyd 1964 Algorithm 245 Treesort、Vuillemin 1978 二项堆、Fredman-Tarjan 1984 Fibonacci 堆等历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 6 章、第 19 章风格习题。
- 017中级查找算法查找(Search)算法的形式化定义、顺序查找 $O(n)$、二分查找 $O(\log n)$、插值查找 $O(\log \log n)$、斐波那契查找、哈希查找 $O(1)$、BST/AVL/红黑树查找、B 树查找、跳表查找(Pugh 1990)、字符串查找(KMP 1977、Boyer-Moore 1977、Rabin-Karp)、布隆过滤器(Bloom 1970)的原理、实现与对比分析,涵盖 Mauchly 1946 二分查找、Luhn 1953 哈希表、Bayer-McCreight 1972 B 树、Guibas-Sedgewick 1978 红黑树、Bloom 1970 布隆过滤器、Knuth-Morris-Pratt 1977 KMP、Boyer-Moore 1977 字符串匹配等历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 11/12/13 章、Sedgewick 第 3 章风格习题。
- 018中级LeetCode 刷题指南:从题型分类到面试策略的系统化路径LeetCode 刷题指南系统化阐述在线算法评测平台的发展脉络(ACM ICPC 1970、Google Code Jam 2003-2023、Topcoder Open 2001、Meta Hacker Cup 2011、Codeforces 2009、AtCoder 2012、LeetCode 2015 by Winston Tang、LeetCode China 2018)、十大题型分类体系(数组/双指针、链表、树、图、二分查找、回溯、动态规划、贪心、滑动窗口、单调栈)、三遍刷题法与四步解题法、时间复杂度反推($n \leq 20 \to O(2^n)$、$n \leq 100 \to O(n^3)$、$n \leq 10^4 \to O(n^2)$、$n \leq 10^6 \to O(n \log n)$、$n \leq 10^9 \to O(\log n)$)、高频题解模板(Python/C++/Java 三语言实现)、LeetCode Hot 100/Top Interview 150/Grind 75/NeetCode 150 学习路径对比、FAANG 与字节跳动/腾讯/阿里巴巴面试风格分析、LeetCode 题目到工业应用的映射(LRU Cache → Redis 淘汰策略、并查集 → Kubernetes 网络、单调栈 → Prometheus 监控)、LeetCode/LintCode/HackerRank/CodeSignal/牛客网五大平台对比。覆盖 100+ 经典题目索引(LC-1/11/15/42/72/200/300/1143 等),含 Bloom 分类法学习目标、ACM 格式参考文献(含 DOI)、四类习题与参考答案。
- 019中级并查集并查集(Disjoint Set Union, DSU / Union-Find)数据结构的形式化定义、路径压缩与按秩合并的均摊复杂度分析(反 Ackermann 函数 α(n))、Kruskal 最小生成树/连通分量/冗余连接等典型应用,附 Python/C++/Java 多语言实现与 CLRS 第 21 章风格习题。
- 020进阶线段树线段树数据结构的形式化定义(区间幺半群上的完全二叉树)、懒标记下传语义、构建 O(n)、查询/更新 O(log n)、空间 O(4n) 的复杂度证明,覆盖递归/迭代实现、动态开点、离散化、持久化、合并线段树、李超树、扫描线等工程变体,附多语言实现、LeetCode/Codeforces 实战与 CLRS 风格习题。
- 021中级树状数组树状数组(Fenwick Tree / Binary Indexed Tree, BIT)的形式化定义(基于二进制分解的前缀和索引结构)、lowbit 位运算原理、单点更新 + 区间查询 $O(\log n)$、区间更新 + 单点查询(差分树状数组)、区间更新 + 区间查询(双树状数组)三种模式的形式化推导与复杂度证明,覆盖 Peter M. Fenwick 1994《A New Data Structure for Cumulative Frequency Tables》Software: Practice and Experience 24(3):327-336 DOI:10.1002/spe.4380240306 的历史脉络、lowbit 不变式证明、与线段树 / 平方分解 / 前缀和的对比、Lucene 倒排索引 / Redis Sorted Set / PostgreSQL 统计信息等工业案例,附 Python / C++ / Java 多语言实现与 CLRS / Sedgewick 风格习题。
- 022中级跳跃表跳跃表(Skip List)数据结构的形式化定义(多层索引概率结构)、期望 O(log n) 查找/插入/删除的随机化分析、与平衡树的对比、Redis Sorted Set / LevelDB MemTable / Apache Lucene 倒排索引等工程实现,附多语言实现与 CLRS 风格习题。
- 023中级布隆过滤器布隆过滤器(Bloom Filter):一种空间高效的概率数据结构,由 Burton H. Bloom 1970《Space/Time Trade-offs in Hash Coding with Allowable Errors》Communications of the ACM 13(7):422-426 DOI:10.1145/362686.362692 提出。利用 k 个独立哈希函数将元素映射到 m 位的位数组,实现 O(k) 时间复杂度的成员查询,无假阴性但允许可控假阳性。本章涵盖 Bloom 原始动机、假阳性率 $P = (1 - e^{-kn/m})^k$ 的完整推导、最优哈希函数个数 $k_{\text{opt}} = (m/n)\ln 2$ 的极值分析、Counting Bloom Filter(Fan et al. 1998 USENIX Summary Cache)、Compressed Bloom Filter(Mitzenmacher 2002)、Cuckoo Filter(Fan et al. 2014 ACM TOCT)、Spectral Bloom Filter、Stable Bloom Filter 等变种;对比 Hash Set、Skip List、HyperLogLog、Cuckoo Filter 的空间/时间/精度权衡;附 Python/C++/Java 三语言实现、工业级应用(Cassandra、HBase、PostgreSQL、Chrome、Bitcoin SPV、Squid Proxy、Bigtable)、12 道习题含完整答案与 20 条 ACM 格式参考文献。
- 024进阶KMP字符串匹配Knuth-Morris-Pratt(KMP)字符串匹配算法:基于模式串自身结构构建部分匹配表(PMT/next 数组),实现 O(n+m) 线性时间匹配。涵盖 Morris 1970、Pratt 1970 独立发现与 Knuth 1970 复杂度证明的演进脉络,Knuth-Morris-Pratt 1977《Fast Pattern Matching in Strings》SIAM J. Comp. 6(2):323-350 DOI:10.1137/0206024 系统化发表;Cook 1971 字符串匹配下界、Aho-Corasick 1975 多模式扩展、Boyer-Moore 1977、Rabin-Karp 1987、Sunday 1990 变种对比;KMP 在 GNU grep、ESLint、IDE 语法检查、生物信息学 read 比对、Linux 内核字符串搜索中的应用;附 Python/C++/Java 多语言实现与 KMP 自动机、AC 自动机扩展。
- 025进阶动态规划状态压缩状态压缩动态规划(Bitmask Dynamic Programming):以二进制位编码子集状态,将指数级状态空间压缩至 $O(2^n \cdot n)$ 的可处理范围。系统化梳理 Bellman 1957《Dynamic Programming》Princeton University Press 开山之作、Held-Karp 1962《A Dynamic Programming Approach to Sequencing Problems》J. SIAM 10(1):196-210 DOI:10.1137/0110015 旅行商问题(TSP)$O(n^2 2^n)$ 算法、bitmask DP 系统化方法,覆盖 TSP、N 皇后、数独、划分等和子集、棋盘覆盖、排列型 DP 五大经典问题,含位运算技巧(`& | ^ ~`、`<< >>`、`__builtin_popcount`、低比特 `x & (-x)`、子集枚举 `(sub - 1) & S`)、与记忆化递归、自底向上 DP、滚动数组的对比,附 Python/C++/Java 多语言实现与 LeetCode 1879/1655/1494/1125/1931 经典题解,及在 Google OR-Tools、CP-SAT 求解器、Concorde TSP 求解器中的工业级应用。
- 026中级Floyd-Warshall 算法Floyd-Warshall 多源最短路径算法:Robert W. Floyd 1962《Algorithm 97: Shortest Path》CACM 5(6):345 DOI:10.1145/367766.368168 与 Stephen Warshall 1962《A Theorem on Boolean Matrices》JACM 9(1):11-12 DOI:10.1145/321105.321107 独立提出的动态规划算法,Bernard Roy 1959 更早发现传递闭包版本。算法以 $O(n^3)$ 时间、$O(n^2)$ 空间求解所有顶点对最短路径,支持负权边(无负环),可用于负环检测与传递闭包计算。本文涵盖 DP 状态设计、最优子结构证明、路径重建、位运算优化、与 Dijkstra/Bellman-Ford/Johnson 算法的对比、在 OSPF 路由协议与 NetworkX 工业级库中的应用,附 Python/C++/Java 多语言实现与 CLRS 第 25 章风格习题。
- 027中级Kruskal 算法Kruskal 最小生成树算法:Joseph B. Kruskal 1956《On the Shortest Spanning Subtree of a Graph》Proceedings of the American Mathematical Society 7(1):48-50 DOI:10.1090/S0002-9939-1956-0078686-7 提出的贪心加边算法,与 Prim 1957、Jarník 1930、Borůvka 1926 共同构成 MST 算法家族。算法以 $O(E \log E)$ 时间、$O(V)$ 空间求解连通无向加权图的最小生成树,借助并查集(Tarjan 1975 路径压缩+按秩合并)实现高效的环检测。本文涵盖贪心选择性质证明、切割性质与回路性质、与 Prim/Borůvka 算法的对比、最小生成森林/次小生成树/TSP 2-近似应用、NetworkX 与 Boost Graph Library 工业级实现,附 Python/C++/Java 多语言实现与 CLRS 第 23 章风格习题。
- 028中级拓扑排序拓扑排序(Topological Sort)算法:Arthur B. Kahn 1962《Topological Sorting of Large Networks》Communications of the ACM 5(11):558-562 DOI:10.1145/368996.369025 提出的入度法(Kahn 算法/BFS),与 Robert Endre Tarjan 1972《Depth-First Search and Linear Graph Algorithms》SIAM Journal on Computing 1(2):146-160 DOI:10.1137/0201010 给出的 DFS 后序逆序线性时间算法共同构成两大主流方案。Donald E. Knuth 在《The Art of Computer Programming, Volume 1: Fundamental Algorithms》§2.2.3 系统化讨论拓扑排序与计算机科学中的等价问题。本文涵盖 DAG(有向无环图)的形式化定义、Kahn 与 DFS 算法的正确性证明、与强连通分量(Tarjan 1972)及关键路径法(CPM, Kelly-Walker 1957;PERT, Malcolm-Roseboom-Clark-Fazar 1959)的关系、编译器依赖分析、Make/Build 系统、课程先修关系、并行任务调度等工业级应用,附 Python/C++/Java 多语言实现与 CLRS 第 22 章风格习题。
- 029进阶算法理论知识点计算复杂性理论的核心体系:以 Turing 1936《On Computable Numbers, with an Application to the Entscheidungsproblem》Proc. LMS 42:230-265 图灵机模型与 Church 1936《An Unsolvable Problem of Elementary Number Theory》Amer. J. Math. 58(2):345-363 λ-演算为根基,梳理 Gödel 1931 不完备性定理、Rice 1953《Classes of Recursively Enumerable Sets and Their Decision Problems》Trans. AMS 74:358-366、Hartmanis-Stearns 1965《On the Computational Complexity of Algorithms》Trans. AMS 117:285-306 复杂性类奠基、Cook 1971《The Complexity of Theorem-Proving Procedures》STOC 151-158 Cook-Levin 定理、Karp 1972《Reducibility Among Combinatorial Problems》21 个 NP 完全问题、Levin 1973《Universal Search Problems》Probl. Peredachi Inf. 9(3):115-116 独立发现、Savitch 1970《Relationships Between Nondeterministic and Deterministic Tape Complexities》JCSS 4(2):177-192、Baker-Gill-Solovay 1975《Relativizations of the P=?NP Question》SICOMP 4(4):431-442 相对化屏障、Ladner 1975《On the Structure of Polynomial Time Reducibility》JACM 22(1):155-171 NP-intermediate、PCP 定理(Arora-Safra 1998《Probabilistic Checking of Proofs》JACM 45(1):70-122;Arora-Lund-Motwani-Sudan-Szegedy 1998 JACM 45(3):501-555;Dinur 2007 组合证明)的完整脉络,覆盖 P/NP/NP-Hard/NP-Complete 形式化定义、多项式归约、摊还分析三方法(Sleator-Tarjan 1985 CACM 28(2):202-208)、竞争分析(Sleator-Tarjan 1985)、在线算法、数据流模型、P vs NP 千禧年大奖问题,附 Python/C++/Java 多语言实现与经典归约链(SAT → 3-SAT → CLIQUE → VERTEX-COVER → HAMILTONIAN-CYCLE → TSP)及 LeetCode 经典题解。
- 030进阶网络流网络流算法:流网络形式化定义 (G,s,t,c,f)、最大流最小割定理、Ford-Fulkerson 方法 O(E·|f*|)、Edmonds-Karp 算法 O(VE²)、Dinic 算法 O(V²E)、Push-Relabel 算法 O(V²E)/O(V³)、ISAP、最小费用最大流、网络单纯形,覆盖二分图匹配、Project Selection、Image Segmentation、Baseball Elimination、Airline Scheduling 等工程应用,附多语言实现与 CLRS 风格习题。