我在网上找到了一些算法来生成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/