Skip to main content
 首页 » 编程设计

Python之生成 string.ascii_lowercase 的紊乱

2025年05月04日19haluo1

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