正在阅读Hello 算法第 1 章复盘:会用库函数和 AI,为什么还要懂算法
香港天气加载中…
QWeather ↗
← Back to the notebook

Hello 算法第 1 章复盘:会用库函数和 AI,为什么还要懂算法

用可核验的判断复盘算法入门,检查排序是否丢失重复元素,并把输入规格、边界与不变量带入 AI 代码评审。

把概念变成能核验的判断

本章建立了三类算法直觉,以及问题规格、程序和数据结构的区别。小结的目标是能把这些内容用自己的话讲出来,再对具体实现作出判断。这里的复盘题是建议,不表示已经完成。

要点应当能说明
算法规则输入、输出、状态、推进和结束条件
二分查找有序前提与候选区间不变量
插入排序有序前缀、移动和元素保留
贪心选择局部标准、可行性与最优性区别
数据结构内容、关系、操作与权衡
实现验证边界输入、独立结果、证明与测量的区别

为什么库函数已经实现,仍值得学习机制

工程代码通常可以使用成熟库,学习机制帮助判断该用哪个操作、需要什么前提,以及什么时候一个方便的调用会成为重复工作。例如已经有序的数据多次查询,不一定需要每次重新排序;是否建立索引则要结合更新频率和内存约束。

原书小结比较了排序算法的不同增长模型。理解这种比较时,必须保留模型条件:键的位数是不是固定、数据范围多大、需要多少附加空间、实现常数怎样。理论阶数更低不能单独证明某个手写 Python 实现一定比库函数更快。

Python 官方说明排序是稳定的,Timsort 可以利用已有顺序。重复元素的相对顺序和部分有序输入,都会影响我们应该问的问题。复杂度章与排序章再逐步展开这些条件。

核验入口:Python Sorting HOWTO ↗。

AI 能写代码时,基础知识帮助你检查什么

借助 AI 生成实现,仍需要明确问题规格与检查标准。比如“返回目标位置”没有说明是否要求最早位置;“使用二分”没有说明输入已经有序。这两处缺失可能让一份运行正常的代码解决了另一个问题。

评审可以沿一条证据链进行:约定输入和输出 → 找出每个状态的含义 → 检查更新是否保留不变量 → 确认能结束 → 用边界和独立结果核验。模型或提示词改变后,仍保留相同的输入集合和判定标准,才能比较是否引入回归。

对于不确定的生成过程,一次结果不能说明长期稳定性;而本章确定性的算法实现,则可以重复检查同一套规格。生成器的随机性与被生成代码的算法行为,应分别分析。这是作者对原书 AI 协作问答的工程延伸。

只检查升序,为什么可能漏掉丢失元素

排序结果需要同时满足:顺序正确,且是输入元素的重新排列。假设输入为 [2,1,2],一个错误程序输出 [1,2]。输出确实有序,但丢掉一个 2,仍然不正确。

下面分别检查排序顺序和元素计数,输出 True、False。Counter 在这个普通整数示例中记录每个值出现的次数;仅比较集合则也会丢失重复次数信息。

Python
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)

建议练习:先预测,再运行,最后解释

  1. 手工追踪二分查找目标 3、40 和 26 的区间变化。
  2. 对插入排序输入 []、[5]、[3,2,1] 和 [2,1,2],预测结果和移动过程。
  3. 说明贪心找零金额 6、面额 [4,3] 失败时,为什么不能报告问题无解。
  4. 修改 first_index,使它返回所有匹配索引;写清空列表和未找到的输出。
  5. 给记录查询增加重复 ID 需求,说明字典值需要怎样组织。
  6. 给 AI 生成的二分代码写一个能检查前提和退出边界的评审清单。
展开参考思路

分别沿有序性收缩区间;确认有序结果与元素计数一致;3+3 是反例;所有匹配索引用列表表达,未找到返回空列表;一个键映射到记录列表或另定义唯一版本;检查区间含义、mid 的排除、零/单元素输入和重复值约定。以上都是作者建议练习。

进入第 2 章:怎样评价这套规则的成本

下一阶段依次补充 2.1 算法效率评估、2.3 时间复杂度、2.4 空间复杂度。已有 2.2 迭代与递归系列 已纳入目录,可以按自己的理解程度阅读和追问。

每次分析先明确输入规模、统计哪种操作、单次操作成本和同时保留的状态。几组运行结果是具体证据;增长关系和正确性仍需要推导。

查看逐节覆盖表 · 回到学习地图复盘

主题依据:krahets / Hello 算法原书 ↗。本文重新组织概念,加入原创代码、状态表、边界与复盘题;作者推导不等同于原文结论。改编文字采用 CC BY-NC-SA 4.0 ↗,保留署名、非商业使用与相同方式共享;此说明不更改本站其他内容或源码许可。

Hello 算法Python复盘AI 代码评审测试

练习状态由你主动记录,发布文章不代表已经掌握。

MORE IN DEVELOPMENTGoogle Python 编码规范 01:从变量命名开始,读懂规则、含义与边界