我需要计算以下算法的最佳和最差情况运行时间。我的问题是我需要在第二个循环中考虑i*i
吗?并将该循环的复杂性视为Q(N^2)
?
for i=1 to 2*n do
for j=1 to i*i do
for k=1 to k<j do
if j%i==0 then
sum=sum+1;
这是完整的代码
procedure proc(n:integer){
var i,j,k :integer
var sum: integer
begin
sum=0;
for i=1 to 2*n do
begin
for j=1 to i*i do
begin
for k=1 to k<j do
begin
if j%i==0 then
sum=sum+1;
end if
k=k+1;
end
j=j+1;
end
i=i+i;
end
end }
答案 0 :(得分:2)
让我们从内到外分析它。
if j%i==0 then
sum=sum+1;
每次到达时都需要一段时间。
for k=1 to k<j do
最内循环运行O(j)
次,每次k的值从1到j(不包括)。到目前为止,我们有O(j*1) = O(j)
for j=1 to i*i do
对于中间循环 - j
的每个值必须在O(j)
的复杂性中起作用。这意味着,您将需要整个循环(对于i
的每个值):
1 + 2 + .... + i*i = i*i*(i*i+1)/2 = i^2(i^2+1)/2 [sum of arithmetic progression]
以上内容属于O(i^4)
for i=1 to 2*n do
Sum{i^2*(i^2+1)/2 | i from 1 to 2n }
which is in O(n^5)