PHP工作代码出现奇怪问题
有一种技术可以从(N)位代码生成(N+1)位代码列表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 反向/反映上述列表
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”;
}
通过对反向数组和实数组使用相同的数组来避免使用数组合并。通过对反向数组和实数组使用相同的数组来避免使用数组合并。