procedure matrixvector(n:integer);
var i,j:integer;
begin
for i<-1 to n do begin
B[i] = 0;
C[i] = 0;
for j<-1 to i do
B[i]<- B[i]+ A[i,j];
for j<-n down to i+1 do
C[i]<-C[i] + A[i,j]
end
end;
答案 0 :(得分:7)
O(n ^ 2),如果我读得对。
为什么你需要两个内循环超出我的范围。为什么不在同一个循环中求和B和C?
答案 1 :(得分:1)
最坏的情况是O(n²)。
确实存在三个循环,但并非所有循环都在彼此内部,因此给出O(n²)。
另外,你可以清楚地看到内部循环不会从1到n(就像外部循环一样)。但是因为这只会将时间复杂度改变一些常数,我们可以忽略它并说它只是O(n ^ 2)。
这表明时间复杂度是一种衡量标准:您的算法将按此顺序缩放,并且不会再花费更长时间。 (但总是可以更快)
有关“计算”任何算法的最坏情况复杂性的更多信息,我可以指向related question I asked earlier
答案 2 :(得分:0)
只是为初学者详细解释:
最外面的for循环将运行n次(0到n) 然后在最外面的循环中有两个for循环。 第一个for循环将从1变为n(1 + 2 + 3 + 4 + ..... + n) 第二个for循环将从n变为1(n + n-1 + n-2 + .... + 1)
(1 + 2 + 3 + 4 + 5 + .... + n)的求和公式为n(n + 1)/ 2
所以总运行时间可以计算为n + n(n + 1)/ 2 + n(n + 1)/ 2
观察该等式中的最高多项式,它是n ^ 2.
我们可以进一步简化这个等式并删除常数并忽略线性部分,这将给我们一个n ^ 2的运行时间。