刷题笔记5-小S的倒排索引

168 阅读5分钟

题目解析

题目要求在给定的两个倒排索引列表中找到交集,并按从大到小的顺序输出这些交集中的元素。倒排索引本质上是一个列表,每个元素代表一个帖子的ID,且按从小到大的顺序排列。通过对两个列表进行交集运算并对结果进行排序,能够帮助我们更高效地找到同时包含这两个单词的帖子ID。

解题思路

  1. 倒排索引的交集:题目给定了两个按从小到大排序的列表,我们的目标是求出这两个列表的交集。交集意味着两个列表中相同的元素,且这些元素按升序排列。

  2. 交集后的排序:题目要求输出的结果按从大到小的顺序排列,而默认的交集计算是按升序排列的,所以我们需要在得到交集后进行反转操作。

  3. 算法选择

    • 双指针法:由于两个输入列表 a 和 b 都已经是排序过的,我们可以使用双指针的方法来高效地计算交集。

      • 使用两个指针 i 和 j 分别遍历 a 和 b

      • 比较 a[i] 和 b[j] 的值:

        • 如果相等,说明当前元素属于交集,将其加入结果中,并同时移动两个指针。
        • 如果 a[i] 小于 b[j],说明 a[i] 在 b 中没有对应的元素,需要移动指针 i
        • 如果 a[i] 大于 b[j],说明 b[j] 在 a 中没有对应的元素,需要移动指针 j
  4. 时间复杂度:由于两个列表都是排序的,使用双指针遍历的时间复杂度是 O(n + m),其中 nm 分别是两个列表的长度。

代码详解

python
def find_common_posts(a, b):
    # 初始化两个指针,指向ab的开头
    i, j = 0, 0
    result = []
    
    # 双指针遍历两个列表
    while i < len(a) and j < len(b):
        if a[i] == b[j]:
            result.append(a[i])  # 找到交集元素,加入结果
            i += 1
            j += 1
        elif a[i] < b[j]:
            i += 1  # a中的元素小于b中的元素,移动a的指针
        else:
            j += 1  # b中的元素小于a中的元素,移动b的指针
    
    # 将结果反转,按从大到小输出
    return result[::-1]

代码详解

  1. 初始化指针:我们设置两个指针 ij,分别指向列表 ab 的起始位置。

  2. 双指针遍历:我们通过一个 while 循环,遍历两个列表,直到至少一个列表完全遍历结束。在循环内,进行以下操作:

    • 如果 a[i] == b[j],说明找到了一个交集元素,加入到 result 中,并同时移动两个指针。
    • 如果 a[i] < b[j],说明 a[i] 在 b 中没有对应的元素,所以移动指针 i,继续向前查找。
    • 如果 a[i] > b[j],说明 b[j] 在 a 中没有对应的元素,移动指针 j
  3. 反转结果:由于题目要求输出的是按从大到小的顺序,所以我们在得到交集后将结果反转,使用 [::-1] 实现反转。

  4. 返回结果:最终返回交集的结果。

示例解析

  1. 样例1a = [1, 2, 3, 7]b = [2, 5, 7]

    • 交集为 [2, 7],反转后输出 [7, 2]
  2. 样例2a = [1, 4, 8, 10]b = [2, 4, 8, 10]

    • 交集为 [4, 8, 10],反转后输出 [10, 8, 4]
  3. 样例3a = [3, 5, 9]b = [1, 4, 6]

    • 交集为空,输出 []
  4. 样例4a = [1, 2, 3]b = [1, 2, 3]

    • 交集为 [1, 2, 3],反转后输出 [3, 2, 1]

知识总结

  • 倒排索引:倒排索引是常见的搜索引擎数据结构,每个单词映射到一个包含该单词的文档列表。在实际应用中,倒排索引可以帮助我们快速找到与查询词相关的文档。
  • 双指针法:双指针法是处理两个已排序数组交集问题的经典算法。通过两个指针同时扫描两个数组,可以在 O(n + m) 的时间复杂度内解决问题,相较于暴力的 O(n * m) 的解法效率高。
  • 结果排序:在得到交集之后,根据题目要求,需要对结果进行排序,这里使用了数组的反转操作。

学习建议

  1. 理解基本数据结构:倒排索引是搜索引擎中常见的优化技术,理解它的工作原理对于学习更复杂的搜索引擎算法非常有帮助。
  2. 掌握双指针技巧:双指针法是处理两个已排序数组或链表问题的常用技巧,掌握它能够帮助你高效解决许多类似问题。
  3. 多做题练习:刷题是提高编程能力的有效方法,建议定期在平台上做题,特别是练习算法和数据结构相关的题目。

学习计划

  1. 制定刷题计划

    • 每天刷1-2题,循序渐进,逐步提高。
    • 按照难度分阶段刷题,从简单的交集问题到复杂的搜索引擎实现,逐渐掌握更高级的技巧。
  2. 利用错题进行针对性学习

    • 对于每一道做错的题目,首先要搞清楚错在哪里,查阅相关知识点并通过模拟练习加深理解。
    • 将错题收集到错题本中,定期复习,确保每一个错误都能在下次避免。

工具运用

结合 AI 刷题功能,我们可以利用平台提供的即时反馈机制,快速理解错题原因。平台还提供了代码优化建议和思路引导,帮助学生更快地掌握解题技巧,避免重复犯错。

通过与其他学习资源的结合(如视频教程、书籍、在线讲解等),可以从多个角度理解算法,增强记忆和理解效果。