有一种技术可以从(N)位代码生成(N + 1)位代码列表。
以上步骤的演示:从2位神秘码生成3位神秘码列表
但是当我输入65作为输入时出错:
PHP Fatal error: Out of memory (allocated 538968064) in $result[]=$prefix.$value; line code
:: 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;
}
还有其他方法可以通过更改相同的代码或逻辑来克服。
提前致谢。
答案 0 :(得分:0)
对于$inp = 65
,您生成的数组将包含2^65
个不同的二进制值。您将每个值存储为字符串,这不是存储二进制数字的最有效方法。您可以将字符串转换为整数以存储在数组中然后返回字符串进行计算(反转,前缀) - 但是您很快会遇到整数溢出 - 对于32位PHP上的大于2^32
的值和64位PHP上的2^64
- 请参阅docs - 然后将值转换为float
类型,您将失去精确度。
所以你可以将更多的值压缩到内存中,但无论你做什么,你肯定会达到这样的程度,这个数组不适合memory_limit
。