algorithm - 大文本中给定关键字的最短短语的长度

标签 algorithm data-structures

这个问题是在采访中问我的一个 friend 的。

给定两个关键字,我们必须在大文本中找到具有给定关键字的最短短语的长度。 关键字可以在该文本中以任何顺序出现。 约束:保持高效的数据结构,这样每次使用不同关键字的查询都不需要解析文本

eg. keywords: "one", "four" text: "one two three four five four six one"

here the shortest such phrase is "four six one" rather than "one two three four"

我们想到的解决方案是: 用文本中的所有单词构建一个 BST。每个节点维护单词的位置。 (这将是一个排序列表)当一个查询来搜索 [O(logn)] 两个词时,找到它们在 [O(n)] 中位置之间的最小差异从而使其有效地 [O(nlogn)]。

我们可以做得更好吗?

最佳答案

您可以使用哈希表作为反向索引,即从单词(关键字)到它们在文本中位置的排序列表的哈希表。得到query的两个关键词后,再去查找他们的出现记录就是O(1)的操作。

找到关联位置之间的最小差异是 O(k) 操作,其中 k 是较长关联列表的长度。在异常情况下,k 可能接近 n,但在实际使用中并非如此(除非您使用“the”和“a”作为两个关键字,但这些类型的词,称为停用词,通常被排除在完整仍然是文本搜索)。

在通常情况下,k 与 n 相比非常小,因此这应该非常快,即 O(1) + O(更常见关键字的出现次数)。

关于algorithm - 大文本中给定关键字的最短短语的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10493128/

相关文章:

c - long int 数组导致错误 : subscripted value is neither array nor pointer nor vector

java - 打印所有非零数字按升序排列的数字

c# - 如何对环绕的数字序列进行排序

algorithm - 如何找到无向图的两个不相交的生成树

c++ - 订单统计实现

java - 具有大量变异的矩阵的最佳数据结构

c - 如何对字符进行优先排序?

algorithm - 为什么这个算法的空间复杂度是O(1)

python - 如何通过快速查找维护双端队列?

algorithm - 插入缩写词