对于任何输入字符串,我们需要按任意顺序找到超级字符串匹配。即输入字符串中的所有单词必须以输出字符串中的任何顺序出现。 例如给定的数据集: “字符串搜索” “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个字符串)。 我需要为数百万字符串找到超级字符串。 注意:单词是扩展词典。
答案 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
对排序列表的搜索会更快,哈希查找会更多。这些在上面的链接中有详细说明。