【问题标题】:algorithm for testing mutliple substrings in multiple strings用于测试多个字符串中的多个子字符串的算法
【发布时间】:2011-06-27 00:47:39
【问题描述】:

我有几百万个字符串 X,每个字符串都少于 20 个左右的单词。我还有一个包含数千个候选子字符串 C 的列表。对于 X 中的每个 x,我想看看 C 中是否有任何字符串包含在 x 中。现在我正在使用一个幼稚的双循环,但已经有一段时间了,它还没有完成......有什么建议吗?如果有人知道一个不错的实现,我正在使用 python,但是任何语言或通用算法的链接也很好。

【问题讨论】:

  • @ruslik: 以及,哈希究竟如何在这里提供帮助?

标签: python algorithm string substring


【解决方案1】:

将您的一组字符串编码为trie(我推荐更大的一组)。查找时间应该比不完美的散列更快,并且您也会节省一些内存。

【讨论】:

    【解决方案2】:

    这将是一个漫长的时间。您必须对照这几千个候选子字符串中的每一个检查这几百万个字符串中的每一个,这意味着您将进行(几百万 * 几千)个字符串比较。是的,这需要一段时间。

    如果您只打算执行一次或很少执行此操作,我建议您使用fgrep。如果这是您经常要做的事情,那么您需要考虑实现类似Aho-Corasick string matching 算法的东西。

    【讨论】:

      【解决方案3】:

      如果您的 x in X 仅包含单词,并且您只想匹配单词,您可以执行以下操作:

      将您的关键字插入一个集合中,生成访问 log(n),然后检查 x 中的每个单词是否包含在该集合中。

      喜欢:

      keywords = set(['bla', 'fubar'])
      for w in [x.split(' ') for x in X]:
          if w in keywords:
              pass # do what you need to do
      

      一个不错的选择是使用 google 的 re2 库,它使用超级好的自动机理论来产生高效的匹配器。 (http://code.google.com/p/re2/)

      编辑:确保使用适当的缓冲和编译语言中的某些东西,这会使其速度更快。如果它小于几千兆字节,它也应该与 python 一起使用。

      【讨论】:

        【解决方案4】:

        你可以尝试使用正则表达式

        subs=re.compile('|'.join(C))  
        for x in X:  
            if subs.search(x):  
                print 'found'  
        

        【讨论】:

          【解决方案5】:

          看看http://en.wikipedia.org/wiki/Aho-Corasick。您可以为一组固定字符串在时间上与字符串的总大小呈线性关系构建模式匹配器,然后在文本或多个文本部分中搜索,在时间上与文本长度 + 找到的匹配数呈线性关系.

          另一个快速精确模式匹配器是http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorithm

          【讨论】:

            猜你喜欢
            • 2015-11-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-02
            • 2016-09-10
            • 1970-01-01
            • 2017-04-30
            相关资源
            最近更新 更多