回 帖 发 新 帖 刷新版面

主题:matlab 程序优化 运行时间不是一般的长呀  求高手解决

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

回复列表 (共4个回复)

沙发

题目是什么? 

是不是这样:
  1)首先生成两个 1至1.6e7之间的随机数,存入数组A
  2)在A中找到最大的一个数,按照0.4~0.6的比例分成两个,分别存入A(数组的个数增加1)
  3)重复(2),直至数组中所有的数都<=8, 或 数组个数>3E6

  4)如果数组个数>3E6后,还有数>8 则推倒重来。但成功率应该比较大。

板凳

改进思路(1)

  用 [m i]=max(a) 代替 Sort, 因为sort太慢了。另外,可以不用移动数组,将分解后的第二个数插入最后。

改进思路(2)

  始终保持数组有序,这样第一个数总是最大的。每次sort许花费大量时间,而结果只用了最大数的位置。分解后,将两个数插入相应位置,可以用二分法。

改进思路(3)

  因为所有大于 8 的书终将被分解,所以可以直接分解每个大于8的数,并将分解后的第二个数插入最后。这个过程可以用向量并行计算。

3 楼


楼主的程序至少需运行 400小时。如果内存足够不倒盘的话,否则运行时间是个天文数字。

4 楼

改进思路(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

我来回复

您尚未登录,请登录后再回复。点此登录或注册