すべての可能なサイズのすべての順列を取得する関数を PHP で作成しようとしています。例は、開始するのに最適な方法だと思います。
$my_array = array(1,1,2,3);
さまざまなサイズの可能な順列:
1 1 // * 注を参照 2 3 1,1 1,2 1,3 // など、サイズ 2 のすべてのセットについて 1,1,2 1,1,3 1,2,1 // など、サイズ 3 のすべてのセットについて 1,1,2,3 1,1,3,2 // など、サイズ 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 を生成するだけですか? (パラメーターを渡す必要はありません。グローバルまたは静的に追跡できます)。
これを尋ねる理由は、配列が大きくなるにつれて、可能な組み合わせの数も増えるからです。要素が 12 個しかない 1 つの小さなデータ セットが急速に数兆の可能な組み合わせに成長し、一度に数兆の順列をメモリに保持することを PHP に任せたくないと言うだけで十分です。