编程基础篇 · AI 背后的算法

给 AI 写的代码做一次复杂度体检

三档任务:让 AI 自报复杂度、要求优化一档并说清代价、用大数据量实测验证它没吹牛

本页解决的问题

先给结论

「给 AI 写的代码做一次复杂度体检」要解决的关键问题是什么?

三档任务:让 AI 自报复杂度、要求优化一档并说清代价、用大数据量实测验证它没吹牛

判断标准

跟着交接处走,不要只看 Demo。 系统是否可靠,往往取决于模型、工具、状态、权限和人的交接处。把每次交接都当成可以观察、测试和恢复的地方。

下一步

为一个自动化步骤写清输入、负责人、审批和恢复动作。

常见误区

一次运行成功了,却说不清发生了什么,也无法安全重放。

挑一档 · 今天就动手
🥉

任务一 · 自报家门

让 AI 给自己的代码标注复杂度

30 分钟

拿一段 AI 刚写的函数(没有就让它写一个「找出两个列表里的共同元素」——这题它十有八九先给你 O(n²) 的版本)。把下面的提示词甩过去,让它自己交代快慢。

针对你刚写的这个函数,做一次复杂度自查,用大白话回答: 1. 逐行(或逐个循环块)标注时间复杂度,每处用一句话解释为什么; 2. 明确指出瓶颈行:整个函数最慢的是哪一行/哪个循环?为什么是它? 3. 汇总:整体时间复杂度和空间复杂度各是多少; 4. 翻译成人话:数据量从 1 千涨到 100 万,这个函数会慢多少倍?用户的体感是「无感」「卡一下」还是「转圈转到怀疑人生」? 我是初学者,别堆术语,能打比方就打比方。
完成标准:你能指着代码说出「瓶颈在这一行,因为它是嵌套循环/挨个扫描」——说得出瓶颈行,这一档就毕业了。
🥈

任务二 · 优化一档

要求提速,更要求说清代价

半天

接着任务一:如果 AI 自报了 O(n²),就要求它优化到 O(n log n) 或 O(n)——但重点不是变快,是让它说清代价。学完 ds-6 的你,要能在它的方案里指出「空间换时间」发生在哪一行。

请把刚才这个 O(n²) 的函数优化到 O(n log n) 或 O(n),要求: 1. 新旧两版代码都保留,优化的关键行加注释; 2. 说清楚你用了什么手段提速(排序后二分?换哈希表?),对应哪类算法思想; 3. 诚实交代代价:可读性变差了吗?内存多用了多少?有没有什么场景下旧版反而更好(比如数据量很小时)? 4. 如果你的方案用了「空间换时间」,明确指出是哪一行、拿多少空间换了多少时间。 最后出一道检验题考考我:让我指出新版本里「空间换时间」发生在哪,再公布答案。
完成标准:你答对了它出的检验题——能亲手指出「空间换时间」在哪一行,说明 ds-6 和这一章真的串起来了。
🥇

任务三 · 实测打脸

用真实数据验证它没吹牛

一周

复杂度是纸面推演,耗时曲线才是铁证。让 AI 写一个基准测试脚本,生成三个量级的随机数据各跑一遍计时,亲眼看优化前后的曲线差多远——顺便检验它自报的复杂度有没有吹牛。

请为新旧两个版本的函数写一个基准测试脚本,要求: 1. 生成三档随机测试数据:1 千条、10 万条、1000 万条(如果 1000 万条跑不动,允许降到 100 万并说明原因); 2. 每一档数据,新旧两版各跑 3 次取平均耗时,输出一张对比表:数据量 | 旧版耗时 | 新版耗时 | 倍数差; 3. 脚本要能直接运行,告诉我用什么命令跑、大概等多久; 4. 跑完后帮我判断:实测的耗时增长趋势,和你之前自报的复杂度吻合吗?如果不吻合(比如自称 O(n) 却按平方涨),诚实分析原因。 我会把实测结果贴回来,你负责解读曲线。
完成标准:你手上有一张三档数据量的实测耗时表,并且能回答「实测曲线和自报复杂度吻合吗」——吻合或打脸,都算体检完成。
🩺 体检报告生成器 · 填三格,生成可以发群里的总结
三个格子都填一下,报告才完整~
为什么一定要实测这一步?AI 自报复杂度大部分时候是对的,但「大部分」不等于「每次」——隐藏在库函数里的排序、循环里偷偷的字符串拼接,都可能让实际曲线和纸面推演对不上。跑过一次基准测试的人,从此对「它说 O(n) 就是 O(n)」保持职业性怀疑,这正是验收者该有的姿态。

