【问题标题】:Is there a better way to find all the contiguous substrings of a string that appear in a given dictionary有没有更好的方法来查找出现在给定字典中的字符串的所有连续子字符串
【发布时间】:2017-02-05 20:14:01
【问题描述】:

是否有比以下算法更有效的算法来查找属于给定语言的所有子字符串的字母表:

import string.ascii_lowercase as alphabet
languge = {'aa', 'bc', 'wxyz', 'uz'};
for i in xrange(len(alphabet)):
    for j in xrange(i,len(alphabet)):
        substirng = alphabet[i:j+1]
        if substirng in languge:
            print substirng

【问题讨论】:

  • 提示:import string.ascii_lowercase as alphabet
  • 对我来说看起来很高效,只有 351 次检查。为什么要问?
  • @GordonLinoff N-gram 在这里有什么帮助?
  • @StefanPochmann 如果我们的字典很大怎么办?
  • @0x90 。 . .我收回之前说过的话。只有在内存有限的环境中,减少字典的大小才是一个问题。如果字典适合内存,那么看起来会很快。

标签: python algorithm python-2.7 substring


【解决方案1】:

如果我正确理解您的问题。你有一个字母表或字符串。在这种情况下,一个 26 个字符的字符串,a-z。您希望检查给您的任何字符串是否是上述“字母字符串”的子字符串。

如果确实如此,还有更好的办法。

您当前的方法相当于计算字母表中所有可能的子字符串,在大小为 N 的字母表的一般情况下为 O(N^2),在您的特定情况下为 26^2,然后检查子字符串是否属于您的预定义集。一个更好的方法是简单地循环你给定的字符串和check if they are substrings of your alphabet。对于预定义集中的每个字符串,这是一个 O(N) 操作。这将复杂度降低到 O(NM)。

如果 M 明显小于 N,这会更好。

可能还有更好的方法,但这是一个好的开始。

【讨论】:

    【解决方案2】:

    使用用于此目的的 Aho-CorasickRabin-Karp 算法:

    它是一种字典匹配算法,用于定位元素 输入文本中的一组有限字符串(“字典”)。它 同时匹配所有字符串

    这些算法有许多 Python 实现。

    Aho-Corasick 搜索的复杂度是O(TextLength + AnswerLength),预处理 O(n*σ),其中 n 是字典中所有单词的总长度,σ 是字母大小

    对于 Rabin-Karp,平均时间也是 O(TextLength + AnswerLength),但最差时间是 O(TextLength * AnswerLength)

    【讨论】:

      【解决方案3】:

      如果你使用它会更好 改为from string import ascii_lowercase as alphabet

      language = {'aa', 'bc', 'wxyz', 'uz'}
      
      for item in language:
          if item in alphabet:
              print item
      

      这可行,但首选列表理解

      substrings = [item for item in language if item in alphabet]
      

      【讨论】:

      • 另外,您的language in alphabet 是错误的。而且整个事情的效率低于原来的(对于“非常大的字典”,OP 在评论中提到)。
      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 2015-12-23
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多