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

人扫一眼就知道最大的卡片,计算机必须一张张翻、一个个比——为机器写算法,得把直觉翻译成机械步骤。

📝 本节和前面几节的关系

要点 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 秒实验

  1. 把【挑出班里最高的人】翻译成机械步骤(不许说【一眼】两个字)。
  2. 数一数 1000 张卡片要比较多少次——体会线性增长的含义。

常见误区

  1. 以为机器【看得见】整组数据——它一次只能看一格,全靠遍历。
  2. 以为笨办法羞于写出来——正确执行的笨办法胜过执行错误的聪明办法。
自测三问(点开对答案) 1. 要点 2 的核心提醒是什么? —— 计算机没有直觉,只会机械地比较与重复——算法要按它的能力写。 2. N 张卡片找最大值要比几次? —— N-1 次(第一张直接当临时最大值)。 3. 机械执行带来哪两个好处? —— 可预测(同样输入同样结果)、可加速(简单动作重复快)。

相关笔记