dongtaoxue4674 2013-09-28 13:34
浏览 104
已采纳

PHP算法从单个集合生成特定大小的所有组合

I am trying to deduce an algorithm which generates all possible combinations of a specific size something like a function which accepts an array of chars and size as its parameter and return an array of combinations.

Example: Let say we have a set of chars: Set A = {A,B,C}

a) All possible combinations of size 2: (3^2 = 9)

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

b) All possible combinations of size 3: (3^3 = 27)

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

Please note that the pair size can be greater than total size of pouplation. Ex. if set contains 3 characters then we can also create combination of size 4.

EDIT: Also note that this is different from permutation. In permutation we cannot have repeating characters for example AA cannot come if we use permutation algorithm. In statistics it is known as sampling.

  • 写回答

4条回答 默认 最新

  • douzhongjian0752 2013-09-28 14:13
    关注

    I would use a recursive function. Here's a (working) example with comments. Hope this works for you!

    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"
    }
    */
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了