📄 一句话概括
人扫一眼就知道最大的卡片,计算机必须一张张翻、一个个比——为机器写算法,得把直觉翻译成机械步骤。
📝 本节和前面几节的关系
要点 1 定了底线,要点 2 换位思考:执行者是【没有直觉、只会死板动作】的机器。
一、直觉与机械的落差
一摞卡片找最大值:人扫一眼,99 在那就出来了——这是直觉(并行视觉比较)。 计算机呢:只能拿【当前临时最大值】与下一张比,赢了就更新,输了就翻下一张——N 张卡片比 N-1 次。 两种方式答案相同,过程天差地别。为机器写算法,写的是右边那种笨办法。
二、把直觉翻译成机械步骤
翻译套路:把【扫一眼】拆成【一张一张看】,把【看起来更大】拆成【与当前记录比较】,把【最大的是】拆成【记住临时最大值的变量】。 第三章的追踪程序(3.4 节)演示过这种机械性:CPU 一次只做一件小事,全靠重复与组合。 写算法卡壳时,九成是还带着【人的直觉】在思考——试着只许自己用【比较、赋值、循环】三样东西描述做法。
三、机械不是缺点
机械意味着可预测:同样输入永远同样过程同样结果; 机械意味着可加速:简单动作重复做,正是机器擅长的(要点 4 的伏笔)。 所以【笨】是机器的语言,把问题翻成它的笨语言,才是程序员的本事。
四、动手 Demo:机器式找最大值
禁止直觉,只许【比较、更新、下一张】三个动作,完整翻完八张卡片。
# 机械找最大: 只用 比较/更新/下一张
cards = [23, 7, 89, 45, 12, 99, 3, 67]
best = cards[0]
for x in cards[1:]:
if x > best:
best = x
print("最大值 =", best, "(比较了", len(cards) - 1, "次)")
实跑输出:
--------------------------------------------------------------------
要点 2——计算机不靠直觉而是机械地解决
--------------------------------------------------------------------
人找【一摞卡片里的最大值】:扫一眼就出答案——靠直觉。
计算机必须一张张翻、一个个比——靠机械。模拟一下它的笨功夫:
初始: 把第一张 23 当作临时的最大值
第 1 张(7) 不比 23 大 -> 不动
第 2 张(89) 比当前最大 23 大 -> 更新最大值
第 3 张(45) 不比 89 大 -> 不动
第 4 张(12) 不比 89 大 -> 不动
第 5 张(99) 比当前最大 89 大 -> 更新最大值
第 6 张(3) 不比 99 大 -> 不动
第 7 张(67) 不比 99 大 -> 不动
结果: 最大值 = 99 (共比较 7 次)
关键观察:计算机没有【一眼看出 99 最大】的能力,
它只会【当前最大 vs 新卡片】这一个动作,重复 N-1 次。
为机器写算法,就要把直觉翻译成这种简单的机械步骤。
注意代码里没有一行【找 99】——99 是被比较动作【碰】出来的。 N 张卡片 N-1 次比较——这个次数公式在要点 4 里还会用来算总时间。
30 秒实验
- 把【挑出班里最高的人】翻译成机械步骤(不许说【一眼】两个字)。
- 数一数 1000 张卡片要比较多少次——体会线性增长的含义。
常见误区
- 以为机器【看得见】整组数据——它一次只能看一格,全靠遍历。
- 以为笨办法羞于写出来——正确执行的笨办法胜过执行错误的聪明办法。
自测三问(点开对答案)
1. 要点 2 的核心提醒是什么? —— 计算机没有直觉,只会机械地比较与重复——算法要按它的能力写。 2. N 张卡片找最大值要比几次? —— N-1 次(第一张直接当临时最大值)。 3. 机械执行带来哪两个好处? —— 可预测(同样输入同样结果)、可加速(简单动作重复快)。- ☐ 下一节(5.4 要点3:了解并应用典型算法)
相关笔记
- 追踪程序的运行过程 — 机械执行的底细在那一节看透过
- 🔵 计算机基础 · 索引 — 数据与运算的机械性在那边有铺垫
- 💻 计算机是怎样跑起来的 · 索引