1

I (ABCDE) は必要ない AAA BBB AB BA だけが必要 ABC ABD ABE などの不要な組み合わせを排除するコードを実行しています .... など、どのような状況でも有効であってほしい、私が実行したコード例そのように: 彼は (1-6) 3 対 3 の組み合わせのセットを作成します ... しかし、私は彼に (1-15) のファンシアンを 4 対 4 または 10 対 10 の組み合わせで望んでいます .... より良い例を参照してください理解。

$lista = array(1,2,3,4,5,6);
$b=1;
for ($i=0; $i<=3; $i++) {
    for ($j=$b; $j<=4;$j++) {
    //  printf('valor do j = '.$j.'<br>');
        for ($k=$j+1; $k<count($lista); $k++) {
            printf($lista[$i].$lista[$j].$lista[$k].'<br>');
        }
    }
    $b++;
}

結果

123
124
125
126
134
135
136
145
146
156
234
235
236
245
246
256
345
346
356
456

4

3 に答える 3

4
require_once 'Math/Combinatorics.php';
$combinatorics = new Math_Combinatorics;
$set = range(1,6);
$combosWithoutRepetition = $combinatorics->combinations($set, 3);
foreach ($combosWithoutRepetition as $combo) {
    echo join(',', $combo), "\n";
}

http://pear.php.net/package/Math_Combinatorics

pear をインストールする必要はありません。そのパッケージをダウンロードして使用するだけです。

于 2012-07-15T02:57:05.163 に答える
1

二項係数を扱うための一般的な関数を処理するクラスを作成しました。これは、問題が該当するタイプの問題です。次のタスクを実行します。

  1. 任意の N choose K について、すべての K-index を適切な形式でファイルに出力します。K インデックスは、よりわかりやすい文字列または文字で置き換えることができます。この方法により、この種の問題を簡単に解決できます。

  2. K インデックスを、並べ替えられた二項係数テーブル内のエントリの適切なインデックスに変換します。この手法は、反復に依存する以前に公開された手法よりもはるかに高速です。これは、パスカルの三角形に固有の数学的性質を使用して行われます。私の論文はこれについて語っています。この手法を発見して公開したのは私が最初だと思いますが、間違っている可能性があります。

  3. ソートされた二項係数テーブルのインデックスを対応する K インデックスに変換します。あなたが見つけたリンクよりも速いかもしれないと思います。

  4. Mark Dominusメソッドを使用して二項係数を計算します。これは、オーバーフローする可能性がはるかに低く、より大きな数で機能します。

  5. このクラスは .NET C# で記述されており、問題に関連するオブジェクト (存在する場合) をジェネリック リストを使用して管理する方法を提供します。このクラスのコンストラクターは、InitTable と呼ばれる bool 値を受け取ります。これが true の場合、管理対象のオブジェクトを保持する汎用リストが作成されます。この値が false の場合、テーブルは作成されません。上記の 4 つの方法を実行するためにテーブルを作成する必要はありません。テーブルにアクセスするためのアクセサ メソッドが用意されています。

  6. クラスとそのメソッドの使用方法を示す関連するテスト クラスがあります。2 つのケースで広範囲にテストされており、既知のバグはありません。

このクラスについて読んでコードをダウンロードするには、二項係数の表化を参照してください。

このクラスを Perl に変換するのは難しくありません。もう 1 つのオプションは、それを Java に変換してから Perl から呼び出すことです。

上記の例から、6 を選択 3 のケースを使用しているように見えます。つまり、一度に 3 つ取られる可能性のあるアイテムが 6 つあります。したがって、これを行うためのコード例は次のようになります。

// Create the binomial coefficient object for the 6 choose 3 case and
// do not bother to create the list of objects table.
BinCoeff<int> BC = new BinCoeff<int>(6, 3, false);
int[] KIndexes = new int[3];
int NumCombos6Choose3 = BinCoeff<int>.GetBinCoeff(6, 3);
// Loop through all of the combinations for this case.
for (int Loop = 0; Loop < NumCombos6Choose3; Loop++)
{
   // Get the K-Indexes for this combination.
   // The combinations are returned in rank order.
   BC.GetKIndexes(Loop, KIndexes);
   // Print out the K-Indexes or any other processing.
   ...
}
于 2012-09-26T15:02:28.693 に答える
1

元のコード: https://stackoverflow.com/a/2617080/661872一部だけ追加しまし$lenた。

<?php 
// function to generate and print all N! permutations of $str. (N = strlen($str)).
function permute($str,$i,$n,$len) {
    global $ret;
    if ($i == $n){
        if(in_array(substr($str,0,$len),$ret)==false){$ret[]=substr($str,0,$len);}
    }else {
        for ($j = $i; $j < $n; $j++) {
            swap($str,$i,$j);
            permute($str, $i+1, $n, $len);
            swap($str,$i,$j); // backtrack.
        }
    }
}

// function to swap the char at pos $i and $j of $str.
function swap(&$str,$i,$j) {
    $temp = $str[$i];
    $str[$i] = $str[$j];
    $str[$j] = $temp;
}
$ret = array();
$str = "123456";
permute($str,0,strlen($str), 3); // call the function.


print_r($ret);
/**
 * Array
(
    [0] => 123
    [1] => 124
    [2] => 125
    [3] => 126
    [4] => 132
    [5] => 134
    [6] => 135
    [7] => 136
    [8] => 143
    [9] => 142
    [10] => 145
    [11] => 146
    [12] => 153
    [13] => 154
    [14] => 152
    [15] => 156
    [16] => 163
    [17] => 164
    [18] => 165
    [19] => 162
    [20] => 213
    [21] => 214
    [22] => 215
    [23] => 216
    [24] => 231
    [25] => 234
    [26] => 235
    [27] => 236
    [28] => 243
    [29] => 241
    [30] => 245
    [31] => 246
    [32] => 253
    [33] => 254
    [34] => 251
    [35] => 256
    [36] => 263
    [37] => 264
    [38] => 265
    [39] => 261
    [40] => 321
    [41] => 324
    [42] => 325
    [43] => 326
    [44] => 312
    [45] => 314
    [46] => 315
    [47] => 316
    [48] => 341
    [49] => 342
    [50] => 345
    [51] => 346
    [52] => 351
    [53] => 354
    [54] => 352
    [55] => 356
    [56] => 361
    [57] => 364
    [58] => 365
    [59] => 362
    [60] => 423
    [61] => 421
    [62] => 425
    [63] => 426
    [64] => 432
    [65] => 431
    [66] => 435
    [67] => 436
    [68] => 413
    [69] => 412
    [70] => 415
    [71] => 416
    [72] => 453
    [73] => 451
    [74] => 452
    [75] => 456
    [76] => 463
    [77] => 461
    [78] => 465
    [79] => 462
    [80] => 523
    [81] => 524
    [82] => 521
    [83] => 526
    [84] => 532
    [85] => 534
    [86] => 531
    [87] => 536
    [88] => 543
    [89] => 542
    [90] => 541
    [91] => 546
    [92] => 513
    [93] => 514
    [94] => 512
    [95] => 516
    [96] => 563
    [97] => 564
    [98] => 561
    [99] => 562
    [100] => 623
    [101] => 624
    [102] => 625
    [103] => 621
    [104] => 632
    [105] => 634
    [106] => 635
    [107] => 631
    [108] => 643
    [109] => 642
    [110] => 645
    [111] => 641
    [112] => 653
    [113] => 654
    [114] => 652
    [115] => 651
    [116] => 613
    [117] => 614
    [118] => 615
    [119] => 612
)
 */
?>
于 2012-07-15T03:10:39.237 に答える