Hello 算法第 1 章复盘:会用库函数和 AI,为什么还要懂算法
用可核验的判断复盘算法入门,检查排序是否丢失重复元素,并把输入规格、边界与不变量带入 AI 代码评审。
把概念变成能核验的判断
本章建立了三类算法直觉,以及问题规格、程序和数据结构的区别。小结的目标是能把这些内容用自己的话讲出来,再对具体实现作出判断。这里的复盘题是建议,不表示已经完成。
| 要点 | 应当能说明 |
|---|---|
| 算法规则 | 输入、输出、状态、推进和结束条件 |
| 二分查找 | 有序前提与候选区间不变量 |
| 插入排序 | 有序前缀、移动和元素保留 |
| 贪心选择 | 局部标准、可行性与最优性区别 |
| 数据结构 | 内容、关系、操作与权衡 |
| 实现验证 | 边界输入、独立结果、证明与测量的区别 |
为什么库函数已经实现,仍值得学习机制
工程代码通常可以使用成熟库,学习机制帮助判断该用哪个操作、需要什么前提,以及什么时候一个方便的调用会成为重复工作。例如已经有序的数据多次查询,不一定需要每次重新排序;是否建立索引则要结合更新频率和内存约束。
原书小结比较了排序算法的不同增长模型。理解这种比较时,必须保留模型条件:键的位数是不是固定、数据范围多大、需要多少附加空间、实现常数怎样。理论阶数更低不能单独证明某个手写 Python 实现一定比库函数更快。
Python 官方说明排序是稳定的,Timsort 可以利用已有顺序。重复元素的相对顺序和部分有序输入,都会影响我们应该问的问题。复杂度章与排序章再逐步展开这些条件。
核验入口:Python Sorting HOWTO ↗。
AI 能写代码时,基础知识帮助你检查什么
借助 AI 生成实现,仍需要明确问题规格与检查标准。比如“返回目标位置”没有说明是否要求最早位置;“使用二分”没有说明输入已经有序。这两处缺失可能让一份运行正常的代码解决了另一个问题。
评审可以沿一条证据链进行:约定输入和输出 → 找出每个状态的含义 → 检查更新是否保留不变量 → 确认能结束 → 用边界和独立结果核验。模型或提示词改变后,仍保留相同的输入集合和判定标准,才能比较是否引入回归。
对于不确定的生成过程,一次结果不能说明长期稳定性;而本章确定性的算法实现,则可以重复检查同一套规格。生成器的随机性与被生成代码的算法行为,应分别分析。这是作者对原书 AI 协作问答的工程延伸。
只检查升序,为什么可能漏掉丢失元素
排序结果需要同时满足:顺序正确,且是输入元素的重新排列。假设输入为 [2,1,2],一个错误程序输出 [1,2]。输出确实有序,但丢掉一个 2,仍然不正确。
下面分别检查排序顺序和元素计数,输出 True、False。Counter 在这个普通整数示例中记录每个值出现的次数;仅比较集合则也会丢失重复次数信息。
from collections import Counter
source = [2, 1, 2]
wrong_result = [1, 2]
ordered = all(wrong_result[i] <= wrong_result[i + 1]
for i in range(len(wrong_result) - 1))
same_elements = Counter(wrong_result) == Counter(source)
print(ordered)
print(same_elements)建议练习:先预测,再运行,最后解释
- 手工追踪二分查找目标 3、40 和 26 的区间变化。
- 对插入排序输入 []、[5]、[3,2,1] 和 [2,1,2],预测结果和移动过程。
- 说明贪心找零金额 6、面额 [4,3] 失败时,为什么不能报告问题无解。
- 修改 first_index,使它返回所有匹配索引;写清空列表和未找到的输出。
- 给记录查询增加重复 ID 需求,说明字典值需要怎样组织。
- 给 AI 生成的二分代码写一个能检查前提和退出边界的评审清单。
展开参考思路
分别沿有序性收缩区间;确认有序结果与元素计数一致;3+3 是反例;所有匹配索引用列表表达,未找到返回空列表;一个键映射到记录列表或另定义唯一版本;检查区间含义、mid 的排除、零/单元素输入和重复值约定。以上都是作者建议练习。
进入第 2 章:怎样评价这套规则的成本
下一阶段依次补充 2.1 算法效率评估、2.3 时间复杂度、2.4 空间复杂度。已有 2.2 迭代与递归系列 已纳入目录,可以按自己的理解程度阅读和追问。
每次分析先明确输入规模、统计哪种操作、单次操作成本和同时保留的状态。几组运行结果是具体证据;增长关系和正确性仍需要推导。
查看逐节覆盖表 · 回到学习地图复盘主题依据:krahets / Hello 算法原书 ↗。本文重新组织概念,加入原创代码、状态表、边界与复盘题;作者推导不等同于原文结论。改编文字采用 CC BY-NC-SA 4.0 ↗,保留署名、非商业使用与相同方式共享;此说明不更改本站其他内容或源码许可。