Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP工作代码出现奇怪问题_Php_Memory_Memory Management - Fatal编程技术网

PHP工作代码出现奇怪问题

PHP工作代码出现奇怪问题,php,memory,memory-management,Php,Memory,Memory Management,有一种技术可以从(N)位代码生成(N+1)位代码列表 按给定顺序取N位代码列表,并将其称为list-N 反转上面的列表(list-N),并将新的反射列表命名为:reflected-list-N 在原始列表(list-N)的每个成员前面加0,并将此新列表称为“A” 在新列表(Reflected-list-N)的每个成员前面加上1,并将此新列表称为“B” N+1位的代码列表是列表A和B的串联 以上步骤的演示:从2位神秘代码生成3位神秘代码列表 2位代码列表:00、01、11、10 反向/反映上述列表

有一种技术可以从(N)位代码生成(N+1)位代码列表

  • 按给定顺序取N位代码列表,并将其称为list-N
  • 反转上面的列表(list-N),并将新的反射列表命名为:reflected-list-N
  • 在原始列表(list-N)的每个成员前面加0,并将此新列表称为“A”
  • 在新列表(Reflected-list-N)的每个成员前面加上1,并将此新列表称为“B”
  • N+1位的代码列表是列表A和B的串联
  • 以上步骤的演示:从2位神秘代码生成3位神秘代码列表

  • 2位代码列表:00、01、11、10
  • 反向/反映上述列表:10,11,01,00
  • 用0:000001011010作为旧条目的前缀
  • 在反射列表前面加1:110111101100
  • 连接在最后两个步骤中获得的列表:000、001、011、010、110、111、101、100
  • 我找到了解决方案,但当我输入65时,例如,出现错误

    PHP致命错误:第27行的/home/pLR62k/prog.PHP中内存不足(已分配538968064)(试图分配20个字节)

    论表意文字

    我做错了什么

    <?php
    function MysteryCodes($input){
        $initArr=array(0,1);
        if($input==1){
            return $initArr;
        }
        else {
            $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;
    }
    
    fscanf(STDIN, "%d", $inp);
    if($inp>=1 && $inp<=65){
    $result=MysteryCodes($inp);
    $output="";
    foreach($result as $key=>$value)
        $output.="$value\n";
    
    fwrite(STDOUT, $output);
    }   
    

    您使用的Wayyy内存太多。创建包含所有元素的数组只适用于较小的
    N

    您在问题中指出,“2位神秘代码”是所有四种可能的2位组合。然后,您的算法将成为生成所有可能的
    N
    位组合的方法。对于
    N=65
    ,组合数(因此,您尝试存储的元素数)为


    那真是太多了。它甚至不包括你所采取的所有中间步骤。假设没有开销,列表将占用大约30 EB的内存。如果您想生成这些数字,您必须将自己限制为较小的
    N
    ,或者找到另一种方法来动态计算这些数字,而不将它们全部保存。

    您使用的Wayyy内存太多。创建包含所有元素的数组只适用于较小的
    N

    您在问题中指出,“2位神秘代码”是所有四种可能的2位组合。然后,您的算法将成为生成所有可能的
    N
    位组合的方法。对于
    N=65
    ,组合数(因此,您尝试存储的元素数)为

    那真是太多了。它甚至不包括你所采取的所有中间步骤。假设没有开销,列表将占用大约30 EB的内存。如果要生成这些数字,您必须将自己限制为更小的
    N
    ,或者找到另一种不保存所有数字的动态计算方法。

    函数前缀(&$input,$prefix){

    应该已经对内存有很大帮助了,因为数组是复制的,而不是通过引用传递的

    函数prefixR(&$input,$prefix){


    应该已经对内存有很大帮助了,因为数组是复制的,而不是通过引用传递的

    除了“array\u merge”之外,您所做的几乎是正确的。这将利用更多内存

    下面的代码将像一个魅力

        $length = 100;//input value
    
        if($length > 1) {
            $mysteryArray = ['0', '1'];
            for ($i=2; $i <= $length; $i++) {
                $reverseArray = array_reverse($mysteryArray);
    
                $tempArray = [];
    
                foreach ($mysteryArray as $key => $value) {
                    $tempArray[] = '0' . $value;
                }
    
                foreach ($reverseArray as $key => $value) {
                    $tempArray[] = '1' . $value;
                }
    
                if($i != $length) {
                    $mysteryArray = array_slice($tempArray, 0, $i+$length);
                } else {
                    $mysteryArray = array_slice($tempArray, -$length, $length);
                }
    
            }
            foreach ($mysteryArray as $key => $value) {
                echo $value . '<br>';
            }
        } else {
            echo '1';
        }
    
    $length=100;//输入值
    如果($length>1){
    $mysteryArray=['0','1'];
    对于($i=2;$i$value){
    $tempArray[]=“0”。$value;
    }
    foreach($reversearlay作为$key=>$value){
    $tempArray[]=“1”。$value;
    }
    如果($i!=$length){
    $mysteryArray=array_slice($tempArray,0,$i+$length);
    }否则{
    $mysteryArray=array_slice($tempArray,-$length,$length);
    }
    }
    foreach($mysteryArray作为$key=>$value){
    回显$value。“
    ”; } }否则{ 回声“1”; }
    除了“array\u merge”之外,您所做的几乎是正确的。这将利用更多内存

    下面的代码将像一个魅力

        $length = 100;//input value
    
        if($length > 1) {
            $mysteryArray = ['0', '1'];
            for ($i=2; $i <= $length; $i++) {
                $reverseArray = array_reverse($mysteryArray);
    
                $tempArray = [];
    
                foreach ($mysteryArray as $key => $value) {
                    $tempArray[] = '0' . $value;
                }
    
                foreach ($reverseArray as $key => $value) {
                    $tempArray[] = '1' . $value;
                }
    
                if($i != $length) {
                    $mysteryArray = array_slice($tempArray, 0, $i+$length);
                } else {
                    $mysteryArray = array_slice($tempArray, -$length, $length);
                }
    
            }
            foreach ($mysteryArray as $key => $value) {
                echo $value . '<br>';
            }
        } else {
            echo '1';
        }
    
    $length=100;//输入值
    如果($length>1){
    $mysteryArray=['0','1'];
    对于($i=2;$i$value){
    $tempArray[]=“0”。$value;
    }
    foreach($reversearlay作为$key=>$value){
    $tempArray[]=“1”。$value;
    }
    如果($i!=$length){
    $mysteryArray=array_slice($tempArray,0,$i+$length);
    }否则{
    $mysteryArray=array_slice($tempArray,-$length,$length);
    }
    }
    foreach($mysteryArray作为$key=>$value){
    回显$value。“
    ”; } }否则{ 回声“1”; }
    通过对反向数组和实数组使用相同的数组来避免使用数组合并。通过对反向数组和实数组使用相同的数组来避免使用数组合并。