一句话结论
现在别再“系统看教材”了,
你要做的是:按题型抓重点 + 背套路 + 刷几道典型题,能拿大分。
一、先搞清楚:期末一般考什么?
根据很多学校的试卷和复习经验,大致就是几块:
-
概念题 / 简答题
- 算法定义、特性、时间/空间复杂度概念
- 分治、动态规划、贪心、回溯、分支限界等“思想”和特点
-
复杂度计算题(必考)
- 给一段代码或递推式,让你求时间复杂度(上界、下界、准确界)
- 常见:O、Ω、Θ、o、ω 这些符号的含义和判断
-
递推方程求解(很多学校考)
- 形如 T(n) = aT(n/b) + f(n),用主定理
- 二阶常系数递推方程(齐次 / 非齐次)解法
-
算法设计题(重头)
- 用分治、动态规划、贪心、回溯、分支限界等解决一个经典问题
- 通常要求:
- 写算法思路
- 写伪代码
- 分析时间复杂度
-
图算法题(部分学校必考)
- 最短路径(Dijkstra、Floyd)
- 最小生成树(Prim、Kruskal)
- 拓扑排序、关键路径等
-
NP 完全理论(有的考,有的只考概念)
- P、NP、NP 完全、NP 难 的概念
- Cook 定理、常见 NP 完全问题(SAT、团问题、顶点覆盖、哈密顿回路、TSP 等)
二、复习路线图(按优先级)
用一个简单流程图帮你理一下复习顺序:
flowchart LR
A[列出你的考试题型] --> B{有没有大作业/报告?}
B -->|有| C[先按作业要求拿稳分]
B -->|没有| D[按题型抓重点]
C --> D
D --> E[复杂度计算 + 递推方程]
E --> F[分治/动态规划/贪心/回溯/分支限界]
F --> G[图算法]
G --> H[NP完全理论\n能背概念就不错]
下面给你一个时间分配建议(假设你只剩 1–2 天):
- 复杂度计算 + 递推:3–4 小时
- 分治 / 动态规划 / 贪心 / 回溯 / 分支限界:4–5 小时
- 图算法:2–3 小时
- NP 完全概念:1 小时背一背
三、复杂度计算题:拿分必须稳
1. 渐近记号快速判断
记住几点(考试常考):
-
O:上界,表示“不超过这个量级”
-
Ω:下界,表示“至少这个量级”
-
Θ:确界,既是上界又是下界
-
o:严格小于,比如 n = o(n²)
-
ω:严格大于,比如 n² = ω(n) 做题时记住:
-
若 f(n) = Θ(g(n)),则 f(n) = O(g(n)) 且 f(n) = Ω(g(n))
-
若 f(n) = o(g(n)),则 f(n) = O(g(n))
-
若 f(n) = ω(g(n)),则 f(n) = Ω(g(n))
2. 递推方程:主定理 + 二阶常系数
1)主定理(超级高频):
形式:
T(n) = aT(n/b) + f(n),a ≥ 1,b > 1
比较 f(n) 和 n^(log_b a) 的大小:
-
若 f(n) = O(n^(log_b a - ε)),有 ε > 0 → T(n) = Θ(n^(log_b a))
-
若 f(n) = Θ(n^(log_b a * log^k n)),k ≥ 0 → T(n) = Θ(n^(log_b a) log^(k+1) n)
-
若 f(n) = Ω(n^(log_b a + ε)),有 ε > 0,且 a f(n/b) ≤ c f(n) → T(n) = Θ(f(n)) 2)二阶常系数递推(齐次 / 非齐次): 步骤(齐次):
-
写出特征方程:r² = p r + q
-
求出特征根 r1, r2
-
若 r1 ≠ r2:f(n) = c1 r1ⁿ + c2 r2ⁿ
-
若 r1 = r2:f(n) = (c1 + c2 n) rⁿ
-
用初始条件解出 c1, c2 非齐次:
在齐次通解基础上,再找一个特解(假设为多项式,代入比较系数),最后通解 = 齐次通解 + 特解。
四、几大设计技术:每种只抓 1–2 个经典问题
教材一般按这些技术组织:分治、动态规划、贪心、回溯、分支限界。
期末不会让你发明新算法,都是经典问题套方法。
1. 分治
核心三步:分解 → 解决 → 合并。 必须会:
-
二分搜索(折半查找)
-
归并排序、快速排序
-
最大子段和(可用分治做)
-
最近点对问题、第 k 小元素(选择问题) 复习建议:
-
每个问题:
- 会写递归思路
- 会写时间复杂度:通常是递推 + 主定理
2. 动态规划(DP)
考试超级高频,抓住两个点:最优子结构 + 状态转移方程。 必须会:
-
矩阵连乘问题
-
最长公共子序列(LCS)
-
0-1 背包问题
-
最大子段和(也可以用 DP 做)
-
最优二叉搜索树(有的学校考) 复习套路:
-
先定义状态:dp[i] 或 dp[i][j] 表示什么
-
写出状态转移方程(考试大题得分点)
-
写边界条件
-
给出伪代码
-
分析时间复杂度(通常是填表 O(n²) 或 O(n³))
3. 贪心
贪心能用的前提:贪心选择性质 + 最优子结构。 必须会:
-
活动安排问题(按结束时间排序)
-
最优装载(类似背包,物品可拆分)
-
哈夫曼编码
-
最小生成树:Prim、Kruskal
-
单源最短路径:Dijkstra(注意不能有负权边) 注意:
贪心题常考证明或“为什么不能用贪心”,
如果你不会严格证明,考试时至少要能说清楚:
“每一步局部最优,最终能导致全局最优,可以证明。”
4. 回溯 & 分支限界
回溯 = 深度优先搜索 + 剪枝
分支限界 = 广度优先/最佳优先 + 剪枝。
典型问题:
-
0-1 背包(回溯 / 分支限界)
-
n 皇后问题
-
图的 m 着色问题
-
TSP(旅行商问题)
-
装载问题、批处理作业调度等 复习重点:
-
会画解空间树(子集树 / 排列树)
-
会写约束函数和限界函数(剪枝条件)
-
分析最坏时间复杂度(通常是指数级)
五、图算法:考得很固定
常见考点:
-
最短路径
- Dijkstra:单源,无负权边,O(n²) 或 O((V+E)log V)
- Floyd:多源,O(n³)
-
最小生成树
- Prim:适合稠密图
- Kruskal:适合稀疏图,用并查集判连通
-
拓扑排序、关键路径(AOE 网) 复习建议:
- 每个算法:
- 思路 + 步骤
- 会手动模拟一个小例子
- 时间复杂度
六、NP 完全理论:至少能背概念
要求不必太高,能写对定义就不错:
-
P:多项式时间可解的问题类
-
NP:多项式时间可验证的问题类
-
NP 完全:NP 中“最难”的一类问题,所有 NP 问题都可以多项式归约到它们
-
NP 难:不一定是 NP,但至少和 NP 完全一样难 典型 NP 完全问题:
-
SAT(可满足性问题)
-
3-SAT
-
团问题、顶点覆盖
-
哈密顿回路、TSP 判定版本
-
子集和问题等 考试常见问法:
-
“证明一个问题是 NP 完全的基本思路是什么?”
答题要点:- 证明该问题在 NP 中
- 选一个已知 NP 完全问题,做多项式时间归约到该问题
七、最后给你一个“救命版”复习清单
按这个顺序过一遍,基本能覆盖大部分学校试卷:
-
复杂度符号 + 简单判断题
-
主定理 + 二阶递推方程(一定要亲手解 2–3 道)
-
分治:二分、归并、快排、最大子段和
-
动态规划:矩阵连乘、LCS、0-1 背包、最大子段和
-
贪心:活动安排、哈夫曼、Prim/Kruskal、Dijkstra
-
回溯/分支限界:0-1 背包、n 皇后
-
图算法:最短路径、最小生成树、拓扑排序
-
NP 完全:P/NP/NPC 概念 + 常见 NPC 问题名字
关注我,与我一起学习。