【问题标题】:PHP: Running out of memoryPHP:内存不足
【发布时间】:2018-04-29 13:50:35
【问题描述】:

在不改变下面的朴素算法的情况下,我应该改变什么来降低代码对内存的影响? (该算法旨在解决项目欧拉问题31link

我认为我的算法有效,因为它在最大和为 100 时给出正确答案。

当我尝试运行下面的代码 200 时,它会耗尽内存。下面的代码并不是为了优化算法的简单实现。我不明白为什么下面的 max sum = 200 不能成功,因为答案不够大,不能被暴力破解(谷歌)。我想我正在做一些非常不礼貌的事情,我发布这个希望有人可以向我指出这一点,并可能给出他们实现算法的方式。

<?php
$coinSet = array(200,100,50,20,10,5,2,1);
$coinCombo = array();
$sum_max = 100;
$test = array($sum_max);
$counter = 0;

function isValid($array){
    global $sum_max;
    if (array_sum($array) > $sum_max) {return (FALSE);}
    return (TRUE);
}

function isComplete($array){
    global $sum_max;
    if (array_sum($array) == $sum_max) {return (TRUE);}
    return (FALSE);
}

function split($array){
    global $coinSet;
    $array = array_filter($array, function($n) {return ($n > 1);});
    $element = array_search(end($array), $coinSet);
    $array[key($array)] = $coinSet[$element+1];
    reset($array);
    return $array;

}

function addElement($array){
    $array[] = end($array);
    return $array;
}

function solver($array){
    global $sum_max;
    global $coinCombo;
    global $counter;
    if (count($array) == $sum_max) { $counter++; return; }
    if (isComplete($array)) { $counter++; $array = split($array); }
    if (!isValid($array)) { $array = split($array); }
    if (isValid($array) & !isComplete($array)) { $array = addElement($array); }
    solver($array);

}

solver(array($sum_max));
print_r($counter);

?>

【问题讨论】:

  • 然后增加或设置为0

标签: php memory


【解决方案1】:

似乎在函数内修改数组会复制数组。由于您使用大小为 200 的数组多次执行此操作,因此这很快就会占用您的内存。一个解决方案可能是在函数描述中使用引用运算符&amp;split(&amp; $array)。但是,我当然建议您尝试使用动态编程对这个硬币找零问题进行一些不太费力的事情,如果这还不够,可能会放弃部分记忆。

【讨论】:

  • 实现引用和增加内存大小解决了我的问题。感谢您的意见。
  • 很高兴听到:)。如果您接受答案或关闭问题,否则也可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多