AIUnlimited
🌳

AI基础

🌱
AI 种子

从零开始

🌿
AI 萌芽

打好基础

🌳
AI 枝干

付诸实践

🏕️
AI 树冠

深入探索

🌲
AI 森林

精通AI

🔨

AI精通

✏️
AI 草图

从零开始

🪨
AI 雕刻

打好基础

⚒️
AI 匠心

付诸实践

💎
AI 打磨

深入探索

🏆
AI 杰作

精通AI

📘

AI实战

📖
理解开源模型

开源模型的基础知识和资源

🎯
问题到模型任务

将业务问题转化为模型任务

⚡
跑通第一个模型

30分钟快速看到第一个结果

🔧
微调与评测

微调模型并评估性能

🚀
应用系统

构建实际AI应用系统

🎨
生成式AI

探索AIGC的开源模型

🤖
Agent智能体

学习Agent框架和MCP工具

📐
基础补充

LLM基础知识和评测

🎓

Claude 学院

🤖
Claude 101 入门

用 Claude 学习 AI 基础知识

💻
Claude Code 101 入门

让 Claude 成为你的结对编程伙伴

🤝
Claude Cowork 入门

与 Claude 协作完成复杂项目

⚙️
Claude 平台 101

使用 Claude API 构建应用

实验室

已加载 7 个实验
🧬神经网络沙盒🤖AI 还是人类?🥋提示工程道场🏁算法竞速🧠AI 知识挑战🏗️系统设计画布
🎯模拟面试进入实验室→
🚀

职业发展

🚀
面试发射台

开启你的旅程

🌟
行为面试精通

掌握软技能

💻
技术面试

通过编程轮次

🤖
AI与ML面试

ML面试精通

🏆
Offer与未来

拿下最好的Offer

立即开始
AIUnlimited

AI 教育平台

沪ICP备18025655号-11

学习

  • AI基础
  • AI实战
  • Claude学院
  • 实验室
  • 职业发展

社区

  • 关于
  • 常见问题

支持

  • 服务条款
  • 隐私政策
  • 联系我们
AI & 工程学习计划›✏️ AI 草图›课程›链表与栈
🔗
AI 草图 • 中级⏱️ 15 分钟阅读

链表与栈

超越数组 - 动态数据

当您预先知道数据的大小时,数组就非常有用。但是,当数据不可预测地到达时会发生什么——传感器读数流、人工智能要处理的任务队列,或者随着每条消息而增长的对话历史记录?您需要能够优雅地增长和收缩的结构。

输入链表、堆栈和队列 - 动态三重奏。

链表 - 节点和指针

链表将项目存储为节点链。每个节点保存两件事:数据本身和指向链中下一个节点的指针(引用)。

[data: "A" | next: →] → [data: "B" | next: →] → [data: "C" | next: null]

与数组不同,链表节点不会并排位于内存中。它们可以分散在任何地方 - 指针只是告诉您在哪里可以找到下一个。

与具有连续块的数组相比,具有通过箭头连接的三个节点的链表
链表节点通过指针连接,这与并排放置的数组元素不同。

链表与数组

|运营|数组|链接列表 | |------------|---------|-------------| |通过索引访问 | O(1) ⚡ | O(n) 🐢 | |在开头插入 | O(n) 🐢 | O(1) ⚡ | |插入中间 | O(n) 🐢 | O(1)* ⚡ | |从中间删除 | O(n) 🐢 | O(1)* ⚡ | |内存使用情况 |紧凑|额外(指针)|

*一旦找到位置 - 找到它仍然是 O(n)。

当链表获胜时

  • 频繁插入和删除:如果您不断地在集合中间添加和删除项目,链表可以避免数组所需的昂贵的移动。
  • 未知大小:当您不知道要存储多少项时,链表一次会增长一个节点,而无需调整大小。
  • 构建其他结构:堆栈、队列和更复杂的结构通常构建在链表之上。
🤔
Think about it:

浏览器的选项卡栏可让您自由打开、关闭和重新排列选项卡。数组或链表更适合管理打开的选项卡列表吗?考虑一下当您关闭中间的选项卡时会发生什么。

堆栈 - 后进先出 (LIFO)

堆栈的工作方式与一堆盘子完全相同:添加到顶部并从顶部删除。最后放入堆栈的项目是第一个取出的项目。

Push "A" → [A]
Push "B" → [A, B]
Push "C" → [A, B, C]
Pop      → [A, B]  (removed "C")
Pop      → [A]     (removed "B")

