主题:matlab 程序优化 运行时间不是一般的长呀 求高手解决
可爱水若寒
[专家分:0] 发布于 2012-07-14 08:44:00
clear all
c=1;
L1=8; S=1.64*10^7;N1=3*10^6;
while c>0%c是统计产生的随机数里面大于L1的个数,c=0时退出循环.
a=[];
a(1)=round(S*rand(1));
if(a(1)==0)
a(1)=1;
end
a(2)=S-a(1);
while length(a)<N1
m=length(a);
[tt,ss]=sort(-a);
i=ss(1);%选择a中最大值作为分裂位置
%a(i)分裂为a(i)=q*a(i)和a(i+1)=(1-q)*a(i)
a(i+2:m+1)=a(i+1:m);%后移
q=0.2*rand(1)+0.4;
temp=a(i);
a(i)=round(a(i)*q);
if(a(i)==0)
a(i)=1;
end
a(i+1)=temp-a(i);
end
c=sum(a>L1);
end
最后更新于:2012-07-14 14:53:00
回复列表 (共4个回复)
沙发
idealguy [专家分:110] 发布于 2012-09-01 18:44:00
题目是什么?
是不是这样:
1)首先生成两个 1至1.6e7之间的随机数,存入数组A
2)在A中找到最大的一个数,按照0.4~0.6的比例分成两个,分别存入A(数组的个数增加1)
3)重复(2),直至数组中所有的数都<=8, 或 数组个数>3E6
4)如果数组个数>3E6后,还有数>8 则推倒重来。但成功率应该比较大。
板凳
idealguy [专家分:110] 发布于 2012-09-01 20:41:00
改进思路(1)
用 [m i]=max(a) 代替 Sort, 因为sort太慢了。另外,可以不用移动数组,将分解后的第二个数插入最后。
改进思路(2)
始终保持数组有序,这样第一个数总是最大的。每次sort许花费大量时间,而结果只用了最大数的位置。分解后,将两个数插入相应位置,可以用二分法。
改进思路(3)
因为所有大于 8 的书终将被分解,所以可以直接分解每个大于8的数,并将分解后的第二个数插入最后。这个过程可以用向量并行计算。
3 楼
idealguy [专家分:110] 发布于 2012-09-01 21:05:00
楼主的程序至少需运行 400小时。如果内存足够不倒盘的话,否则运行时间是个天文数字。
4 楼
idealguy [专家分:110] 发布于 2012-09-02 00:00:00
改进思路(2)
始终保持数组有序,这样第一个数总是最大的。每次sort许花费大量时间,而结果只用了最大数的位置。分解后,将两个数插入相应位置,可以用二分法。
clear all
c=1;
L1=8;
S=164000; %1.64E7;
N1=30000; %3E6;
tic
%
a(1:N1)=0; % 数组先开好,关键
a(1)=floor(S*rand(1))+1;
a(2)=S-a(1);
if a(1)<a(2) %首先排序
a=[a(2) a(1)];
end
a(1:2) % Disp a()
m=2;
while (m<N1)&&(a(1)>L1)
%a(i)分裂为a(i)=q*a(i)和a(i+1)=(1-q)*a(i)
q=0.2*rand(1)+0.4;
t1=floor(a(1)*q)+1;
t2=a(1)-t1;
% 对分搜索插入t1
i1=1; i2=m;
while i1 <= i2
i=floor((i1+i2)/2);
if a(i)==t1
i1=i;
break
end
if a(i) < t1
i2 = i - 1;
else
i1 = i + 1;
end
end
i1=i1-1;
a(1:i1-1)=a(2:i1);
a(i1)=t1;
% 对分搜索插入t2
i1=1; i2=m;
while i1 <= i2
i=floor((i1+i2)/2);
if a(i)==t2
i1=i;
break
end
if a(i) < t2
i2 = i - 1;
else
i1 = i + 1;
end
end
a(i1+1:m+1)=a(i1:m);
a(i1)=t2;
m=m+1;
end
disp(['m=',num2str(m),' max=', num2str(max(a))]);
toc
我来回复