我的问题陈述是我得到了数百万字符串,我必须找到一个子字符串,它们可以出现在任何字符串中。 例如给出的是" xyzoverflowasxs,werstackweq"我必须找到一个名为" stack"的给定子字符串,它应返回" werstackweq"。我们可以用什么样的数据结构来解决这个问题?
我认为我们可以为此使用后缀树,但是想要对此问题提出更多建议。
答案 0 :(得分:1)
我认为可行的方法是使用包含实际单词的字典,以及指向此字典中条目的另一个数据结构。一种方法是使用后缀树及其变体,如问题和评论中所述。我认为以下是一个更简单(启发式)的替代方案。
假设您选择一些整数 k 。对于每个字符串,在每个字符串中找到长度 k 的 k Rabin Fingerprints应该是高效且简单的(任何语言都有实现)。
因此,对于给定的 k ,您可以拥有两个数据结构:
将每个指纹映射到第一个数据结构中的链表节点指针数组的字典。
给定一个长度为 k 或更大的单词,您可以选择 k 子词,计算其Rabin指纹,找到包含此指纹的单词,并检查它们是否为确实包含这个词。
问题是要使用哪个 k ,以及是否使用多个 k 。我会通过实验尝试(同时从一些小的 k 值开始,例如,1,2和3,以及几个较大的值)。无论如何,这种启发式的表现取决于你的字典和查询的分布。