有没有更好的方法来查找出现在给定字典

时间:2017-02-05 20:14:01

标签: python algorithm python-2.7 substring

是否有更有效的算法来查找作为给定语言的一部分的所有子串,而不是以下字符串:

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

3 个答案:

答案 0 :(得分:2)

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

如果确实如此,那就有更好的方法。

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

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

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

答案 1 :(得分:1)

如果你使用它会更好 而是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]

答案 2 :(得分:1)

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

  

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

这些算法有很多Python实现。

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

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