我觉得在最坏的情况下,当j = i或j = i ^ 2时,条件也只有两次成立,然后循环额外运行i + i ^ 2次。 在最坏的情况下,如果我们对内部2个循环求和,则将是theta(i ^ 2)+ i + i ^ 2,它等于theta(i ^ 2)本身; 外环上的theta(i ^ 2)求和得出theta(n ^ 3)。 那么答案是theta(n ^ 3)吗?
答案 0 :(得分:1)
我会说总体表现为theta(n^4)
。这是您的伪代码,以文本格式给出:
for (i = 1 to n) do
for (j = 1 to i^2) do
if (j % i == 0) then
for (k = 1 to j) do
sum = sum + 1
首先意识到,j % i == 0
条件只有在j
是n
的倍数时才成立。实际上,这只会发生n
次,因此,最终内部for
循环只会被n
中的for
循环命中j
次。对于n^2
接近范围末尾的情况,最终的for循环将需要j
个步骤。另一方面,范围的开始只需要大约n
个步骤。因此,此处的总体效果应该在O(n^3)
和O(n^4)
之间,但是theta(n^4)
应该是有效的。
答案 1 :(得分:1)
对于固定的i
,i
整数1 ≤ j ≤ i2
使得j % i = 0
为{i,2i,...,i2}
。因此,内部循环使用i
的参数i * m
执行1 ≤ m ≤ i
次,而保护执行了i2
次。因此,复杂度函数T(n) ∈ Θ(n4)
由下式给出:
T(n) = ∑[i=1,n] (∑[j=1,i2] 1 + ∑[m=1,i] ∑[k=1,i*m] 1)
= ∑[i=1,n] ∑[j=1,i2] 1 + ∑[i=1,n] ∑[m=1,i] ∑[k=1,i*m] 1
= n3/3 + n2/2 + n/6 + ∑[i=1,n] ∑[m=1,i] ∑[k=1,i*m] 1
= n3/3 + n2/2 + n/6 + n4/8 + 5n3/12 + 3n2/8 + n/12
= n4/8 + 3n3/4 + 7n2/8 + n/4