查找9个字符的所有排列

时间:2017-02-12 22:58:19

标签: python python-3.5

我对这个功能有点问题。

def check_possible(input): 
    possibilities = []
    solutions = []


    dict = dictionary(input)
    dict.get_dict()

    words = dict.get_all_words()

    for L in range(0, len(input)+1):
        for subset in itertools.permutations(input, L):
                possibilities.append(subset)


    for possibility in possibilities: 
        poss = "".join(possibility)
        if len(poss) > 3 and len(poss) < 9: 
            for item in words: 
                for i in item:
                    if poss in i:
                        solutions.append(poss)
    return solutions

基本上,它采用一个包含9个字符的列表作为参数,并生成一个列表,列出3到9个字符之间的所有可用排列并且在字典中(使用26个字典文件,每个字母1个,为每个字母创建一个子列表列表中给出的字母,然后检查上述函数生成的每个排列)。

所以这个函数应该返回:

>>input = ['a', 'b', 'd', 'c', 'e', 'b', 'd', 'e', 'f']
<<['dace', ..., 'face', 'decaf', 'bedad', 'ceded', 'faded', 'faced', 'beaded', 'deface', 'decade', 'defaced']

虽然这有效,并且它返回正确的值,但需要10到15分钟才能完成。我想知道是否有一种方法可以在更短的时间内(最好在一分钟内)获得相同的结果。

1 个答案:

答案 0 :(得分:1)

您当前的运行时复杂性是对于每个生成的单词,您可以在线性时间内检查整个字典以尝试查找它。随着字典大小的增长,这变得非常慢。因此,您的复杂性为O(K * D),其中K是生成的子集数,D是字典的大小。

您可以优化的一件事是查找词典中的单词。您可以将字典保存在python set中,它支持对任何元素进行常量时间查找。这会将您的复杂性提高到O(D)以构建集合,并O(K)来检查单词。这导致整体O(D + K)的复杂性,远远优于O(D * K),并且可能在几秒而不是几分钟内运行。