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

34 阅读2分钟

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

问题分析

题目要求在一个搜索引擎的倒排索引系统中查找两个单词的倒排链的交集。每个倒排链是一个按升序排列的帖子ID数组,表示该单词出现在哪些帖子中。任务是找到两个倒排链的交集,并将结果按从大到小的顺序返回。

例如,给定两个单词的倒排链:

  • a = [1, 2, 3, 7]
  • b = [2, 5, 7]

我们需要找出同时包含“夏天”和“海滩”两个词的帖子ID,交集为 [2, 7],并按从大到小排序输出 [7, 2]

思路与方法

  1. 问题归结为求两个已排序数组的交集

    • 给定两个已按升序排序的数组 ab,我们需要找出它们的交集,并将交集按降序排列。
    • 交集问题是经典的集合运算问题,且在已排序的情况下,我们可以通过双指针方法高效地计算交集。
  2. 双指针方法

    • 由于两个数组都是升序排序的,我们可以使用两个指针分别指向

      a
      

      b
      

      的当前元素,并比较它们:

      • 如果 a[i] == b[j],说明当前元素同时出现在两个数组中,加入结果列表,并同时移动两个指针。
      • 如果 a[i] < b[j],说明 a[i]b 中不存在,需要移动指针 i
      • 如果 a[i] > b[j],说明 b[j]a 中不存在,需要移动指针 j
    • 这样,我们就能在 O(n + m) 的时间复杂度内计算出交集,其中 n 和 m 分别是 ab 的长度。

  3. 反向排序

    • 由于题目要求交集结果按从大到小的顺序返回,我们可以在计算出交集后反转结果。
  4. 边界情况

    • 如果两个数组没有交集,返回空数组。
    • 如果一个数组为空,交集也是空数组。
    • 如果两个数组完全相同,则返回原数组的反向排序。

算法步骤

  1. 初始化两个指针 ij,分别指向数组 ab 的起始位置。
  2. 遍历两个数组,按照双指针方法查找交集:
    • 如果 a[i] == b[j],将其加入结果数组。
    • 否则,根据大小关系移动对应的指针。
  3. 完成交集计算后,将结果数组反转。
  4. 返回结果。

代码实现

(在这里可以通过伪代码或描述来呈现)

时间复杂度与空间复杂度分析

  • 时间复杂度:O(n + m),其中 n 是数组 a 的长度,m 是数组 b 的长度。我们只遍历了两个数组一次。
  • 空间复杂度:O(k),其中 k 是交集的大小。由于我们存储的是交集数组,空间复杂度为 O(k)。