我在网上找到了一些算法来生成Python中的排列错误,但是它们的复杂度都是指数级的,因此我无法让它们与26个元素(字母)集合收敛!

因此,我试图找到一种方法来改进以下代码(源here):

def derangement(vs):
    l = [None for x in vs]
    sol = set()
    sol.add(tuple(l))
    for v in vs:
        sol1 = set()
        for s in sol:
            for (i, v1) in enumerate(s):
                if not v1 and v != vs[i]:
                    s1 = list(s)
                    s1[i] = v
                    sol1.add(tuple(s1))
        sol = sol1
    return list(sol)


如果有人好奇,这是蛮力替代密码求解器。我正在尝试暴力破解密码需要多长时间!

最佳答案

由于置换算法为Ω(n!),因此不会使您的代码收敛。这可能会更快,但是对于这种复杂性而言,这意味着什么:

import itertools
def derangement(x):
    p = itertools.permutations(x)
    return (i for i in p if not any(i[k] == x[k] for k in range(len(x))))


这是一个懒惰的迭代器。如果您需要所有值(我怀疑您需要),只需list()

关于python - Python-生成string.ascii_lowercase的排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6352284/

10-10 12:35