对拍
约 10 分钟
对拍是自动找错的利器。准备三样东西:① 一个笨但保证正确的暴力程序(std);② 你要测的优化程序(sol);③ 一个随机数据生成器(gen)。让生成器不停造小规模随机输入,两个程序跑同一份输入、比对输出,一旦不一致就抓到了一个能复现的错误样例。
# 对拍脚本(Linux/mac;Windows 用 bat 类似)
while true; do
./gen > in.txt # 造一组随机数据
./sol < in.txt > o1.txt # 待测程序
./std < in.txt > o2.txt # 暴力正确程序
if ! diff o1.txt o2.txt > /dev/null; then
echo "找到不同!"; break # 此时 in.txt 就是错误样例
fi
done
好处:错误样例是自动生成并保存下来的,可以拿去单步调试,比干瞪代码高效得多。要点:暴力必须确信是对的(哪怕慢),否则两个都错、越拍越糊涂;数据规模要小(下一节讲原因)。对拍主要抓逻辑错和边界错,抓不出两份代码"错得一模一样"的情况。
小纸条
对拍需要准备哪三样?
登录 后可看答案