我一直在研究幾天,試圖找出解決這個問題的方法。如果需要的話,我會很樂意爲某人諮詢時間來解決這個問題。計算字母排列的第n個6個字符
我目前使用Python itertools來生成一個32個字符的6個字符的排列。通過下面的命令:
gen = itertools.permutations('ABCDEFGHJKLMNPQRSTUVWXYZ23456789',6)
從文檔,該功能產生「R-長度元組,所有可能的排序,沒有重複的元素」。
您可以使用該庫通過以下命令來獲取產生排列的片(本例中抓住第10個排列,0-10:
gen2 = itertools.islice(gen,0,10)
當遍歷結果第二代,我得到正是我想要的:
('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似乎已經知道了。 – thefourtheye
這顯然不是重複的。 OP知道http://stackoverflow.com/questions/12007820/better-ways-to-get-nth-element-from-an-unsubscriptable-iterable中提出的解決方案,但由於效率問題,它完全不適用於他的問題原因。這可能需要幾年時間。 – hivert