软件工程本科生宝典
首页/课程学习引导/算法设计与分析
计算机基础 · 大二下

算法设计与分析

Design and Analysis of Algorithms

计算机基础
课程类别
大二下
建议学期
重要性
重要程度
难度
学习难度

📖这门课到底讲什么

算法设计与分析在数据结构之上更进一步:以算法设计范式为骨架,系统讲授分治、动态规划、贪心、回溯与分支限界、随机化与近似算法,并配以正确的证明与渐近分析(主定理、摊还分析、NP 完全性)。它关心的是为什么这个算法是对的、为什么它的复杂度是这个量级、问题本身有多难这三件事。学完你应能对一个问题写清最优子结构与状态转移、用反例或交换论证证明贪心正确性、用归约证明问题是 NP 难的,并能把实际工程问题(任务调度、资源分配、字符串匹配、路径规划)建模成经典算法问题求解。

🎯为什么必须学好

它是算法岗与竞赛的必修课:笔试压轴题基本靠动态规划与图算法,面试追问为什么贪心正确、如何证明复杂度,直接区分背题者与真正理解者。对考研与保研,它是 408 数据结构题的进阶支撑,也是机试拉开差距的关键。长期看,它训练的是用可证明的方式思考效率,这种能力在架构设计、性能优化、决策系统里会持续受益。

📌核心知识清单

  • 渐进分析与复杂度:大 O/大 Theta/大 Omega、主定理求解递归式、摊还分析(聚合法、记账法、势能法)
  • 分治:归并排序与逆序对计数、快速选择、最近点对、矩阵乘法(Strassen)、分治的复杂度方程构建
  • 动态规划:最优子结构与重叠子问题、背包问题族、最长公共子序列、编辑距离、区间 DP、状态压缩 DP
  • 贪心:活动选择与区间调度、霍夫曼编码、分数背包、最小生成树(Kruskal 与 Prim)、拟阵与交换论证证明正确性
  • 回溯与分支限界:N 皇后、数独、子集与排列枚举、剪枝策略与搜索空间估计
  • 图算法进阶:最大流(Ford-Fulkerson 与 Edmonds-Karp)、二分图匹配(匈牙利算法)、强连通分量、网络流建模技巧
  • 字符串算法:KMP 的失配函数与均摊分析、Z 算法、Trie 与 AC 自动机、后缀数组入门
  • 计算复杂性:P 与 NP、NP 完全与归约(SAT、顶点覆盖、旅行商)、近似算法与启发式策略

✍️怎么学(可执行步骤)

  1. 以 CLRS《算法导论》为主线(重点第2至8、15、16、22至26章),同时用《算法(第4版)》做实现,理论证明与代码实现双轨并行
  2. 每学一个范式就整理一页模板:适用条件、状态定义套路、正确性证明方式、复杂度推算方法,动态规划部分建议手写二十道题的完整状态转移推导
  3. 在 Codeforces 或洛谷参加周赛,从 Div.3 开始,重点做 dp 与图论标签的题,每场比赛后补题并写题解
  4. 读研方向的同学可跟斯坦福 CS161 的讲义,做完其中关于 NP 完全性与近似算法的作业,建立复杂度理论的基本功

📚推荐教材与书籍

算法导论(第3版)Cormen, Leiserson, Rivest, Stein · 经典

本科算法课标准教材,重点分治、堆、动态规划、贪心、图算法与 NP 完全性章节

算法(第4版)Robert Sedgewick · 经典

实现导向、图示优秀,字符串算法与图算法章节尤其出色,适合配合编码练习

算法设计手册Steven S. Skiena · 进阶

从问题建模到算法选择的实战指南,附大量在线题目索引,做项目与准备机试非常实用

挑战程序设计竞赛秋叶拓哉等 · 进阶

面向竞赛的系统训练书,覆盖 dp、图论、数论与计算几何,适合想冲 ICPC 的同学

🎬视频课程 / 公开课

Algorithms: Design and AnalysisStanford Online (B站有搬运)

Tim Roughgarden 讲授,分治、图算法与 NP 完全性讲得极清晰

算法设计与分析中国大学MOOC

国内高校版本,与考研机试题目风格接近

🌐网站与文档

中文最全的算法专题讲解,含状态设计技巧与优化方法(单调队列、斜率优化)

英文算法百科,每种算法都有证明、复杂度与可运行代码,写题解的好参考

🐙GitHub 开源资料

覆盖 dp、贪心、图算法的完整实现集合,可作为模板库查阅

按范式分类的题解,动态规划专题从入门到进阶组织得很好

用统一框架讲 dp 与回溯,适合把零散技巧串成体系

🧪动手实践任务

🧪

实践 1

实现并对比编辑距离、LCS、背包三类 DP 问题,输出状态转移表并在报告中解释每一项的含义

🧪

实践 2

实现最大流算法并在一个任务分配实例上求解(如工人与任务匹配),输出流量分配结果与最小割验证

🧪

实践 3

选一道 NP 完全问题(如旅行商)分别用精确搜索与贪心近似求解,比较解质量与运行时间,写出近似比实验说明

🧪

实践 4

整理一份《算法范式对照表》:对二十道经典题标注所属范式、状态定义、证明方式与复杂度,作为长期复习资料

🧾考试与面试

💼 面试会怎么考

高频:给一个问题让你说清最优子结构与状态转移(如股票买卖、打家劫舍变形);贪心题被追问为什么贪心是对的、能不能给反例;最大流与二分图匹配的实际建模(任务分配、时间表安排);快排与归并的复杂度推导(用主定理现场演算);问到 NP 完全性时会问 P 与 NP 的区别以及为什么实际问题常用近似或启发式。面试官在意的是推导过程而非结论。

📝 期末与考研怎么过

期末通常包括复杂度分析题(解递归式)、算法设计题(写出伪码与复杂度)、正确性证明题(归纳或交换论证)与 NP 归约题。备考方法是把常见递归式的解背熟、把每种范式准备一到两个标准例题的完整答案、练习两三道归约题(3-SAT 归约到顶点覆盖)。目标八十分以上;若走算法方向,争取把归约类题目也做对。

⚠️ 常见坑

  • 动态规划状态定义含糊,先写循环再想状态,导致边界与转移全靠试,应先在纸上写清状态含义与转移方程
  • 贪心题不验证正确性,用错策略且举不出反例,面试时无法自证;至少要会用交换论证或反例检验
  • 复杂度分析只算最好情况,忽略递归树深度与常数项,得不到正确上界
  • 遇到难题直接看题解并以为自己会了,一个月后重做仍不会;正确做法是标记题目并在三周后闭卷重做
→ 查看 大二下学期 的完整学期安排