算法是什么:步骤与大 O 直觉
这是什么:算法 = 解决问题的一整套明确步骤,说白了就是"该按什么顺序干活"。
为什么用:Python 基础毕业了?恭喜!从这一章起聊点更深的东西,学过列表与字典更轻松。写过代码就会发现,能跑不等于跑得快,算法决定步骤有多少。
如何用:本章用"泡一碗方便面"当例子,再数一数代码执行了多少次基本操作,给出大 O 的直觉。
算法就是解决问题的明确步骤
算法(Algorithm)不是什么高深玩意,就是"解决问题的明确步骤"——和菜谱一个道理。
泡一碗方便面的菜谱:
- 烧一壶水
- 水开后倒入面碗
- 焖 3 分钟
- 开吃
这就是一个算法:步骤明确(不模糊)、有限步做完(不能永远泡着)、能解决问题(面熟了)。你写过的每一段能干活的程序,背后都是某个算法。
好算法只有两条标准
- 对:无论输入什么,结果都得正确。算错的最快算法,一分钱不值
- 快:同样算对,谁步骤少谁赢。100 万条数据,步骤差 100 倍,就是"秒出"和"等到花谢"的区别
后面几章的查找、排序、递归,都是在追求这两条。
用"数数"感受快慢:大 O 直觉
怎么衡量"快"?最直接的办法:数一数代码执行了多少次基本操作。
数据量用 n 表示(比如列表里有 n 个元素),计算机科学家发明了大 O 记法给"操作次数"分分类。不用怕数学,先记直觉:
| 写法 | 操作次数 | 大 O | 直觉 |
|---|---|---|---|
books[0] 取第一个 |
跟 n 无关,永远 1 次 | O(1) | 数据再多也一步到位 |
| for 循环翻一遍 | 翻 n 次 | O(n) | 数据翻倍,次数翻倍 |
| 全部两两比一遍 | 约 n² 次 | O(n²) | 数据翻倍,次数翻四倍 |
上手数一遍:
books = ["语文", "数学", "英语", "物理", "化学"]
print("直接取第 1 本 ->", books[0])
print("报出总数 ->", len(books), "本")
count = 0
for book in books: # 一本一本翻,翻了几次?
count += 1
print("一本本翻完 -> 翻了", count, "次")
你会看到:
直接取第 1 本 -> 语文
报出总数 -> 5 本
一本本翻完 -> 翻了 5 次
现在把列表从 5 本换成 1 万本:books[0] 还是 1 步(O(1) 纹丝不动),循环就得翻 1 万次(O(n) 跟着涨);要是再套一层循环两两比较,就是 1 万 × 1 万 = 1 亿次(O(n²) 爆炸)。记住这个直觉就够了。
下一站的引子:在通讯录找电话
手机通讯录里找"小青蛙"的电话,你会怎么办?
- 一页页翻:从第 1 页翻到找到为止——这就是 O(n) 的线性查找
- 翻中间:通讯录是按拼音排好的!翻到中间比一比,直接排除一半,再翻剩下那半的中间……每翻一次砍一半,这就是二分查找
同一个任务,选对算法,步骤能差出天壤之别。下一章我们亲手把这两种查找写出来。
动手改
- 把
books加长到 10 本,跑一遍,看三个数字各变成多少 - 在纸上(或注释里)写下"煮泡面"的算法步骤,检查:每步够明确吗?步骤有限吗?
- 猜一猜:数据量变成 100 时,O(1)、O(n)、O(n²) 大约各是多少次操作?改代码数一数验证
下一章:查找,让电脑学会"翻中间" 🐸