两个操作定义一个堆栈:

  • 推送:将项目添加到顶部。
  • 弹出:从顶部删除项目。

两者都是 O(1) - 即时的,无论堆栈大小如何。

现实世界中的堆栈

  • 撤消/重做:每个文本编辑器都维护一堆操作。按 Ctrl+Z,最近的操作将弹出并反转。
  • 浏览器后退按钮:您的浏览历史记录是一个堆栈。每个新页面都会被推送;单击“返回”会弹出当前页面。
  • 调用堆栈:当您的代码调用函数时,该函数将被推送到调用堆栈上。完成后,它就会弹出。这就是程序跟踪它们所在位置的方式。
🤯

当您看到“堆栈溢出”错误时,它的字面意思是调用堆栈空间不足 - 通常是因为函数不断调用自身而不停止(无限递归)。著名的开发者问答网站 Stack Overflow 就是以这个错误命名的。

AI 中的堆栈

第 4 课,共 10 课已完成 0%
←排序与搜索

讨论

登录 参与讨论

  • 表达式评估:AI编译器和解释器使用堆栈来评估神经网络计算图中的数学表达式。
  • 回溯算法:当人工智能探索可能的解决方案(例如解决迷宫)时,它会使用堆栈来记住它去过的位置,以便可以回溯。
  • 深度优先搜索:深度优先遍历树和图自然会使用堆栈 - 我们将在下一课中探讨这一点。
🧠小测验

您正在为绘图应用程序实现”撤消”功能。哪种数据结构最能模拟行为历史?

队列 - 先进先出 (FIFO)

队列就像商店里的队列一样:第一个加入的人就是第一个被服务的人。项目在后面添加,从前面删除。

Enqueue "A" → [A]
Enqueue "B" → [A, B]
Enqueue "C" → [A, B, C]
Dequeue     → [B, C]  (removed "A")
Dequeue     → [C]     (removed "B")

两个操作定义一个队列:

  • 入队:将一个项目添加到后面。
  • 出队:从前面删除项目。

现实世界中的队列

  • 打印队列:文档按照提交的顺序打印。
  • 任务调度:操作系统使用队列来管理接下来运行哪些进程。
  • 消息队列:Web 应用程序使用队列(如 RabbitMQ 或 Kafka)来处理数千个请求,而不会丢失任何请求。

AI 中的队列

  • 广度优先搜索(BFS):使用队列逐级探索图 - 我们将在树和图课程中看到这一点。
  • 训练数据管道:训练数据加载到队列中,以便 GPU 始终准备好下一批数据,从而防止出现空闲时间。
  • 请求处理:当数千个用户同时查询AI API时,请求进入队列并按顺序处理。
🧠小测验

AI API 每秒接收 10,000 个请求。哪种结构可确保请求按照到达的顺序进行处理?

💡

有一个优先级队列,其中项目根据优先级而不是到达顺序出队。人工智能系统使用优先级队列首先处理紧急任务 - 例如,自动驾驶汽车可能会优先考虑障碍物检测而不是路线规划。

真正的 AI 使用:序列处理和内存管理

序列处理

语言模型将文本作为序列进行处理。在底层,PyTorch 和 TensorFlow 等框架使用类似链表的结构来构建计算图 - 每个步骤都指向下一个步骤的操作链。

ML 框架中的内存管理

训练神经网络时,随着张量(多维数组)的创建和销毁,内存会不断分配和释放。内存分配器通常使用空闲内存块的链表,为新张量找到合适的空间。

🤔
Think about it:

聊天机器人需要记住对话中的最后 10 条消息,但丢弃较旧的消息。你会使用堆栈、队列还是其他东西?当第 11 条消息到达时会发生什么?

🧠小测验

关于链表的哪项陈述是错误的?

🤯

大多数应用程序中的撤消历史记录都有限制 - 通常为 100 到 1,000 个操作。如果没有这个限制,堆栈将消耗不断增长的内存。一些高级系统使用堆栈和队列(“双端队列”)的组合来保留最新的操作,同时丢弃最旧的操作。

要点

  • 链表擅长频繁插入和删除的动态数据,但牺牲了直接索引访问。
  • 堆栈 (LIFO) 强大的撤消系统、回溯和深度优先遍历。
  • 队列 (FIFO) 确保任务调度、BFS 和请求处理中的公平排序。
  • 这些结构通常在人工智能框架的幕后工作,管理内存和处理序列。
  • 在数组和链接结构之间进行选择取决于您的访问模式 - 随机访问有利于数组,动态修改有利于链接列表。