微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python-生成string.ascii_lowercase的排列

如何解决Python-生成string.ascii_lowercase的排列

| 我在网上找到了一些算法来生成Python中的排列错误,但是它们的复杂度都是指数级的,因此我无法让它们与26个元素(字母)集合收敛! 因此,我正在尝试寻找一种方法来改进以下代码(在此处提供源代码):
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()
    ,        不一定,这取决于您使用的密码。如果您确定使用的不是Caesar密码,则只需尝试全部26种密码!排列,然后找到带有真实词的一个*(\'s),但我很确定您是要使用vigenere cypher,在这种情况下,您将获取所有第一组排列并将它们放在相似派系的行中并找到这些排列,然后交叉检查字典中的单词,然后您可能会得到一长串可能的消息,并且必须对那些有意义的消息进行排序。     ,        只需注意一下26个项目的排列数量有多大:使用SymPy,可以将26个项目的排列数量计算为26的子因子(!26)
>>> subfactorial(26)
148362637348470135821287825
>>> round(log(_,2))
87
因此,大约有
2^87
个字母排列可能。这里有一些用于计算随机排列的例程,以及一种生成连续排列而不将它们全部存储在内存中的方法,就像上面最初问题中引用的例程一样。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。