💻 第五章 与算法成为好朋友的七个要点
📄 一句话概括

机器每秒算亿次的肌肉,让【挨个穷举】的笨办法也能秒出答案——先让正确答案跑出来,优雅随后再说。

📝 本节和前面几节的关系

要点 3 学了经典招式,要点 4 给另一条路:仗着机器快,笨办法直接上——这在今天常常是对的。

一、暴力穷举的翻身

问题:1000 以内的完全数(等于自身全部因数之和,如 6 = 1+2+3)。 聪明招要先懂数论;笨招很直白:每个数都把 1 到它本身全除一遍、因数加总、与自身比对。 笨招的总计算量约几十万次除法——对人脑是几天的活,对机器是一眨眼。暴力可行,就是好办法。

二、什么时候敢用暴力

看三个数:候选范围多大?单次检查多贵?时间限制多紧? 范围小、检查便宜、时间宽——放心暴力(例:验证一个 4 位密码); 范围指数级(如所有排列)就要掂量——但【先写暴力版对答案,再优化】仍是工程标配:暴力版是正确性的参照物。

三、与要点 3 的配合

典型算法与暴力不是对立的:先用暴力跑通拿到答案,再考虑换成经典招式提速。 教材的态度很务实:机器速度是程序员的资源,用资源换开发时间,往往划算。

四、动手 Demo:穷举找完全数

挨个检查 2~1000,把完全数连同它的因数分解一起揪出来。

# 穷举: 每个数把因数全加一遍
for n in range(2, 1000):
    s = sum(d for d in range(1, n) if n % d == 0)
    if s == n:
        print(n, "是完全数")

实跑输出:

--------------------------------------------------------------------
要点 4——利用计算机的处理速度:暴力也光荣
--------------------------------------------------------------------

计算机每秒算亿次的肌肉,让【笨办法】也能秒出结果。
问题:1000 以内的完全数(恰好等于自身所有因数之和)有哪些?

    6 = 1 + 2 + 3 <- 完全数!
    28 = 1 + 2 + 4 + 7 + 14 <- 完全数!
    496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 <- 完全数!

统计: 穷举了 499500 次【除法判断】, 一瞬间跑完

换成人脑,这个思路要算几天。要点 4 的意思:
**能靠机器速度 brute-force 的,不必憋聪明招**——
先让答案跑出来,再谈优雅。这是计算机送给编程者的底气。

1000 以内只有 6、28、496 三个完全数——两千年前的数学家靠手算就找到了前两个,如今机器一瞬全扫完。 暴力的隐藏价值:它几乎不会写错(逻辑直白),常用来给聪明算法【对答案】。

30 秒实验

  1. 把范围改成 10000 跑一遍(多找出 8128),感受机器速度的富余。
  2. 算算暴力版做了多少次除法——量级到百万时就要考虑换招了。

常见误区

  1. 以为笨办法【不专业】——正确的笨办法先跑通,比想不出聪明办法强一百倍。
  2. 对任何规模都无脑暴力——候选一上指数级,机器再快也烧不完。
自测三问(点开对答案) 1. 什么是完全数? —— 恰好等于自身全部因数之和的数,如 6 = 1+2+3。 2. 什么时候可以放心用暴力穷举? —— 候选范围小、单次检查便宜、时间限制宽松。 3. 暴力版对工程还有什么用? —— 作为正确性参照物,给优化后的算法对答案。

相关笔记