女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩暂时想不到快办法,就把四种可能全部列出来。机器人说:“先有正确的小规模答案,很有用。”

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 列候选完整范围
  2. 逐个验证留下合法答案
  3. 得到参照小输入的正确结果
  4. 再优化与参照对比

暴力解法常用于理解问题,并给优化算法提供小规模参照。

它应清楚、容易核对,而不是刻意写复杂。用同一输入比较两种方法的结果,可以暴露错误。

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什么时候需要继续优化?

当估算后发现暴力工作量明显超过时间允许范围,就需要问:

哪里重复?能否预处理/剪枝/换结构?得到更快算法

你已经知道了什么

  • 不会做时可以先设计正确暴力方法。
  • 暴力方法能帮助理解候选空间。
  • 它还可以作为优化算法的验证基线。
  • 是否需要优化取决于数据规模。
  • 从暴力到优化,是非常重要的信奥解题路径。

下一篇:怎样发现程序在重复做无用功?

轮到你来试一试

快算法和暴力算法对同一小输入结果不同,就一定是快算法错吗?

想好了吗?点开看解释

不一定,参照也可能有错。先手算这个例子,核对两边实现和题意。