PHPで独自の組み合わせを生成する
指定されたデータセット(n個の数値)から一意の組み合わせを生成する必要があります。各組み合わせにはr個の値が含まれます。
基本的に、PHPで C(n,r)=n!(r!(n−r)!)
式を実装しようとしています。
データセット{A、B、C、D}を入力し、次のような3つの値の一意の組み合わせが必要です:
C(n,r)=C(4,3) = 4!/(3!(4−3)!)
= 4
ABC ACD BCD BDA
(CDA、CAB、BCAなどは重複しているため、出力から切り捨てる必要があります)。
しかし、以下の私のコード
<?php
function sampling($chars, $size, $combinations = array()) {
# if it's the first iteration, the first set
# of combinations is the same as the set of characters
if (empty($combinations)) {
$combinations = $chars;
}
# we're done if we're at size 1
if ($size == 1) {
return $combinations;
}
# initialise array to put new values in
$new_combinations = array();
# loop through existing combinations and character set to create strings
foreach ($combinations as $combination) {
foreach ($chars as $char) {
if($combination != $char)
$new_combinations[] = $combination . $char;
}
}
# call same function again for the next iteration
return sampling($chars, $size - 1, $new_combinations);
}
?>
重複して64未満の配列を返します
{[0] => string(3) "aaa" [1] => string(3) "aab" [2] => string(3) "aac" [3] => string(3) "aad" [4] => string(3) "aba" [5] => string(3) "abb" [6] => string(3) "abc" [7] => string(3) "abd" [8] => string(3) "aca" [9] => string(3) "acb" [10] => string(3) "acc" [11] => string(3) "acd" [12] => string(3) "ada" [13] => string(3) "adb" [14] => string(3) "adc" [15] => string(3) "add" [16] => string(3) "baa" [17] => string(3) "bab" [18] => string(3) "bac" [19] => string(3) "bad" [20] => string(3) "bba" [21] => string(3) "bbb" [22] => string(3) "bbc" [23] => string(3) "bbd" [24] => string(3) "bca" [25] => string(3) "bcb" [26] => string(3) "bcc" [27] => string(3) "bcd" [28] => string(3) "bda" [29] => string(3) "bdb" [30] => string(3) "bdc" [31] => string(3) "bdd" [32] => string(3) "caa" [33] => string(3) "cab" [34] => string(3) "cac" [35] => string(3) "cad" [36] => string(3) "cba" [37] => string(3) "cbb" [38] => string(3) "cbc" [39] => string(3) "cbd" [40] => string(3) "cca" [41] => string(3) "ccb" [42] => string(3) "ccc" [43] => string(3) "ccd" [44] => string(3) "cda" [45] => string(3) "cdb" [46] => string(3) "cdc" [47] => string(3) "cdd" [48] => string(3) "daa" [49] => string(3) "dab" [50] => string(3) "dac" [51] => string(3) "dad" [52] => string(3) "dba" [53] => string(3) "dbb" [54] => string(3) "dbc" [55] => string(3) "dbd" [56] => string(3) "dca" [57] => string(3) "dcb" [58] => string(3) "dcc" [59] => string(3) "dcd" [60] => string(3) "dda" [61] => string(3) "ddb" [62] => string(3) "ddc" [63] => string(3) "ddd"}
よろしくお願いします!!!
答え :
解決策:
4つのアイテムのセットがあり、そのうちの3つのランダムなサブセットが必要だとします。次のことができます:
$myset = [ "A","B","C", "D" ];
function randomSubset($set, $size) {
$array = array_pad(array_pad([],$size,1),count($set),0); //Get an array like [ 1,1,1,0 ];
shuffle($array);
return array_intersect_key($set, array_filter($array));
}
print_r(randomSubset($myset,3));
サンドボックスで確認してください: http://sandbox.onlinephpfunctions.com/code/a68f3b2f1abc285424ccadbaab8a12fc4928bb8d
サイズNのすべてのサブセットが必要な場合は、再帰的な魔法を実行できます。
function allSubsets($set, $size) {
$subsets = [];
if ($size == 1) {
return array_map(function ($v) { return [$v]; },$set);
}
foreach (allSubsets($set,$size-1) as $subset) {
foreach ($set as $element) {
if (!in_array($element,$subset)) {
$newSet = array_merge($subset,[$element]);
sort($newSet);
if (!in_array($newSet,$subsets)) {
$subsets[] = array_merge($subset,[$element]);
}
}
}
}
return $subsets;
}
$myset = [ "A","B","C", "D", "E" ];
print_r(allSubsets($myset,3));
サンドボックス化: http://sandbox.onlinephpfunctions.com/code/01b55f0c1eb55ee82a67175d2551c164ffb2bf87
答え :
解決策:
これは一連の数字から一意の組み合わせを生成するコードです。
1,3,4,7,12
のような番号のリストがある場合は、 X
番号のセットを生成できます。これらはすべて一意で、繰り返しはありません。 。
最初の関数はPHP 7.4
以降で機能し、2番目の関数はキーを使用して値を格納します。どちらもベンチマークに基づいて非常にうまく機能します。
function get_combos74($map, $size, &$generated = [], $loop = 1, $i = 0, $prefix = [])
{
if ($loop == 1) {
sort($map);
}
for (; $i < count($map); $i++) {
if ($loop < $size) {
get_combos74($map, $size, $generated, $loop + 1, $i + 1, [...$prefix, $map[$i]]);
} else {
$generated[] = [...$prefix, $map[$i]];
}
}
return $generated;
}
function get_combosSTR($map, $size, &$generated = [], $loop = 1, $i = 0, $prefix = '')
{
if ($loop == 1) {
sort($map);
}
for (; $i < count($map); $i++) {
if ($loop < $size) {
get_combosSTR($map, $size, $generated, $loop + 1, $i + 1, "$prefix{$map[$i]}:");
} else {
$generated["$prefix{$map[$i]}"] = 0;
}
}
return $generated;
}
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。