0

我需要一个数学函数来生成包含某些整数的所有变体的数组,即所谓的置换,例如:

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},...};

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

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

4

1 回答 1

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 的空间)。

于 2014-04-06T09:28:55.117 回答