【问题标题】:Word-wise super string search for given string给定字符串的逐字超级字符串搜索
【发布时间】:2013-03-30 05:43:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你应该使用正则表达式
  • 一个输入字符串与所有数据集(数十亿)的正则表达式比较相当高。现在我需要对另外一百万(如果不是十亿)输入字符串重复该操作!

标签: string algorithm match


【解决方案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}

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

【讨论】:

    【解决方案2】:

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

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

    我想到的一个算法在 O(n*m) [n = size input, m = size data] 内完成。

    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
    

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

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多