在Java中实现置换算法的技巧
|
作为学校项目的一部分,我需要编写一个函数,该函数将使用整数N并返回数组{0,1,...,N-1}的每个排列的二维数组。该声明看起来像公共静态int [] [] permutations(int N)。
http://www.usna.edu/Users/math/wdj/book/node156.html中描述的算法是我决定实现此算法的方式。
我用ArrayLists的数组和ArrayLists以及ArrayLists的ArrayLists搏斗了好一阵子,但到目前为止,我一直很沮丧,尤其是尝试将2d ArrayList转换为2d数组。
所以我用javascript写的。这有效:
function allPermutations(N) {
// base case
if (N == 2) return [[0,1], [1,0]];
else {
// start with all permutations of previous degree
var permutations = allPermutations(N-1);
// copy each permutation N times
for (var i = permutations.length*N-1; i >= 0; i--) {
if (i % N == 0) continue;
permutations.splice(Math.floor(i/N), 0, permutations[Math.floor(i/N)].slice(0));
}
// \"weave\" next number in
for (var i = 0, j = N-1, d = -1; i < permutations.length; i++) {
// insert number N-1 at index j
permutations[i].splice(j, 0, N-1);
// index j is N-1, N-2, N-3, ... , 1, 0; then 0, 1, 2, ... N-1; then N-1, N-2, etc.
j += d;
// at beginning or end of the row, switch weave direction
if (j < 0 || j >= N) {
d *= -1;
j += d;
}
}
return permutations;
}
}
那么将其移植到Java的最佳策略是什么?我可以只使用原始数组吗?我需要一个ArrayLists数组吗?还是ArrayLists的ArrayList?还是还有其他更好的数据类型?无论使用什么,我都需要能够将其转换回原始数组的数组。
也许有更好的算法可以为我简化此过程...
预先感谢您的建议!
没有找到相关结果
已邀请:
5 个回复
社攻取墟槽
,所以我将直接使用数组。您可以在一开始就以正确的尺寸声明它,并在最后返回它。因此,您完全不必担心以后进行转换。
艰管垮淮
弓萍功
。 当心阶乘快速增长:对于N = 13,有13个!排列是6 227 020800。但是我想您只需要为较小的值运行它。 上面的算法非常复杂,我的解决方案是: 创建
以容纳所有排列 创建一个大小为N的数组,并用标识填充({1,2,3,...,N}) 适当的程序功能可按字典顺序创建下一个排列 重复此过程,直到再次获得身份: 将数组的副本放在列表的末尾 调用该方法以获得下一个排列。 如果您的程序只需要输出所有排列,我将避免存储它们并立即打印它们。 可以在互联网上找到计算下一个排列的算法。例如这里
讼乐
藕挝