【发布时间】:2023-03-13 08:51:01
【问题描述】:
我已经研究了好几天,试图找出解决这个问题的方法。如果需要,我很乐意花钱请人咨询时间来解决这个问题。
我目前正在使用 Python itertools 生成 32 个字符字母表的 6 个字符排列。通过以下命令:
gen = itertools.permutations('ABCDEFGHJKLMNPQRSTUVWXYZ23456789',6)
从文档中,这个函数产生“r-length tuples, all possible orderings, no repeat elements”。
您可以使用该库通过以下命令抓取结果排列的一部分(本示例抓取前 10 个排列,0-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 转换进行了大量研究,但是找不到任何解释如何实现接近我想要的东西的东西或我可以修改以实现此结果的算法。
任何帮助将不胜感激!
【问题讨论】:
-
@jonrsharpe OP 似乎已经知道了。
-
这显然不是重复的。 OP 知道stackoverflow.com/questions/12007820/… 中提出的解决方案,但由于效率原因,它完全不适用于他的问题。这可能需要数年时间。
标签: python algorithm combinatorics