В рамках школьного проекта мне нужно написать функцию, которая примет целое число N и вернет двумерный массив каждой перестановки массива {0, 1,..., N-1}. Объявление будет выглядеть как public static int [] [] permutations (int N).
Алгоритм, описанный в http://www.usna.edu/Users/math/wdj/book/node156.html, заключается в том, как я решил реализовать это.
Я долгое время боролся с массивами и массивами 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? Или ArrayList из ArrayLists? Или есть какой-то другой тип данных, который лучше? Независимо от того, что я использую, мне нужно иметь возможность преобразовать его обратно в массив примитивных массивов.
Может быть, есть лучший алгоритм, который упростит это для меня...
Заранее благодарю за ваш совет!