Я пытаюсь написать функцию в PHP, которая получает все перестановки всех возможных размеров.Я думаю, что пример будет лучшим способом начать:
$my_array = array(1,1,2,3);
Возможные перестановки различного размера:
1
1 // * See Note
2
3
1,1
1,2
1,3
// And so forth, for all the sets of size 2
1,1,2
1,1,3
1,2,1
// And so forth, for all the sets of size 3
1,1,2,3
1,1,3,2
// And so forth, for all the sets of size 4
Примечание: мне все равно, есть дубликат или нет,Для целей этого примера все будущие дубликаты были опущены.
То, что я пока имею в PHP:
function getPermutations($my_array){
$permutation_length = 1;
$keep_going = true;
while($keep_going){
while($there_are_still_permutations_with_this_length){
// Generate the next permutation and return it into an array
// Of course, the actual important part of the code is what I'm having trouble with.
}
$permutation_length++;
if($permutation_length>count($my_array)){
$keep_going = false;
}
else{
$keep_going = true;
}
}
return $return_array;
}
Самое близкое, что я могу придумать, это перемешать массив, выбратьпервые n элементов, видя, есть ли он уже в массиве результатов, а если нет, добавьте его, а затем остановите, когда математически больше нет возможных перестановок для этой длины.Но это уродливо и неэффективно с точки зрения ресурсов.
Любые алгоритмы псевдокодов будут высоко оценены.
Также, для супер-пупер (бесполезных) бонусных баллов, есть ли способ получить всего 1 перестановку с помощью функции, но сделать так, чтобы ей не пришлось пересчитывать все предыдущие перестановки, чтобы получить следующую?
Например, я передаю ему параметр 3, что означает, что он уже сделал 3 перестановки, и он просто генерирует число 4 без повторения предыдущих 3?(Передача этого параметра не обязательна, он может отслеживать глобальное или статическое значение).
Причина, по которой я спрашиваю об этом, заключается в том, что с ростом массива увеличивается число возможных комбинаций.Достаточно сказать, что один небольшой набор данных, содержащий всего лишь десяток элементов, быстро превращается в триллионы возможных комбинаций, и я не хочу задавать PHP с одновременным хранением триллионов перестановок в своей памяти.