
1) 【一句话结论】:采用倒排索引(标签-题目ID列表映射)实现多条件检索,通过标签快速定位题目并求交集,时间复杂度约为O(k),远优于线性扫描的O(n)(n=10万)。
2) 【原理/概念讲解】:核心是倒排索引。将每个标签(如“难度10-15”“几何”“三角形”)作为键,值是包含该标签的所有题目ID列表。检索时,对每个查询条件(标签),查询对应的ID列表,再求这些列表的交集,得到符合条件的题目ID。类比:图书馆的索引卡,每个主题(标签)对应所有包含该主题的书籍(题目),检索时查多个主题的交集,快速找到相关书籍,避免逐本翻找。
3) 【对比与适用场景】:
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 线性扫描 | 遍历所有题目,逐个检查标签 | 时间复杂度O(n),n=10万 | 标签数量少,条件简单 | 高效性差,不适合多条件检索 |
| 倒排索引 | 标签→题目ID列表映射 | 时间复杂度O(k),k=标签数 | 多条件、高频检索 | 需额外空间存储索引 |
| 哈希表 | 标签→哈希值→题目ID | 平均时间O(1),空间O(n) | 标签唯一,快速单条件检索 | 标签冲突或重复导致性能下降 |
| B树/平衡树 | 标签排序+树结构 | 时间复杂度O(log n) | 标签有序,范围查询(如难度范围) | 维护成本高 |
4) 【示例】:伪代码
# 题目结构:id, tags(列表,如["难度12", "类型几何", "知识点三角形"])
index = {} # 标签: [题目id列表]
for 题目 in 题库:
for tag in 题目.tags:
if tag not in index:
index[tag] = []
index[tag].append(题目.id)
def search(conditions):
result_ids = None
for tag in conditions:
if tag not in index:
return [] # 无匹配
current_ids = index[tag]
if result_ids is None:
result_ids = current_ids
else:
# 求交集
result_ids = list(set(result_ids) & set(current_ids))
return result_ids
示例:检索条件为难度10-15、类型几何、知识点三角形,结果为同时满足三个标签的题目ID列表。5) 【面试口播版答案】:面试官您好,针对10万道题的题库,多条件检索,核心思路是用倒排索引。具体来说,就是为每个标签(难度、类型、知识点)建立一个列表,记录所有包含该标签的题目ID。检索时,对每个条件标签,查询对应的ID列表,然后求这些列表的交集,得到符合条件的题目。这样时间复杂度是O(k),k是标签数量,比遍历所有题目O(10万)高效得多,特别适合多条件、高频检索场景。
6) 【追问清单】:
7) 【常见坑/雷区】: