小S的倒排索引| 豆包MarsCode AI刷题

40 阅读3分钟

题目描述

小J正在帮助她的朋友们建立一个搜索引擎。为了让用户更快地找到他们感兴趣的帖子,小J决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,ID按从小到大的顺序排列。例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排结果是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小J需要找到两个倒排链的交集,且将结果按从大到小的顺序输出。

现在题目给定两个单词的倒排链数组 ab,请帮助小J找到同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。

题目拆解

  1. 理解倒排索引:倒排索引是一种快速检索文本内容的数据结构。它会记录每个单词在哪些文档中出现,并把这些文档的ID按顺序存储。这里,数组 ab 就是两个单词的倒排索引结果。
  2. 交集操作:用户想查找同时包含两个单词的帖子,因此我们需要找到 ab 的交集,即同时在两个数组中出现的帖子ID。
  3. 按降序排列结果:找到交集后,题目要求我们将结果按从大到小的顺序输出。

示例讲解

示例1

  • 输入:a = [1, 2, 3, 7], b = [2, 5, 7]
  • 交集:[2, 7]
  • 输出结果:[7, 2](按降序排序)

示例2

  • 输入:a = [1, 4, 8, 10], b = [2, 4, 8, 10]
  • 交集:[4, 8, 10]
  • 输出结果:[10, 8, 4](按降序排序)

示例3

  • 输入:a = [3, 5, 9], b = [1, 4, 6]
  • 交集:[]
  • 输出结果:[](没有共同的帖子ID)

示例4

  • 输入:a = [1, 2, 3], b = [1, 2, 3]
  • 交集:[1, 2, 3]
  • 输出结果:[3, 2, 1](按降序排序)

解决方案思路

  1. 转换为集合:将数组 b 转换为集合,这样可以快速判断某个元素是否在 b 中。
  2. 查找交集:遍历数组 a,只保留同时出现在 ab 中的元素。
  3. 排序输出:将找到的交集按从大到小的顺序排列,形成最终结果。

代码实现

以下是代码实现的详细解释:

python
复制代码
def solution(a, b):
    # 将数组 b 转换为集合 set_b,用于快速查找
    set_b = set(b)
    # 列表推导式筛选出同时在 a 和 b 中的元素
    result = [x for x in a if x in set_b]
    # 按从大到小排序输出
    return sorted(result, reverse=True)

代码详细解读

  1. set_b = set(b): 将 b 转换成集合 set_b。这样做是为了加快查找速度,使我们可以在常数时间内判断一个元素是否存在于 b 中。
  2. result = [x for x in a if x in set_b]: 这是一个列表推导式,它会遍历数组 a 中的所有元素。如果一个元素在 set_b 中,也就是同时在 ab 中,那么就将这个元素添加到结果列表 result 中。
  3. return sorted(result, reverse=True): 将 result 按降序排列并返回。sorted 函数带有参数 reverse=True,表示按照从大到小的顺序排序。

时间复杂度分析

  • 转换为集合的时间:将 b 转换为集合的时间复杂度是 O(m)O(m)O(m),其中 mmm 是数组 b 的长度。
  • 查找交集的时间:遍历数组 a 并查找交集的时间复杂度是 O(n)O(n)O(n),其中 nnn 是数组 a 的长度。
  • 排序的时间:对结果列表 result 排序的时间复杂度是 O(klog⁡k)O(k \log k)O(klogk),其中 kkk 是交集的元素数量。

因此,该算法的总时间复杂度为 O(n+m+klog⁡k)O(n + m + k \log k)O(n+m+klogk),能够高效地处理较大的输入。