每个人工智能系统都需要快速存储和检索数据。无论是图像中的像素值列表、50,000 个单词的词汇表,还是数百万个用户偏好,数据结构的选择决定了 AI 的思考速度。
两种结构占主导地位:数组和哈希映射。掌握这些,你就为几乎所有人工智能管道奠定了基础。
数组只是并排存储在内存中的项目的编号列表。每个项目都有一个索引 - 它在列表中的位置,从零开始。
index: 0 1 2 3 4
value: ["cat", "dog", "bird", "fish", "frog"]
由于项目彼此相邻,因此您可以直接跳到任何位置。想要第 3 项吗?完成 - 无需搜索。这是 O(1) 访问,这意味着无论数组包含 10 个项目还是 1000 万个项目,都需要相同的时间。
在中间插入或移除物品的成本很高。更改后的每个项目都必须随机排列。那是 O(n) - 项目越多,花费的时间就越长。
如果您有一个包含 10,000 首歌曲的播放列表,并且想要在位置 5 插入新曲目,则位置 5 以后的每首歌曲都需要移动。流媒体服务如何在不减慢速度的情况下处理这个问题?
哈希映射(也称为字典或哈希表)将数据存储为键值对。您可以通过有意义的键来访问项目,而不是通过索引号来访问项目。
word_counts = {
"hello": 42,
"world": 37,
"AI": 156
}
需要计算“AI”吗?哈希映射使用哈希函数在幕后将键转换为索引。结果呢? O(1) 平均查找时间 - 就像数组一样,但使用名称而不是数字。
Python 的字典是哈希映射。当 ChatGPT 在训练期间计算单词频率时,它使用类似哈希映射的结构来跟踪整个互联网文本中数十亿个单词的出现。
|运营|数组|哈希映射 | |------------|--------|----------| |通过索引访问 | O(1) ⚡ |不适用 | |通过钥匙访问 | O(n) 🐢 | O(1) ⚡ | |在末尾插入 | O(1) ⚡ | O(1) ⚡ | |插入中间 | O(n) 🐢 |不适用 | |寻找价值 | O(n) 🐢 | O(1) ⚡ |
将 O(1) 视为“即时,无论大小”,并将 视为“数据越大,速度越慢”。
登录 参与讨论
您有 100,000 个用户个人资料,需要通过用户名查找用户。哪种结构最快?
面试和人工智能中最有用的模式之一是计算发生次数。这是伪代码的想法:
counts = {}
for each word in text:
if word in counts:
counts[word] = counts[word] + 1
else:
counts[word] = 1
通过一次浏览文本就可以知道每个单词的频率。语言模型正是使用这种方法(大规模)来理解哪些单词最重要。
给定一个数字数组和一个目标,找到两个数字相加等于目标值。简单的方法检查每一对 - O(n²)。聪明的方法使用哈希图:
seen = {}
for each number in array:
complement = target - number
if complement in seen:
return [seen[complement], current_index]
seen[number] = current_index
一次通过,O(n) 时间。哈希映射会记住您已经看到的内容。
为什么哈希映射方法进行二和比检查每对更快?
推荐引擎在推荐之前需要检查用户是否已经观看过电影。您会将用户的观看历史记录存储在数组还是哈希映射中?想到什么权衡?
AI 模型将词嵌入存储为每个包含 300 个数字的数组。为什么数组是一个不错的选择?