У меня есть массив из n различных элементов в javascript, я знаю, что есть n! возможные способы упорядочения этих элементов. Я хочу знать, что является самым эффективным (самым быстрым) алгоритмом для генерации всех возможных порядков этого массива?
У меня есть этот код:
var swap = function(array, frstElm, scndElm) {
var temp = array[frstElm];
array[frstElm] = array[scndElm];
array[scndElm] = temp;
}
var permutation = function(array, leftIndex, size) {
var x;
if(leftIndex === size) {
temp = "";
for (var i = 0; i < array.length; i++) {
temp += array[i] + " ";
}
console.log("---------------> " + temp);
} else {
for(x = leftIndex; x < size; x++) {
swap(array, leftIndex, x);
permutation(array, leftIndex + 1, size);
swap(array, leftIndex, x);
}
}
}
arrCities = ["Sidney", "Melbourne", "Queenstown"];
permutation(arrCities, 0, arrCities.length);
И это работает, но я думаю, что замена каждого элемента, чтобы получить комбинации, немного дорогая память, я думал, что хороший способ сделать это - просто сосредоточиться на индексах массива и получить все перестановки чисел, я интересно, есть ли способ вычислить все из них без необходимости переключения элементов внутри массива? Я думаю, что рекурсивно можно получить все из них, мне нужна помощь.
Так, например, если у меня есть:
arrCities = ["Sidney", "Melbourne", "Queenstown"];
Я хочу, чтобы результат был следующим:
[[012],[021],[102],[120],[201],[210]]
или:
[[0,1,2],
[0,2,1],
[1,0,2],
[1,2,0],
[2,0,1],
[2,1,0]]
Я читаю это: http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations
Но Википедия никогда не умела объяснять. Я не очень-то понимаю, я должен сказать, что мой математический уровень не самый лучший.