本讲对应视频《CSP复赛专题10-数据结构2》(41′56″),聚焦 C++ STL 中最常用的三个容器: vector、priority_queue、deque。学生在专题 9 已经掌握了栈与队列的"手动实现 + STL"两遍走法, 本讲是在此基础上的横向扩张:从"固定操作"走向"按需选型"。
学情上的典型困难不是记不住接口,而是做题时不知道该用哪个——看到"第 k 个"还在用数组, 看到"每次取最小"还在写双重循环,看到"两头都要动"还在用 vector 头插。 所以本讲把教学目标定位在选型判断力,而不是接口记忆量。
① 三种容器的代价表;② 扩容的均摊 O(1); ③ 哈夫曼"WPL = 合并代价和";④ 公交换乘的票队列建模。
① 均摊分析为什么成立;② 小顶堆 greater 与"取负数"两种写法的转换;
③ 公交换乘里"票价不够的票不能删"。
| 环节 | 时间 | 教师活动 | 学生活动 | 设计意图 |
|---|---|---|---|---|
| ① 动机引入 | 4′ | 课件第 3 页:数组三宗罪(长度写死 / 删中间痛 / 两端不能动), 让学生各举一个自己踩过的坑 | 回忆并举例 | 用真实痛点锚定新知识的必要性 |
| ② vector 内存模型 | 8′ | 第 4–5 页动画:连点 push_back 直到扩容, 追问"这一次插入搬了几个元素?";再对比头插的移动次数 | 预测下次 capacity 变成几、搬几个 | 把"均摊 O(1)"从结论变成观察 |
| ③ vector 进阶 | 3′ | 第 6 页:二维 / 结构体 / 邻接表三种形态,重点讲邻接表为什么用 vector<int> g[N] |
跟着写一遍初始化 | 为后续图论铺垫 |
| ④ 例题1 论坛帖子 | 6′ | 第 7–8 页动画逐条执行指令,重点停在"回复数不足 → -1"那一条 | 说出 QUERY 前必须先比什么 | 把越界风险前置暴露 |
| ⑤ 优先队列与堆 | 8′ | 第 9 页动画:push → 单步上浮;pop → 单步下沉。 第 10 页讲小顶堆三写法,重点敲 默认是大顶堆 | 口头报每一步交换的下标 | 把 log n 变成"只走一条链"的直观事实 |
| ⑥ 例题2 哈夫曼 | 6′ | 第 11–12 页动画:每步取最小两个合并,盯着 WPL 累加; 讲清"WPL = 合并代价和"为什么成立 | 手算验证一组 | 让学生自己发现不用建树 |
| ⑦ deque | 5′ | 第 13–14 页:对比 vector 头插的移动次数,给出选型三问与代价表 | 判断给定场景该选哪个 | 形成可迁移的选型规则 |
| ⑧ 例题3 / 4 | 5′ | 第 15–17 页:龙的追踪(两头动 + 查中间)、 公交换乘(票队列 + 有效期),重点讲三个坑 | 完成当堂检测 | 当堂形成性评价 |
问:为什么不直接讲 STL 用法表,要花时间讲扩容和堆的内部?
答:用法表学生查得到,但代价判断力查不到。不知道 vector 会翻倍扩容,就不会想到 reserve;
不知道堆只沿一条链移动,就不会相信它比排序快。讲原理是为了让"选型"有依据,而不是靠试。