Lab 3:计时测试与随机对比测试¶
- 原标题:Lab 3: Timing Tests and Randomized Comparison Tests
- 原页面:
https://sp21.datastructur.es/materials/lab/lab3/lab3
文档性质:本文件依据 CS 61B Spring 2021 官方页面,由 ChatGPT 独立阅读后制作中文学习版。
为保留技术准确性,类名、方法名、文件名、命令、报错文本和 API 名称保持英文。本文采用逐节翻译与重述,而不是网页的逐句镜像。
实验目标¶
本实验把“正确性”与“性能”放在一起训练:
- 为
SLList和AList编写计时测试。 - 用随机对比测试寻找
BuggyAList的错误。 - 学习 conditional breakpoint、resume 和 execution breakpoint。
1. AList 扩容策略计时¶
实验比较两种扩容思想:
- 加法式扩容:容量每次只增加固定值。
- 乘法式扩容:容量按比例增长。
加法式扩容会频繁复制数组,构造大列表时性能恶化;乘法式扩容的均摊性能更好。计时结果应通过表格观察输入规模增长时耗时如何变化,而不只看一次运行。
2. SLList 的 getLast¶
对不同长度的 SLList 反复调用 getLast,观察耗时随列表长度增长。单向链表若没有尾指针,获取最后元素需要从头走到尾,因此通常与列表长度成正比。
这也解释 Project 1 为什么要求 LinkedListDeque.getLast 的时间不依赖结构大小:设计中必须保留能直接访问末端的信息。
3. 随机对比测试¶
测试思路:
AListNoResizing很简单,可作为可信参考实现。BuggyAList支持扩缩容,更复杂,也更可能有 bug。- 对两个对象执行完全相同的随机操作。
- 每一步比较它们的返回值和状态。
先写固定序列测试,例如连续加入三个值,再连续删除三个值。随后把操作选择和数据改为随机生成。
4. 记录操作历史¶
随机测试失败时,仅知道“值不一样”还不够。应记录此前执行过的操作,使失败能被复现。例如打印:
这样可以把随机失败变成确定性的最小调试案例。
5. 条件断点¶
当循环执行很多次时,普通断点会反复停住。条件断点可只在某个状态出现时暂停,例如:
- 列表大小等于某值
- 某次删除返回异常值
- 循环计数达到失败附近
Resume 用于继续运行到下一个断点;execution breakpoint 可在方法进入或退出时暂停。
完成标准¶
- 生成并解释两类计时表。
- 能从数据中区分加法扩容和乘法扩容。
- 完成随机对比测试。
- 能稳定复现并修复
BuggyAList的 bug。 - 测试代码清晰,不依赖反复撞 Autograder。
原始来源:CS61B Spring 2021 · 中文整理:everlasting · CC BY-NC-SA 4.0