组合没有重复使用PHP

时间:2017-12-20 18:44:29

标签: php math combinations

我需要数学意义上的所有可能组合(没有重复),其中n = 30且k = 18

    function subcombi($arr, $arr_size, $count)
        {
           $combi_arr = array();
           if ($count > 1) {
              for ($i = $count - 1; $i < $arr_size; $i=$i+1) {
                 $highest_index_elem_arr = array($i => $arr[$i]);
                 foreach (subcombi($arr, $i, $count - 1) as $subcombi_arr) 
                 {
                     $combi_arr[] = $subcombi_arr + $highest_index_elem_arr;
                 }
              }
           } else {
              for ($i = $count - 1; $i < $arr_size; $i=$i+1) {
                 $combi_arr[] = array($i => $arr[$i]);
              }
           }

           return $combi_arr;
        }

        function combinations($arr, $count)
        {
           if ( !(0 <= $count && $count <= count($arr))) {
              return false;
           }


           return $count ? subcombi($arr, count($arr), $count) : array();
        } 

$numeri="01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30";

    $numeri_ar=explode(".",$numeri);  
    $numeri_ar=array_unique($numeri_ar);


    for ($combx = 2; $combx < 19; $combx++)
       {
    $combi_arr = combinations($numeri_ar, $combx);
    }

    print_r($combi_arr);

它可以工作,但它以内存不足错误终止,当然,组合数量太大。

现在我不需要完全所有的组合。我只需要其中的一小部分。 我会解释一下。

我需要这项工作来进行意大利乐透的统计研究。 我将这种格式的乐透存档保存在$archivio数组

...
35.88.86.03.54
70.72.45.18.09
55.49.35.30.43
15.52.49.41.72
74.26.54.77.90
33.14.56.42.11
08.79.41.01.52
82.33.32.83.43
...

此处提供完整存档 https://pastebin.com/tut6kFXf

更新的提取是最重要的。

我尝试(未成功)修改函数来执行此操作

  • 对于函数组合找到的每个18个数字组合,该函数应检查是否有min。 $archivio的前30行之一中有3个数字。如果“是”,则组合不能保存在组合数组中,这种组合对我的需要没有统计价值。如果“否”,则必须将组合保存在组合数组中,这种组合对我的需求具有很大的统计价值。

通过这种方式,总的组合不会超过几百或几千,我会避免记忆力不足,我会得到我需要的。

脚本时间肯定会很长,但使用上面的方法不应该没有内存。

任何人都可以帮助我吗? 谢谢

0 个答案:

没有答案