我必须获取以下伪代码的操作计数:
x(1) = b(1) / L(1,1);
for j = 2 : n
sum = 0;
for k = (j-1) : max(1,j-m)
sum = sum + L(j,k) * x(k);
end
x(j) = ( b(j) - sum ) / L(j,j);
end
我得到以下结果:
总操作数= 1 +((j + 2) - max(1,j-m))*(n-1)
处理此问题的常见惯例是什么?
答案 0 :(得分:0)
内循环中的迭代次数:
j=2 -> 1 (k=1 to 1)
j=3 -> 2 (k=2 to 1)
...
j=m -> m-1 (k=m-1 to 1)
j=m+1 -> m (k=m to 1)
j=m+2 -> m (k=m+1 to 2)
...
j=n -> m (k=n-1 to n-m)
因此,您总体上有1+2+...+(m-1)+(n-m)*m
个内循环。
在每个内循环中,您正在进行2次操作。而且,你在外循环中做了两个操作。
最后,操作总数为:
2*(1+2+...+(m-1)+(n-m)*m) + 2*(n-1)
= (m-1)*m + 2*(n-m)*m + 2*(n-1)
= m*(2*n-m-1)+2*(n-1)
= O(m(2n-m) + n)
如果您正在寻找一个更简单的表达式,您可以使用O(mn)
,但它不太精确(您的算法确实比这更好)。