我在网上找到了一些在 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() it
