
一起动脑筋 · 先看一个小故事
女孩暂时想不到快办法,就把四种可能全部列出来。机器人说:“先有正确的小规模答案,很有用。”
把过程摊开来看
- 列候选完整范围
- 逐个验证留下合法答案
- 得到参照小输入的正确结果
- 再优化与参照对比
暴力解法常用于理解问题,并给优化算法提供小规模参照。
它应清楚、容易核对,而不是刻意写复杂。用同一输入比较两种方法的结果,可以暴露错误。
01为什么不会做时反而要想“最笨的方法”?
因为“最笨但正确”的方法能让问题从完全没思路变成至少知道怎样得到答案。
02第一步:把所有候选想出来
例如两数之和问题,可以先枚举所有下标对:
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
// 检查 a[i] + a[j]
}
}
03暴力方法有什么价值?
保证正确起点
先有能做出来的方法。
理解搜索空间
到底有多少候选?
发现重复工作
哪里算了很多次?
用于对拍
小数据验证优化算法。
04什么叫“对拍”?
竞赛训练中常让:
- 一个简单但可信的暴力程序
- 一个更快的新算法
对同一批随机小数据运行,如果输出不同,就说明至少有一个程序有问题。
05什么时候暴力已经够用了?
要看数据规模。
如果 n 很小,O(n²) 甚至 O(2^n) 在限定范围内也可能完全足够。
06什么时候需要继续优化?
当估算后发现暴力工作量明显超过时间允许范围,就需要问:
哪里重复?→能否预处理/剪枝/换结构?→得到更快算法
你已经知道了什么
- 不会做时可以先设计正确暴力方法。
- 暴力方法能帮助理解候选空间。
- 它还可以作为优化算法的验证基线。
- 是否需要优化取决于数据规模。
- 从暴力到优化,是非常重要的信奥解题路径。
下一篇:怎样发现程序在重复做无用功?
轮到你来试一试
快算法和暴力算法对同一小输入结果不同,就一定是快算法错吗?
想好了吗?点开看解释
不一定,参照也可能有错。先手算这个例子,核对两边实现和题意。