使用索引生成不重复的排列

时间:2018-04-23 18:21:38

标签: permutation

假设您有一系列数字,例如{1,2,3,4,5)。从中你想要所有的排列而不重复,选择两个元素。

因此,{1,2},{1,3},{1,4},{1,5},{2,1},{2,3},{2,4} ... < / p>

给定排列数的索引,例如第6个排列,是否有一些简单的方法可以计算出这种排列(这里{2,4}使用零索引)是什么样的?

我看到了以下组合的方法:https://math.stackexchange.com/questions/1368526/fast-way-to-get-a-combination-given-its-position-in-reverse-lexicographic-or

我正在为我的问题寻找类似的东西。我正在使用C ++。

我看过格雷码,Lermer码,Combinadics,Factoradics等,但这些似乎都不对。

感谢您的帮助。

1 个答案:

答案 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 }
相关问题