产生包含整数数组的数学方法(置换)

时间:2014-04-06 09:19:01

标签: arrays math integer-arithmetic

我需要一个数学函数来生成包含某些整数变量的数组,所谓的排列,例如:

private static final int[][] a = {{1}};
private static final int[][] b = {{1,2},{2,1}};
private static final int[][] c = {{1,2,3},{3,2,1},{2,1,3},{3,1,2},{1,3,2},{2,3,1}};
private static final int[][] d = {{1,2,3,4},{1,2,4,3},...};

如果可以管理的话,应该可以生成最多100 {{1,2,3,...... 100},{...}}或更多的数组。

你知道任何能产生这种数组的公式或算法吗?

1 个答案:

答案 0 :(得分:1)

http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order

您可以按照那里给出的算法来获取包含{1..k}的数组(将每个排列复制到新数组中),并对{1..k + 1}执行相同操作,等等上。

然而,可能有一种更有效的方法,因为{1..k}的可能性将是{1..k-1}的结果,其中k插入每个可能的位置。

考虑一下你打算用它们做什么。如果你只想要一些排列,你不需要将它们全部存储在内存中,所以你可以修改你的函数只返回第n个排列,或者实现一个没有复制的迭代器然后让调用代码决定何时复制。你当然不能存储100个!大小为100的数组。如果我的数学是正确的,对于N = 12,你已经在谈论超过20 GB的空间来存储所有这些(并且甚至不包括那些直到N-1的空间)。 / p>