php - PHP:内存不足
问题描述
在不改变下面的朴素算法的情况下,我应该改变什么来降低代码对内存的影响?(该算法旨在解决项目欧拉问题31链接
我认为我的算法有效,因为它在最大和为 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);
?>
解决方案
似乎在函数内修改数组会复制数组。由于您使用大小为 200 的数组多次执行此操作,因此这很快就会占用您的内存。一个解决方案可能是&
在函数描述中使用引用运算符:split(& $array)
. 但是,我当然建议您尝试使用动态编程对这个硬币找零问题进行一些不那么费力的事情,如果这还不够,可能会放弃部分记忆。
推荐阅读
- ruby-on-rails - 使用 AWS S3 和 Activerecord 在 Rails 5.2 中旋转上传的图像
- wordpress - Wordpress - 对能够存储数据的插件的怀疑
- python - list_iterator 垃圾会收集其消耗的值吗?
- mysql - 如何检索所有数据并将最新的数据标记为新数据?
- sql-server - 如何修复错误:更新@tempTable 的字段时的多部分 ID
- android - Android Application Emulator 一直在 React Native 上停止
- database - 使用 cassandara 查询和删除聊天收件箱系统
- php - 如何在codeigniter中获取和返回记录总数
- node.js - 无法从路由调用控制器方法 - Node.js 和 Express.js
- javascript - 如何从json对象中删除双引号