给定字符串的逐字超级字符串搜索

时间:2013-03-30 05:43:58

标签: string algorithm match

对于任何输入字符串,我们需要按任意顺序找到超级字符串匹配。即输入字符串中的所有单词必须以输出字符串中的任何顺序出现。 例如给定的数据集: “字符串搜索” “java字符串搜索” “手动c字符串搜索等于” “java搜索代码” “c java code search” ...

输入:“java搜索” 输出: 1)“java字符串搜索” 2)“java搜索代码” 3)“c java code search”

输入:“搜索c” 输出: 1)“手动c字符串搜索等于” 2)“c java code search”

这可以通过逐字匹配以非常简单的方式完成。主要是我在寻找一个有效的算法。

输入:给定数据集中的几十亿条记录(大多数长度为1到10个字符串)。 我需要为数百万字符串找到超级字符串。 注意:单词是扩展词典。

2 个答案:

答案 0 :(得分:1)

预处理您的输入(如果可能),并索引数据集中显示的单词。生成从每个单词到一组可能的输出字符串的映射。例如,使用数据集

0 string search
1 java string search
2 manual c string search equals
3 java search code
4 c java code search

我们得到了

c {2,4}
code {3,4}
equals {2}
java {1,3,4}
...

然后,搜索给定输入的匹配就像交叉与输入词对应的集合一样简单:

input: "java c"
output: {1,3,4} intersect {2,4} = {4}

如果您将集合存储为排序列表,则可以通过并行扫描列表,以线性时间(输入集的总长度为线性)完成交集。

答案 1 :(得分:0)

您基本上需要找到两组单词input_words和data_words的交集。如果交集等于input_words,则表示匹配。

以下是集合交集的有效算法:Efficient list intersection algorithm

我想到并以O(n * m)[n =大小输入,m =大小数据]完成的算法是。

的Python:

match = True
for word in input.split():
  if word in data_words.split(): # linear search comparing word to each word
    continue
  else:
    match = False
    break

对排序列表的搜索会更快,哈希查找会更多。这些在上面的链接中有详细说明。