PHP代码内存不足分配问题

问题描述 投票:1回答:1

存在一种技术,通过该技术可以从(N)位代码生成(N + 1)个比特代码的列表。

  1. 以给定顺序获取N位代码列表并将其称为List-N
  2. 反转上面的列表(List-N),并命名新的反射列表:Reflected-List-N
  3. 使用0作为原始列表(List-N)的每个成员的前缀,并将此新列表称为“A”
  4. 使用1作为新列表(Reflected-List-N)的每个成员的前缀并调用此新列表“B”
  5. 具有N + 1位的代码列表是列表A和B的串联。

演示上述步骤:从2位神秘码生成3位神秘码列表

  1. 2位代码列表:00,01,11,10
  2. 反向/反映以上列表:10,11,01,00
  3. 前缀旧条目0:000,001,011,010
  4. 带有1:110,111,101,100的前缀反射列表
  5. 连接在最后两个步骤中获得的列表:000,001,011,010,110,111,101,100

但当我输入65作为输入获取错误:

PHP Fatal error: Out of memory (allocated 538968064) in $result[]=$prefix.$value; line code

::代码::

<?php
function MysteryCodes($input){
    $initArr=array(0,1);

    $list=array();
    $list[0]=$initArr;
    for ($i=1; $i<$input; $i++)
    {
        $prevIndex=$i-1;
        $reflectedListN = array_reverse($list[$prevIndex]);
        $listA=prefixR($list[$prevIndex], '0');
        $listB=prefixR($reflectedListN, '1');
        $list[$i]=array_merge($listA, $listB);
    }
    return array_slice($list[$input-1], -$input);
}

function prefixR($input, $prefix){
    $result=array();
    foreach($input as $value){
        $result[]=$prefix.$value;
    }
    return $result;
}

$inp = 5;
if($inp>=1 && $inp<=65){
    $result=MysteryCodes($inp);
    $output="";
    foreach($result as $key=>$value)
        $output.="$value\n";

    echo $output;
}

还有任何其他方法可以通过更改相同的代码或逻辑来克服。

提前致谢。

php memory memory-management
1个回答
0
投票

对于$inp = 65,您得到的数组将包含2^65不同的二进制值。您将每个值存储为字符串,这不是存储二进制数字的最有效方法。您可以将字符串转换为整数以存储在数组中,然后返回字符串进行计算(反转,前缀) - 但您很快会遇到整数溢出 - 对于大于32位PHP的2^32和64位的2^64的值-bit PHP - 请参阅docs - 然后将值转换为float类型,您将失去精度。

所以你可以将更多的值压缩到内存中,但无论你做什么,你肯定会达到这样的程度,这个数组不适合memory_limit

© www.soinside.com 2019 - 2024. All rights reserved.