📄 一句话概括
不必重造轮子——检索、排序、最大公约数这些典型算法是前人打磨千年的招式库,先认得、会套、再谈改进。
📝 本节和前面几节的关系
要点 1、2 讲了底线与视角,要点 3 给出捷径:大量问题早有经典解法,站在前人肩上。
一、典型算法是招式库
检索类:线性查找(挨个找)、二分查找(砍半找); 排序类:冒泡排序、选择排序、快速排序; 数论类:欧几里得辗转相除求最大公约数——2300 年前的算法至今在用。 这些招式的共同点:步骤明确、被无数人验证过、复杂度有定论。
二、实例:欧几里得辗转相除
问题:求 48 和 18 的最大公约数。招式:大数除以小数取余数,再用【除数】除【余数】,余数为 0 时的除数就是答案。 48 ÷ 18 余 12 -> 18 ÷ 12 余 6 -> 12 ÷ 6 余 0 -> 答案 6。三步出解。 它的价值不止结果:用小步骤循环解决大问题的范式,影响了整个算法史。
三、怎么积累招式库
第一遍:读懂典型算法的思路(能纸上手工执行);第二遍:亲手写一遍(3.5 节手工汇编式的扎实);第三遍:改编应用(换个数据类型、换个场景)。 【⚠️ 2026 现状】实际工程里直接调标准库(如 Python 的 sorted、math.gcd)——但招式原理仍在,面试与排错时全是它的用武之地。
四、动手 Demo:辗转相除逐步追踪
把 gcd(48, 18) 的每一步除法追踪出来,看余数怎么一路归零。
# 欧几里得辗转相除
a, b = 48, 18
while b != 0:
a, b = b, a % b
print("a =", a, " b =", b)
print("最大公约数 =", a)
实跑输出:
--------------------------------------------------------------------
要点 3——了解并应用典型算法:欧几里得辗转相除
--------------------------------------------------------------------
典型算法是前人打磨好的【招式库】,先认一位老前辈——
求最大公约数的欧几里得算法(2300 年前的经典):
问题: 求 gcd(48, 18)
第 1 步: 48 除以 18 余 12 -> gcd 变成 gcd(18, 12)
第 2 步: 18 除以 12 余 6 -> gcd 变成 gcd(12, 6)
第 3 步: 12 除以 6 余 0 -> gcd 变成 gcd(6, 0)
余数为 0 -> 最大公约数 = 6
三条指令循环,两千年不倒——这就是典型算法的品格:
典型算法家族 代表 解决的问题
----------------------------------------------------------------
检索 线性查找 / 二分查找 从一堆数据里找目标
排序 冒泡 / 选择 / 快速 把乱序变成有序
数论 欧几里得辗转相除 最大公约数这类整数问题
学算法先学【招式库】里的经典——不必自创,但要认得、会套。
两数交换的写法 a, b = b, a % b 是 Python 的特色,一步完成【新被除数=旧除数、新除数=旧余数】。 招式的终止条件就是【余数为 0】——又一个明确且有限(要点 1)的范例。
30 秒实验
- 用辗转相除手算 gcd(120, 28)(答案 4),体验三步出解。
- 用 Python 的 math.gcd 验证手算结果——招式与工具对照。
常见误区
- 以为学算法要从零发明——先学典型算法,绝大多数问题都有现成招式。
- 以为辗转相除只算数学题——简化分数、时钟同步、密码学里都有它。
自测三问(点开对答案)
1. 三个典型算法家族是什么? —— 检索(线性/二分)、排序(冒泡/选择/快速)、数论(辗转相除)。 2. 辗转相除的招式口诀是什么? —— 大除小取余,除数再除余数,余数为零时的除数即答案。 3. 积累招式库的三遍法? —— 读懂思路、亲手写一遍、改编应用。- ☐ 下一节(5.5 要点4:利用计算机的处理速度)
相关笔记
- 画流程图来思考算法 — 上一章的画图法,本章处处在用
- 🔵 计算机基础 · 索引 — 那边有排序算法的更多图解
- 💻 计算机是怎样跑起来的 · 索引