小 S 的倒索引问题解析 | 豆包 MarsCode AI 刷题

36 阅读4分钟

一、问题描述

这是一个关于倒索引的编程问题。小 S 正在帮助朋友建立搜索引擎,倒索引的工作原理是每个单词都会关联一个帖子 ID 的列表,这些帖子包含该单词,且 ID 按从小到大的顺序排列。例如,单词 “夏天” 可能出现在帖子 1、帖子 3 和帖子 7 中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含 “夏天” 和 “海滩” 的帖子,小 S 需要找出两个倒排链的交集,并将结果按照从大到小的顺序输出。给定两个单词的倒排链数组 a 和 b,要求找出同时包含这两个单词的帖子 ID,并按从大到小的顺序返回结果。

二、解题思路

双指针法

初始化两个指针,分别指向数组 a 和 b 的起始位置。

比较两个指针所指向的元素。

如果元素相等,说明找到了一个交集元素,将其添加到结果列表中,然后同时将两个指针向后移动一位。

如果 a [i]<b [j],则将 a 的指针 i 向后移动一位,因为 a 中较小的元素不可能是交集元素了。

如果 a [i]>b [j],则将 b 的指针 j 向后移动一位,因为 b 中较小的元素不可能是交集元素了。

重复上述比较过程,直到其中一个指针超出数组范围。

最后将结果列表按从大到小的顺序排序并返回。

三、代码详解

以下是给出的 Python 代码:

def solution(a, b):

    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

        elif a[i] > b[j]:

            j += 1

    return sorted(result, reverse=True)

def solution(a, b)::定义了一个名为 solution 的函数,它接受两个参数 a 和 b,分别代表两个倒排链数组。

i, j = 0, 0:初始化两个指针 i 和 j,初始值都为 0,表示从数组的起始位置开始。

result = []:初始化一个空列表,用于存储找到的交集元素。

while i < len(a) and j < len(b)::只要两个指针都没有超出各自数组的范围,就继续循环。

if a[i] == b[j]::如果两个指针所指向的元素相等,就将该元素添加到结果列表中,然后两个指针都向后移动一位。

elif a[i] < b[j]::如果 a [i] 小于 b [j],说明 a 中的这个元素不可能是交集元素,将 a 的指针 i 向后移动一位。

elif a[i] > b[j]::如果 a [i] 大于 b [j],说明 b 中的这个元素不可能是交集元素,将 b 的指针 j 向后移动一位。

return sorted(result, reverse=True):最后将找到的交集元素列表按从大到小的顺序排序并返回。

四、个人思考

算法选择

双指针法在处理这类有序数组求交集的问题时非常高效。它的时间复杂度为 O (m + n),其中 m 和 n 分别是两个数组的长度。这是因为在最坏的情况下,两个指针总共需要遍历两个数组一次。相比之下,如果使用暴力解法,即两层嵌套循环来比较两个数组中的每一个元素,时间复杂度将达到 O (m×n),效率要低得多。

代码优化

在上述代码中,最后的sorted(result, reverse = True)语句可以进行优化。如果在寻找交集元素的过程中,直接将元素插入到合适的位置,使得结果列表始终保持从大到小的顺序,就可以省去最后这一步排序操作。例如,可以使用插入排序的思想,每次找到一个交集元素时,将其插入到结果列表的合适位置。

应用场景

这种倒索引和求交集的方法在搜索引擎中非常常见。搜索引擎需要快速地从大量的文档中找到包含用户查询关键词的文档。通过倒索引,可以快速定位到包含某个单词的文档列表,然后通过求交集等操作,可以找到同时包含多个关键词的文档。此外,在数据库查询中,当处理多条件查询时,也会用到类似的方法来快速筛选出符合条件的数据。

拓展思考

如果有多个倒排链需要求交集,双指针法可以进行扩展。可以使用多个指针分别指向多个数组,通过比较和移动指针来找到所有数组的交集元素。不过,随着数组数量的增加,代码的复杂度会相应提高,需要更仔细地处理指针的移动和元素的比较逻辑。

总之,这个问题通过双指针法有效地解决了两个有序倒排链数组求交集的问题,在实际应用中具有重要的意义,同时也可以进行进一步的优化和拓展。