我需要有效计算来自k
的长度n
的下一个排列
选择。维基百科列出a great
algorithm
用于从n
个选项中计算长度n
的下一个排列。
我能想出的最好的事情是使用该算法(或the Steinhaus–Johnson–Trotter algorithm),然后只考虑列表的第一个k
项,并在更改完全时再次迭代那个位置。
约束:
k
长度n
的排列(这是
其他算法失败的地方非约束:
答案 0 :(得分:1)
您可以将此问题分解为两部分:
1)从一组大小k
中查找大小为n
的所有子集。
2)对于每个这样的子集,找到大小为k
的子集的所有排列。
引用的维基百科文章提供了第2部分的算法,因此我在此不再重复。第1部分的算法非常相似。为简单起见,我将其描述为“查找整数k
的所有大小为[0...n-1]
的子集。
1)从子集[0...k-1]
2)获得下一个子集,给定子集S
:
2a)找到最小的j
,j ∈ S ∧ j+1 ∉ S
。如果j == n-1
,则没有下一个子集;我们已经完成了。
2b)小于j
的元素形成序列i...j-1
(因为如果缺少任何这些值,j
将不会是最小的)。如果i
不为0,请将这些元素替换为i-i...j-i-1
。将元素j
替换为元素j+1
。