对应音频:base03-播客.mp3 | 集页:https://xueai-podcast.pages.dev/t/base03/
取材:小山学堂《学 AI 产品,从入门到精通》编程基础篇(algo-8 ~ algo-10、algo-summary、algo-build、ds-7、ds-8、ds-summary、ds-build)
定位:面向工程师与重度玩家。你不必自己写得出这些代码,但你要看得穿 AI 交出来的代码是「能跑通」还是「能上线」。
听完之后,你应该能在四类场景里立刻做出判断。这张表就是本集的能力地图,也是后面所有审查动作的索引。
| 你看到的现象 | 该动用哪副眼镜 | 你要追问的那句话 |
|---|---|---|
| AI 在几百个文件里找 Bug、找定义、找引用 | 图搜索(BFS / DFS) | 它是先扫一层还是一路钻到底?能不能直接跳跃? |
| 同样的提示词,两次生成结果不一样 | 贪心 / 采样(Temperature) | 这个任务该不该要随机性?温度定在多少、为什么? |
| 生成结果「每个词都对、连起来别扭」 | Beam Search(束宽) | 它是一次定死还是多留了几条路?束宽多大、算力花在哪? |
| AI 改代码改得准 / 改错了一大片 | 树(AST) | 它是在树上做手术,还是在做文本替换? |
| 多个 AI 步骤卡住不动、互相等待 | 图(DAG,查环) | 这张依赖图查过环吗?哪些步骤本来可以并行? |
| 数据结构选型看不出好坏 | 八种收纳方式 | 数据放哪、怎么找、怎么进出、翻一千倍会怎样? |
一句话概括:搜索策略决定它「怎么想」,数据结构决定它「怎么存」,复杂度决定它「撑不撑得住」。三问下来,验收结论就有了。
同一个迷宫,两种走法,四个数字讲完全部理论。
| 策略 | 访问格子数 | 最终路径长 | 内存 | 保证 |
|---|---|---|---|---|
| BFS(广度优先) | 77 | 23 | 高(泡着一大片) | 撞到终点的路径必然最短 |
| DFS(深度优先) | 44 | 37 | 低(只记当前一条路) | 不保证短,还可能回溯 |
工程含义很直接:
ls 扫一层建立全局感(BFS),锁定目标后钻进去深挖(DFS),必要时用 grep 直接跳跃——跳跃是比两者都便宜的第三条路。盲点在于:每步的局部最优,加起来不一定是整体最优。自助餐那个比喻就是这个意思——每一轮都拿当下最贵的菜,最后吃不到真正的主打。
选型规则:
| 任务类型 | 建议 | 理由 |
|---|---|---|
| 复现实验、写代码、抽取结构化数据 | Temperature = 0 | 要的是确定性,不要惊喜 |
| 头脑风暴、文案、创意发散 | Temperature 调高 | 要的是多样性,可接受抖动 |
词格实验的三个累计分:0.072 < 0.098 < 0.101,对应的计算量:12 → 21 → 30 个候选。
只要有「层级 + 包含」关系,它就是树。文件目录、JSON、网页 DOM、代码语法树(AST),形状完全一致。三个术语够用一辈子:根、父节点、叶子。
关键认知:AI 改代码精准,是因为它看的不是文字,是 AST。你说「把乘号右边的变量改成 quantity」,它先找到 * 节点,再取右孩子,改完把树打印回文字。重命名、抽取函数、批量重构,全是在树上做手术,不是文本替换。
推论:你调大模型 API 发的 message list、RAG 检索回来的资料、Agent 之间传的任务——几乎全部打包成 JSON,因为 JSON 就是一棵用文字写出来的树。
图 = 节点 + 关系,就这一个公式。社交网络、地图导航、知识图谱、Agent 工作流,全都是图。
两个主场:
顺带一提:并行提速就藏在这张图里——没有依赖关系的任务可以同时开工。所以验收时要问的不仅是「有没有环」,还有「哪些步骤本来可以并行却被串行了」。
遇到任何数据场景,只问两个问题,再配一条横切心法,就能定位到结构。
| 结构 | 口诀 | 强项 | 弱项 | AI 里的真身 |
|---|---|---|---|---|
| 数组 | 排排坐,按号找 | 按位置直达、末尾追加快 | 中间插入/删除要全体挪位 | message list:你和 AI 的每句对话都躺在里面 |
| 栈 | 后进先出 | 撤销、回溯、原路返回 | 只能动最上面那一个 | 撤销栈、函数调用、Agent 子任务;递归失控就爆栈 |
| 队列 | 先进先出 | 排队公平、削峰兜底 | 不能插队,中间取不到 | 任务队列、消息队列:Agent 的活是排着队干的 |
| 哈希表 | 算出位置,一步直达 | 查找/去重快到不讲理 | 没有顺序,还要多花内存 | Set / 字典、session 查找、缓存键、语料去重 |
| 缓存 | 算过的别再算 | 省时间也省钱 | 何时作废最难拿捏 | KV Cache、语义缓存、CDN——账单的隐形折扣 |
| 树(含 Trie) | 层层分叉,按层级找 | 天然表达嵌套与从属 | 只认父子关系,平级互连表达不了 | 文件目录、JSON、AST;Trie 是分词器的秘密 |
| 图 | 万物皆可连 | 表达任意多对多关系 | 容易绕圈,遍历成本高 | 知识图谱、社交网络、多 Agent 协作的 DAG |
| 向量 | 语义变坐标,相似即邻近 | 按「像不像」找东西 | 结果是近似的,还得配专门索引 | Embedding + RAG 检索;HNSW 让亿级瞬答 |
决策心法两问一横切:怎么找(位置→数组,key→哈希,层级→树,关系→图,相似→向量);怎么进出(先进先出→队列,后进先出→栈);横切(算过的别再算→缓存)。
复杂度那一栏别忘了最后补一刀:注意力是 O(n²),上下文越长计算量按平方涨,账单也按平方涨。所以「翻一千倍会怎样」永远值得问——它是区分演示级和生产级的分水岭。
拿一段 AI 刚写的代码(没有就让它现写一个「通讯录去重」小工具)。把这段话甩过去:
针对你刚才写的这段代码,请回答三个问题,用大白话:
1. 你用了什么数据结构来存这些数据?
2. 为什么选它而不是别的?说出至少一个被你放弃的备选方案和放弃理由。
3. 如果数据量翻一千倍,这段代码会变慢多少?哪一行最先扛不住?
如果你发现自己刚才的选择不是最优的,请诚实说出来并给出更好的版本。
完成标准:你能用自己的话向别人转述「它用了什么结构、为什么、数据变多会怎样」这三个答案。转述不出来就再追问一轮。
请把刚才这个功能用另一种数据结构重新实现一遍,然后:
1. 两个版本的完整代码都贴出来,关键行加注释;
2. 列一张优劣对照表,至少比较四个维度:查询速度、插入速度、内存占用、代码可读性;
3. 分别说明什么场景下版本 A 更好、版本 B 更好,各举一个具体例子;
4. 不要替我下结论,把判断留给我。
我的场景是:(例如「个人工具,数据最多几百条」或「要上线给几万人用」)
完成标准:你能说出「因为我的数据量是 X、最频繁的操作是 Y,所以选它」。说不出这句话,说明判断还是 AI 替你做的。
先过一遍选型前自查清单:数据会涨到多大/最频繁的操作是查还是插/要不要保持顺序/要不要去重/值不值得上缓存。
我有一个真实需求要做数据结构选型,我已经自己选好了,先别给答案:
我的需求:(一句话)我的场景参数:数据量约 X 条、最频繁的操作是 X、是否需要顺序 X、是否需要去重 X、同样的查询是否反复出现 X。
请你:1. 独立给出选型方案和理由;2. 给出在我的数据量下的性能预估;3. 说明数据量涨 10 倍后方案要不要变、怎么变。
你答完后我会公布我自己的选择,我们对答案。
完成标准:一致就互相验证,不一致就辩论。怕的是从头到尾没自己选过——反过来的话,AI 的答案会瞬间覆盖你的思考。
针对你刚写的这个函数,做一次复杂度自查:
1. 逐行标注时间复杂度,每处一句话解释为什么;
2. 明确指出瓶颈行在哪、为什么是它;
3. 汇总整体时间与空间复杂度;
4. 翻译成人话:数据从 1 千涨到 100 万,会慢多少倍?用户体感是「无感」「卡一下」还是「转圈转到怀疑人生」?
进阶:让它写一个基准测试脚本,生成三档随机数据(1 千 / 10 万 / 1000 万 条,跑不动允许降到 100 万并说明原因),新旧两版各跑 3 次取平均,输出 数据量 | 旧版耗时 | 新版耗时 | 倍数差 对比表,最后回答「实测曲线和自报复杂度吻合吗」。
数据结构管收纳,算法管处理,复杂度管上限,三件事合成一副眼镜。戴上它,AI 交出来的代码你不用会写,但你看得穿——而看不看得穿,就是「能跑通」和「能上线」之间那段距离。
*来源:xueai.miyang.cn(小山学堂 · 洛小山《学 AI 产品,从入门到精通》)。本集为二次演绎的解读与配音版本,素材取自该课程编程基础篇的算法与数据结构章节。*