我已经研究了好几天,试图找出解决这个问题的方法。如果需要,我很乐意支付咨询费用来解决这个问题。
我目前正在使用Python itertools 来生成32个字符字母表中6个字符的排列组合。通过以下命令:
gen = itertools.permutations('ABCDEFGHJKLMNPQRSTUVWXYZ23456789',6)
根据文档,该函数生成“长度为r的元组,所有可能的排列,没有重复元素”。
您可以使用该库通过以下命令获取结果排列的一部分(此示例获取第1-10个排列):
gen2 = itertools.islice(gen,0,10)
当迭代结果 gen2 时,我得到了我想要的结果:
('A', 'B', 'C', 'D', 'E', 'F')
('A', 'B', 'C', 'D', 'E', 'G')
('A', 'B', 'C', 'D', 'E', 'H')
('A', 'B', 'C', 'D', 'E', 'J')
('A', 'B', 'C', 'D', 'E', 'K')
('A', 'B', 'C', 'D', 'E', 'L')
('A', 'B', 'C', 'D', 'E', 'M')
('A', 'B', 'C', 'D', 'E', 'N')
('A', 'B', 'C', 'D', 'E', 'P')
('A', 'B', 'C', 'D', 'E', 'Q')
这很好,但我的真正愿望是能够选择任意的排列并从排列列表中获取它(而不必存储所有可能的排列值)。如果我计算得正确,在生成上述字母的6个字符序列时,有652,458,240种可能的组合。因此,我想做的是像获取第10,353,345个排列这样的事情。问题在于,如果您使用上面的islice函数来获取此排列,则必须在返回它之前迭代整个排列集,直到第10,353,345个元素。可以想象,这非常低效且需要很长时间才能返回。
我的问题是,实现所需计算的算法是什么?我已经对阶乘分解和基数n转换进行了相当多的研究,但无法找到任何解释如何实现接近我想要的东西或可以修改以实现此结果的算法的内容。
非常感谢您的任何帮助!