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;
Run Code Online (Sandbox Code Playgroud)
O(n ^ 2),如果我读得对.
为什么你需要两个内循环超出我的范围.为什么不在同一个循环中求和B和C?
让我们跟踪每次迭代中每个循环执行的次数。
\nprocedure matrixvector(n : integer);\nvar i, j : integer;\nbegin\n for i<-1 to n do begin // OuterLoop\n B[i] = 0;\n C[i] = 0;\n\n for j <- 1 to i do // InnerLoop_1\n B[i] <- B[i] + A[i, j];\n\n for j <- n down to (i + 1) do // InnerLoop_2\n C[i] <- C[i] + A[i, j]\n end\nend;\n
Run Code Online (Sandbox Code Playgroud)\nInnerLoop_1
在 OuterLoop (i = 1) 的第一次迭代中,InnerLoop_1 执行once
.
在 OuterLoop (i = 2) 的第二次迭代中,InnerLoop_1 执行twice
.
在 OuterLoop (i = 3) 的第三次迭代中,InnerLoop_1 执行thrice
.
.\n.\n.
\n在 OuterLoop (i = n) 的最后一次迭代中,InnerLoop_1 执行n times
。
因此,该代码执行的总次数为
\n1
+ 2
+ 3
+ \xe2\x80\xa6 +n
= (n(n + 1) / 2)
(自然数之和公式)
=(((n^2) + n) / 2)
=O(n^2)
InnerLoop_2
在 OuterLoop (i = 1) 的第一次迭代中,InnerLoop_2 执行了n - 1
次。
在 OuterLoop (i = 2) 的第二次迭代中,InnerLoop_2 执行了n - 2
次。
在 OuterLoop 的第三次迭代 (i = 3) 中,InnerLoop_2 执行了n - 3
次。
.\n.\n.
\n在n - 2
OuterLoop 的第 1 次迭代中 (i = n - 2),InnerLoop_2 执行了2
次。
在n - 1
OuterLoop 的第 1 次迭代中 (i = n - 1),InnerLoop_2 执行了1
一次。
在 OuterLoop (i = n) 的最后 ( n
th) 次迭代中,InnerLoop_2 执行了0
次。
因此,该代码执行的总次数为
\nn - 1
+ n - 2
+ n - 3
+ \xe2\x80\xa6 + 2
+ 1
+0
= 0
+ 1
+ 2
+ \xe2\x80\xa6 + n - 3
+ n - 2
+n - 1
= (n - 1)((n - 1) + 1) / 2
(自然数之和公式)
=(n - 1)(n) / 2
=(((n^2) - n) / 2)
=O(n^2)
Time Complexity
执行次数InnerLoop_1
:(((n^2) + n) / 2)
执行次数InnerLoop_2
:(((n^2) - n) / 2)
相加,我们得到
\n(((n^2) + n) / 2)
+(((n^2) - n) / 2)
=((((n^2) + n) + ((n^2) - n)) / 2)
=(((n^2) + n + (n^2) - n) / 2)
=(((n^2) + (n^2)) / 2)
=((2(n^2)) / 2)
=(n^2)
=O(n^2)
\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94
\n另外,请看看这些
\n 归档时间: |
|
查看次数: |
5865 次 |
最近记录: |