假设您有一系列数字,例如{1,2,3,4,5)。从中你想要所有的排列而不重复,选择两个元素。
因此,{1,2},{1,3},{1,4},{1,5},{2,1},{2,3},{2,4} ... < / p>
给定排列数的索引,例如第6个排列,是否有一些简单的方法可以计算出这种排列(这里{2,4}使用零索引)是什么样的?
我正在为我的问题寻找类似的东西。我正在使用C ++。
我看过格雷码,Lermer码,Combinadics,Factoradics等,但这些似乎都不对。
感谢您的帮助。
答案 0 :(得分:2)
如果您想象对填充网格,每次第一个数字必须更改时换行到新行。将有sequence.length-1
列。
{1,2}, {1,3}, {1,4}, {1,5},
{2,1}, {2,3}, {2,4}, {2,5},
{3,1}, {3,2}, {3,4}, {3,5},
{4,1}, {4,2}, {4,3}, {4,5},
{5,1}, {5,2}, {5,3}, {5,4},
找到排列编号的行和列,然后从序列中查找值。
val s // sequence
val p // 0 based permutation number
val row = p / (s.length-1) // integer divide (round down)
val col = p % (s.length-1) // remainder
if (col >= row) {
col = col + 1 // to prevent repeat
}
val pair = { s[row], s[col] }
示例:
val s = {1, 2, 3, 4, 5} //sequence
val p = 6
row = 1 (6 / 4 rounded down)
col = 2 (remainer of 6 / 4)
col -> 3 increase as larger than or equal to first index
val pair = { 2, 4 }