37

文字とサイズの配列をパラメーターとして受け入れ、組み合わせの配列を返す関数のような、特定のサイズのすべての可能な組み合わせを生成するアルゴリズムを推測しようとしています。

例: 文字のセットがあるとします: Set A = {A,B,C}

a) サイズ 2 の可能なすべての組み合わせ: (3^2 = 9)

AA, AB, AC
BA, BB, BC
CA, CB, CC

b) サイズ 3 の可能なすべての組み合わせ: (3^3 = 27)

AAA, AAB, AAC,
ABA, ABB, ACC,
CAA, BAA, BAC,
.... ad so on total combinations = 27

ペアのサイズは、個体群の合計サイズよりも大きくなる可能性があることに注意してください。元。セットに 3 文字が含まれている場合は、サイズ 4 の組み合わせも作成できます。

編集:これは順列とは異なることに注意してください。順列では、文字を繰り返すことはできません。たとえば、順列アルゴリズムを使用すると AA が来ることはありません。統計では、サンプリングと呼ばれます。

4

5 に答える 5

60

再帰関数を使用します。コメント付きの(実際の)例を次に示します。これがうまくいくことを願っています!

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) {
            $new_combinations[] = $combination . $char;
        }
    }

    # call same function again for the next iteration
    return sampling($chars, $size - 1, $new_combinations);

}

// example
$chars = array('a', 'b', 'c');
$output = sampling($chars, 2);
var_dump($output);
/*
array(9) {
  [0]=>
  string(2) "aa"
  [1]=>
  string(2) "ab"
  [2]=>
  string(2) "ac"
  [3]=>
  string(2) "ba"
  [4]=>
  string(2) "bb"
  [5]=>
  string(2) "bc"
  [6]=>
  string(2) "ca"
  [7]=>
  string(2) "cb"
  [8]=>
  string(2) "cc"
}
*/
于 2013-09-28T14:13:03.037 に答える