모든 가능한 크기의 모든 순열을 가져 오는 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 개의 순열이 완료되고 이전 3을 다시 실행하지 않고 숫자 4가 생성됩니다. (매개 변수를 전달하는 것은 필요하지 않으며 전역 또는 정적으로 추적 할 수 있습니다).
내가 질문하는 이유는 배열이 커질수록 가능한 조합의 수가 너무 많기 때문입니다. 단지 십여 개의 요소로 이루어진 하나의 작은 데이터 세트가 수조 개의 조합으로 빠르게 성장하고 있으며 수십억 개의 순열을 한 번에 메모리에 담아 PHP를 처리하고 싶지는 않습니다.