「挑一档 · 今天就动手」里的算法代价曲线

「拿一段 AI 刚写的函数(没有就让它写一个 「找出两个列表里的共同元素」 ——这题它十有八九先给你 O(n²) 的版本)。把下面的提示词甩过去,让它自己交代快慢」真正训练的不是背诵步骤,而是识别重复工作:输入变大时,程序到底多做了多少次比较、移动或递归。

先找重复工作,再谈快慢

「接着任务一:如果 AI 自报了 O(n²),就要求它优化到 O(n log n) 或 O(n)——但重点不是变快,是让它 说清代价 。学完 ds-6 的你,要能在它的方案里指出「空间换时间」发生在哪一行」可以拆成输入规模、每轮做什么、以及是否能缩小下一轮范围三个问题。Big-O 是描述增长趋势的语言,不是对每台机器的精确计时;常数、内存和真实数据分布也会影响最终结果。

  • 体检三步走 :自报复杂度 → 优化并交代代价 → 实测验证,一步比一步硬核
  • 瓶颈行是抓手 :能指出「最慢的是这一行」,验收就有了着力点
  • 优化必谈代价 :不谈可读性和内存的提速方案,都要多问一句

别把理论最优当成无条件最优

面对 AI 写出的算法,先用小输入手算一遍,再用逐渐放大的数据做基准测试。这样才能把「复杂度是纸面推演,耗时曲线才是铁证。让 AI 写一个 基准测试脚本 ,生成三个量级的随机数据各跑一遍计时,亲眼看优化前后的曲线差多远——顺便检验它自报的复杂度有没有吹牛」从一句结论变成可检查的性能判断。

从这个例子继续往下看

这篇内容先从「拿一段 AI 刚写的函数(没有就让它写一个 「找出两个列表里的共同元素」 ——这题它十有八九先给你 O(n²) 的版本)。把下面的提示词甩过去,让它自己交代快慢」展开,再把问题推进到「接着任务一:如果 AI 自报了 O(n²),就要求它优化到 O(n log n) 或 O(n)——但重点不是变快,是让它 说清代价 。学完 ds-6 的你,要能在它的方案里指出「空间换时间」发生在哪一行」。把这两个片段放在一起看,可以更清楚地分辨:哪些是文章给出的事实,哪些是需要结合条件才能成立的判断。

把这条判断带到下一个场景

算法题换成真实任务后,先找出重复工作,再问输入规模如何变化,最后用一个小基准验证理论判断。这样不会把复杂度记成脱离场景的标签。

  • 「挑一档 · 今天就动手」:拿一段 AI 刚写的函数(没有就让它写一个 「找出两个列表里的共同元素」 ——这题它十有八九先给你 O(n²) 的版本)。把下面的提示词甩过去,让它自己交代快慢
  • 「继续往下看」:接着任务一:如果 AI 自报了 O(n²),就要求它优化到 O(n log n) 或 O(n)——但重点不是变快,是让它 说清代价 。学完 ds-6 的你,要能在它的方案里指出「空间换时间」发生在哪一行
  • 「最后的要点」:实测曲线是铁证 :纸面复杂度可能吹牛,三档数据量的耗时表不会

最后的「最后的要点」把讨论落到「实测曲线是铁证 :纸面复杂度可能吹牛,三档数据量的耗时表不会」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

✅ 这一课想和你分享的

  • 体检三步走:自报复杂度 → 优化并交代代价 → 实测验证,一步比一步硬核
  • 瓶颈行是抓手:能指出「最慢的是这一行」,验收就有了着力点
  • 优化必谈代价:不谈可读性和内存的提速方案,都要多问一句
  • 实测曲线是铁证:纸面复杂度可能吹牛,三档数据量的耗时表不会
标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 给 AI 写的代码做一次复杂度体检 AI 背后的算法
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助