我很高兴使用MATLAB来解决一些project Euler问题。昨天,我写了一些代码来解决其中一个问题(14)。当我编写包含长循环的代码时,我总是通过使用短循环运行代码来测试代码。如果它运行正常并且它完成它应该做的事情,我认为当循环的长度更长时也会出现这种情况。
这个假设被证明是错误的。在执行下面的代码时,MATLAB在第75000次迭代的某处耗尽了内存。
c=1;
e=1000000;
for s=c:e
n=s;
t=1;
while n>1
a(s,t)=n;
if mod(n,2) == 0
n=n/2;
else
n=3*n+1;
end
a(s,t+1)=n;
t=t+1;
end
end
我该怎么做才能防止这种情况发生?我是否需要在流程中的某个地方清除变量或释放内存?将生成的矩阵a保存到硬盘驱动器有帮助吗?
答案 0 :(得分:1)
简单地说,没有足够的内存来保存矩阵a。
为什么你要在这里制作二维矩阵?您存储的信息可以像查找一样快速地存储。
在这里记忆要好得多。
编辑:再看一遍,你甚至没有使用你放在那个矩阵中的东西!你为什么要创造它呢?
答案 1 :(得分:1)
这是解决方案,尽可能接近您的代码(非常接近,主要区别在于您只需要一维矩阵):
c=1;
e=1000000;
a=zeros(e,1);
for s=c:e
n=s;
t=1;
while n>1
if mod(n,2) == 0
n=n/2;
else
n=3*n+1;
end
t=t+1;
end
a(s)=t;
end
[f g]=max(a);
这需要几秒钟(注意预分配),结果g
解锁Euler 14门。
答案 2 :(得分:0)
代码似乎将每个序列存储在矩阵的不同行中。该矩阵的列数将等于当前找到的最长序列的长度。这意味着两个数字的序列将用一堆右手零填充。
我相信你可以看到这是多么低效。这可能是练习的重点,或者在这个实现中适合你。
更好的是保留一个变量,如“找到最长解决方案的种子”,它将存储最长解决方案的种子。我还会保持“找到最长解决方案的长度”保持长度。当您尝试每个新种子时,如果它赢得最长的标题,则更新这些变量。
这将只保留你在内存中所需的内容。
答案 3 :(得分:-1)
简答:改为使用2d稀疏矩阵。
长答案:http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sparse.html