四步法矩阵连乘LCS最大子段和三角剖分图像压缩0-1背包(伪多项式)最优BST贪心两要素活动安排+证明背包 vs 0-1背包Dijkstra多机调度 LPT
大题主力章:DP/贪心各一道构造题;贪心正确性证明模板(交换论证)务必背熟。
解空间树子集树/排列树框架(算法填空原题)剪枝函数TSP/0-1背包/装载/n皇后/最大团/批处理/m着色分支限界三区别FIFO/优先队列布线附 NP 完全性入门
“解空间树 + 剪枝函数 + 搜索过程”是固定答题格式。
P/NP/NPC/NPH归约方向判断题清单NPC 证明模板大纲归约链自身归约最大流最小割负载均衡/定价算法/取整法考试题型与答题四注意事项
2021 年历史复习大纲涉及的拓展专题:本笔记根据旧大纲与教材补写。相关分值不是 2026 年预测;网络流练习应完整写出增广路径。
第一遍(听懂与记忆):补数学基础 → 分治的递归式 → DP 五步法 → 贪心证明 → 解空间树 → NPC 归约,学完一节就做该模块展开题。
第二遍(亲自写答案):拿往年题,先不看解析,写“输入与约束 / 算法思想 / 正确性证明 / 时间空间复杂度”,然后对照答案。书面算法题与 Python 编程题分开训练。
求职并行:Python 算法衔接 · 可运行示例 · 教材、视频与题库。
不看答案独立说出状态的物理含义、初值与转移,说明遍历次序,手算小规模 DP 表,分析 \(O(nC)\) 等复杂度的适用条件,并写一个反例解释为什么不能用相似的贪心替代。
| 场景 | 建议 |
|---|---|
| 上课跟进 | CH 课件对应模块对照读;每章写一段“适用条件 + 复杂度”小结(README 建议,期末直接复用)。 |
| 课后题 | 独立完成;卡住看 作业/ 历届类似题;尽量用 Python 实现(与求职笔试题高度重叠)。 |
| 期末冲刺 | ① 复习资料/2021年算法设计与分析复习大纲.pptx(16 页历史复习范围,先与本学期通知核对)→ ② 模拟题1(中文计算)→ ③ 2018 秋(有答案)→ ④ B2 无答案 PDF 限时 → ⑤ B1/C/A 查漏;判断题对照 B1/B2 差异表订正。 |
| 概念补漏 | 什么是P问题、NP问题和NPC问题.ppt + Final-v2/Review-v2(本笔记模块 4 已浓缩)。 |
| 卷 | 提示 |
|---|---|
| B1 vs B2 | 同一题库两份卷,判断前 7 题相同;第 2 题(A≤pB 且 A 是 NP 难 ⟹ B 也是 NP 难)B1 打 √ 正确、B2 有误——以数学推导为准。 |
| 年份不详 A / 模拟题 2 | 同源(前 5 题相同),英文命题,判断题 + 增长率排序,两份都做。 |
| 来自知博的试题 | 手写拍照 3 套,加练用。 |
../学习导航.html#math-foundation——算法课的主定理、递推式求解同样用得上。
从原专题文件整合而来,直接在本课程目录内阅读。
目标:课内能证明、Python 能实现、面试能解释。适用于后端、测试开发、软件开发等岗位的通用算法能力培养;实际考核依公司、岗位而定。
| 课程主题 | Python 做法 | 面试迁移 | 容易错的边界 |
|---|---|---|---|
| 渐近分析 | list/dict/set 时间代价对比 |
解释空间换时间、均摊复杂度 | list.insert(0,x) 通常 O(n) |
| 二分与分治 | bisect_left、自己写二分、归并排序 |
有序数组边界、二分答案 | 左闭右开 / 死循环 / 重复元素 |
| 动态规划 | LCS、0-1 背包、最长递增子序列 | 子问题状态设计、滚动数组 | 初始化、容量正序误用 |
| 贪心 | 无权活动安排、区间排序、堆 | 证明策略正确的反例/交换论证 | 带权活动不能直接贪心 |
| 回溯 | n 皇后、子集、组合 | 重复去重、剪枝、搜索顺序 | 修改路径后必须回退 |
| 图和网络流 | BFS、DFS、heapq、Dijkstra、残量网络 |
最短路径、依赖关系、路由 | Dijkstra 要求非负边权 |
| NP 理论 | 归约写出 iff 证明 | 说明不可扩展性、精确与近似权衡 | 归约必须从已知难问题指向目标 |
heapq,验证无负权限制。from collections import Counter, defaultdict, deque
from bisect import bisect_left, bisect_right
from heapq import heappush, heappop
from functools import lru_cache
q = deque([0]); q.append(1); q.popleft() # 两端操作 O(1)
idx = bisect_left([1, 2, 2, 4], 2) # 最左 2,下标 1
list.append/pop() 尾端摊还 O(1);pop(0) 是 O(n);deque.popleft() O(1)。dict/set 的哈希操作平均 O(1),理论最坏情况不保证 O(1)。heapq 是最小堆,入堆/出堆 O(log n),取堆顶 O(1)。bisect 查找 O(log n),但向列表插入元素仍是 O(n)。后端侧:可将优先队列用于异步任务调度、最短路用于路径搜索;测试开发侧:用随机对照测试与性质测试验证算法;数据方向:把随机过程仿真结果与数学期望对照,强调模型假设。项目叙述不要只说“用了 DP”,应说清数据规模、算法选择、测试覆盖与性能改善是否有实测证据。
算法/ 目录运行:python -m unittest discover -s tests -v。