算法教学

基础与分析

Foundations · 复杂度思维起步,吃透数组、栈队列、链表与哈希等线性结构的实现细节。6 篇

算法分析基础与学习路线

入门

算法分析(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 章。

数组与动态数组

入门

数组(Array)与动态数组(Dynamic Array)的连续内存模型、随机访问 $O(1)$ 原理、倍增扩容均摊 $O(1)$ 分析、行优先/列优先多维布局、稀疏数组 CSR/CSC、双指针/滑动窗口/前缀和/差分等核心技巧,涵盖 Von Neumann 1945 EDVAC、Iverson 1962 APL、Stepanov 1994 STL 等历史脉络,附 Python/C++/Java 多语言实现与 CLRS 第 10 章。

栈与队列

入门

栈(Stack)与队列(Queue)的形式化定义、LIFO/FIFO 原理、顺序栈/链式栈/循环队列/链式队列/双端队列/单调栈/单调队列的实现与复杂度分析,涵盖 Bauer-Samelson 1955 叠加原理、Dijkstra 1965 信号量、Hoare 1978 CSP 等历史脉络,附 Python/C++/Java 多语言实现。

搜索算法

进阶

搜索(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 章。

链表

进阶

单链表、双链表与环形链表的原理、操作复杂度分析与多语言实现,涵盖常见面试题型。

哈希表

进阶

哈希表(Hash Table)的形式化定义、哈希函数设计(除法/乘法/全域/多项式滚动)、冲突处理(链地址法/开放寻址法/布谷鸟哈希)、扩容与再哈希、一致性哈希、Bloom Filter 与 LRU/LFU 缓存的工程实现,附 Python/C++/Java 多语言实现。

树形结构

Trees · 从二叉树到堆与平衡树,掌握递归结构与层次关系的通用处理模式。3 篇

树

进阶

树(Tree)的形式化定义、二叉树遍历、二叉搜索树(BST)、AVL 树、红黑树、B 树/B+ 树、Splay 伸展树、Treap 树堆、Trie 字典树、LSM 树的原理、复杂度分析与多语言实现,附 Python/C++/Java 实现。

堆与优先队列

进阶

堆(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 章。

平衡树与高级树

深入

二叉搜索树(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 多语言实现。

算法设计范式

Design Paradigms · 分治、贪心、回溯与动态规划四大设计思想,从暴力到最优的系统演进。5 篇

分治算法

进阶

分治(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 章。

贪心算法

进阶

贪心(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 章。

递归与回溯

进阶

递归(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章。

动态规划

进阶

动态规划的 Bellman 最优性原理、最优子结构与重叠子问题形式化定义、状态转移方程代数表示、复杂度分析,覆盖一维/二维/区间/树形/状压/数位 DP 与背包、LCS、LIS、编辑距离等经典问题,附多语言实现。

动态规划状态压缩

深入

状态压缩动态规划(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 求解器中的工业级应用。

图论

Graph Theory · 遍历与连通性、拓扑排序、最短路、最小生成树,一路走到网络流。6 篇

图算法

进阶

图的形式化定义、表示方法、遍历算法、最短路径、最小生成树、强连通分量与拓扑排序,附正确性证明、复杂度分析与多语言实现,覆盖 CLRS 4th 风格教学大纲。

并查集

进阶

并查集(Disjoint Set Union, DSU / Union-Find)数据结构的形式化定义、路径压缩与按秩合并的均摊复杂度分析(反 Ackermann 函数 α(n))、Kruskal 最小生成树/连通分量/冗余连接等典型应用,附 Python/C++/Java 多语言实现。

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 多语言实现。

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 多语言实现。

拓扑排序

进阶

拓扑排序(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 多语言实现。

网络流

深入

网络流算法:流网络形式化定义 (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 等工程应用,附多语言实现。

字符串算法

Strings · 字符串处理专题与 KMP 高效匹配。2 篇

高级数据结构

Advanced Structures · 线段树、树状数组、跳表与布隆过滤器等进阶武器库。4 篇

线段树

深入

线段树数据结构的形式化定义(区间幺半群上的完全二叉树)、懒标记下传语义、构建 O(n)、查询/更新 O(log n)、空间 O(4n) 的复杂度证明,覆盖递归/迭代实现、动态开点、离散化、持久化、合并线段树、李超树、扫描线等工程变体,附多语言实现。

树状数组

进阶

树状数组(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 多语言实现。

跳跃表

进阶

跳跃表(Skip List)数据结构的形式化定义(多层索引概率结构)、期望 O(log n) 查找/插入/删除的随机化分析、与平衡树的对比、Redis Sorted Set / LevelDB MemTable / Apache Lucene 倒排索引等工程实现,附多语言实现。

布隆过滤器

进阶

布隆过滤器(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)。

理论与实战

Theory & Practice · 以计算理论收束知识体系,再用面试题单检验学习成果。2 篇

算法理论知识点

深入

计算复杂性理论的核心体系:以 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 经典题解。

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)。

外部刷题平台推荐

第三方资源 · 刷题 / 可视化 / 计划 / 公开课,按需进阶

以上为外部第三方平台,其内容、账号与服务均由各自运营方提供;收录仅为学习资源参考,不构成合作或背书,本站不对使用外部资源产生的各类问题承担责任。详见免责声明。