编程基础篇 · 你现在能做什么

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

算法篇的收官实战:拿一段真实的 AI 代码,走一遍自报 → 优化 → 实测的完整体检流程。三档任务按投入挑一个,30 分钟起步;走到第三档,你会亲眼看到 AI 自报的复杂度有没有吹牛。

挑一档 · 今天就动手
🥉

任务一 · 自报家门

让 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)」保持职业性怀疑,这正是验收者该有的姿态。

✅ 这一课想和你分享的