📄 一句话概括
机器每秒算亿次的肌肉,让【挨个穷举】的笨办法也能秒出答案——先让正确答案跑出来,优雅随后再说。
📝 本节和前面几节的关系
要点 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 秒实验
- 把范围改成 10000 跑一遍(多找出 8128),感受机器速度的富余。
- 算算暴力版做了多少次除法——量级到百万时就要考虑换招了。
常见误区
- 以为笨办法【不专业】——正确的笨办法先跑通,比想不出聪明办法强一百倍。
- 对任何规模都无脑暴力——候选一上指数级,机器再快也烧不完。
自测三问(点开对答案)
1. 什么是完全数? —— 恰好等于自身全部因数之和的数,如 6 = 1+2+3。 2. 什么时候可以放心用暴力穷举? —— 候选范围小、单次检查便宜、时间限制宽松。 3. 暴力版对工程还有什么用? —— 作为正确性参照物,给优化后的算法对答案。- ☐ 下一节(5.6 要点5:使用编程技巧提升程序执行速度)
相关笔记
- 尝试估算程序的执行时间 — 拍数账正是【快慢】的度量衡
- ☕ Java基础 · 索引 — 循环与累加的第一手练习在那边
- 💻 计算机是怎样跑起来的 · 索引