计算以下代码的代码复杂度

时间:2020-01-29 05:12:37

标签: computation-theory

enter image description here

我觉得在最坏的情况下,当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)吗?

2 个答案:

答案 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条件只有在jn的倍数时才成立。实际上,这只会发生n次,因此,最终内部for循环只会被n中的for循环命中j次。对于n^2接近范围末尾的情况,最终的for循环将需要j个步骤。另一方面,范围的开始只需要大约n个步骤。因此,此处的总体效果应该在O(n^3)O(n^4)之间,但是theta(n^4)应该是有效的。

答案 1 :(得分:1)

对于固定的ii整数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