《算法设计与分析》期末救急指南,可以直接当作复习路线图用

0 阅读6分钟

一句话结论

现在别再“系统看教材”了,

你要做的是:按题型抓重点 + 背套路 + 刷几道典型题,能拿大分。

一、先搞清楚:期末一般考什么?

根据很多学校的试卷和复习经验,大致就是几块:

  1. 概念题 / 简答题

    • 算法定义、特性、时间/空间复杂度概念
    • 分治、动态规划、贪心、回溯、分支限界等“思想”和特点
  2. 复杂度计算题(必考)

    • 给一段代码或递推式,让你求时间复杂度(上界、下界、准确界)
    • 常见:O、Ω、Θ、o、ω 这些符号的含义和判断
  3. 递推方程求解(很多学校考)

    • 形如 T(n) = aT(n/b) + f(n),用主定理
    • 二阶常系数递推方程(齐次 / 非齐次)解法
  4. 算法设计题(重头)

    • 分治、动态规划、贪心、回溯、分支限界等解决一个经典问题
    • 通常要求:
      • 写算法思路
      • 写伪代码
      • 分析时间复杂度
  5. 图算法题(部分学校必考)

    • 最短路径(Dijkstra、Floyd)
    • 最小生成树(Prim、Kruskal)
    • 拓扑排序、关键路径等
  6. 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(旅行商问题)

  • 装载问题、批处理作业调度等 复习重点:

  • 会画解空间树(子集树 / 排列树)

  • 会写约束函数和限界函数(剪枝条件)

  • 分析最坏时间复杂度(通常是指数级)


五、图算法:考得很固定

常见考点:

  1. 最短路径

    • Dijkstra:单源,无负权边,O(n²) 或 O((V+E)log V)
    • Floyd:多源,O(n³)
  2. 最小生成树

    • Prim:适合稠密图
    • Kruskal:适合稀疏图,用并查集判连通
  3. 拓扑排序、关键路径(AOE 网) 复习建议:

  • 每个算法:
    • 思路 + 步骤
    • 会手动模拟一个小例子
    • 时间复杂度

六、NP 完全理论:至少能背概念

要求不必太高,能写对定义就不错:

  • P:多项式时间可解的问题类

  • NP:多项式时间可验证的问题类

  • NP 完全:NP 中“最难”的一类问题,所有 NP 问题都可以多项式归约到它们

  • NP 难:不一定是 NP,但至少和 NP 完全一样难 典型 NP 完全问题:

  • SAT(可满足性问题)

  • 3-SAT

  • 团问题、顶点覆盖

  • 哈密顿回路、TSP 判定版本

  • 子集和问题等 考试常见问法:

  • “证明一个问题是 NP 完全的基本思路是什么?”
    答题要点:

    • 证明该问题在 NP 中
    • 选一个已知 NP 完全问题,做多项式时间归约到该问题

七、最后给你一个“救命版”复习清单

按这个顺序过一遍,基本能覆盖大部分学校试卷:

  1. 复杂度符号 + 简单判断题

  2. 主定理 + 二阶递推方程(一定要亲手解 2–3 道)

  3. 分治:二分、归并、快排、最大子段和

  4. 动态规划:矩阵连乘、LCS、0-1 背包、最大子段和

  5. 贪心:活动安排、哈夫曼、Prim/Kruskal、Dijkstra

  6. 回溯/分支限界:0-1 背包、n 皇后

  7. 图算法:最短路径、最小生成树、拓扑排序

  8. NP 完全:P/NP/NPC 概念 + 常见 NPC 问题名字


关注我,与我一起学习。