优化、时间复杂度和流程图(Scilab)

Optimization, time complexity and flowchart (Scilab)

我试图优化这段代码,但是已经不可能再优化了。

请帮助构建此算法的流程图。

A = [-1,0,1,2,3,5,6,8,10,13,19,23,45];
B = [0,1,3,6,7,8,9,12,45];
N1 = length(A);
N2 = length(B);
t = 1;
m = 10;
C = [];
for i=1:N1
    for j=1:N2 
        if A(i)==B(j)
            break
        else
            if j==N2
               C(t)=A(i);
               t=t+1;
           end
       end
   end
end
disp(C);
N3=length(C);
R = [];
y = 1;
for l=1:N3
    if C(l)>m
       R(y)=C(l);
       y=y+1;
   end 
end
disp(R);

如何计算算法的时间复杂度

我觉得应该是O(n)。

主导(基本)操作: 比较 A(i)== B(j)
但我还不确定。

我做不到

复杂度函数(最坏情况)

最差计算复杂度: ()

这好像是作业 ;p

至于时间复杂度,它看起来更像是 O(n²) 因为你有一个 for 循环,在另一个 for 循环中。 我最近开始在 Udemy 上观看我强烈推荐的关于算法和数据结构的课程。他很好地解释了 BigO 符号 :) Link 当然。 (与作者无任何关系)

"Optimization" 取决于您的目标,例如您可能希望最小化浮点运算的数量或最小化 Scilab 指令的数量或最小化算法的执行时间。

由于 Scilab 是一种解释型语言,因此可以减少应用矢量化的执行时间和代码长度。

例如你的代码

N3=length(C);
R = [];
y = 1;
for l=1:N3
    if C(l)>m
       R(y)=C(l);
       y=y+1;
     end 
end

可能会改写:

R=C(C>m)

此处计算机运算次数与原代码大致相同,但执行时间快了很多倍:

令 C=rand(1,1000);m=0.5;

--> timer();R=C(C>0.5);timer()
ans  =
   0.000137

--> timer();
-->   N3=length(C);
-->     R = [];
-->     y = 1;
-->     for l=1:N3
  >         if C(l)>m
  >            R(y)=C(l);
  >            y=y+1;
  >         end 
  >     end

 --> timer()
 ans  =
    0.388749

就优化而言,您应该考虑到 Scilab(及其同类数学编程语言 MATLAB 和 Octave)本质上是矢量化的。这意味着如果您使用了太多 for loops,您可能应该回去阅读一些文档和教程。您编写的代码的规范版本可以实现为:

A = [-1, 0, 1, 2, 3, 5, 6, 8, 10, 13, 19, 23, 45];
B = [0, 1, 3, 6, 7, 8, 9, 12, 45];

C = setdiff(A, B);
disp(C);

m = 10;
R = C(C > m);
disp(R);

结果:

-1. 2. 5. 10. 13. 19. 23.

    1. 23.