这个双循环的复杂性是什么?

时间:2014-02-01 16:34:04

标签: c algorithm time-complexity

#include <stdio.h>

int main() {
    int N = 32; /* for example */

    int sum = 0;
    for (int i = 1; i <= N*N; i = i*3)
        for (int j = 1; j <= i; j++)
            sum++;

    printf("Sum = %d\n", sum);
    return 0;
}

外环是奇数。

如果检查只有N(不是N * N)那么我每次增加3会意味着外部循环需要N / 3次N次迭代?

但是检查是N * N或N ^ 2所以暗示将增长

N^2  / 3 ??? (n squared divided by 3) Is that correct?

如果我玩N的不同值,比如每次加倍,i循环(单独)不会增长太多。像对数增长一样)。我将如何以数学方式表达这一点?

那么你如何看待内环?如果它每次增加到i,我怎样才能以数学方式表达?如何将内循环与N?

联系起来

我想a)能够用N来表示数学上的“复杂性”。然后下一步,b)是使用big-O表示法。

对此感到困惑。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我认为外部循环执行log3(N*N)次,因为每次乘以3得到1,3,9 ......并且N * N执行的对数基数3达到N * ñ

内部循环最多执行N * N次,因此一切都变为log3(N*N)*N*N

答案 1 :(得分:0)

增量指令(近似)执行N * N + N * N / 3 + N * N / 9 + ... = N * N(1 + 1/3 + 1/9 + ...)= N * N * 3/2倍(使用几何系列的公式)。所以整个代码的运行时间是O(N * N)(假设所有算术都是O(1)而C ints可以代表任意大的数字)。

答案 2 :(得分:0)

fede1024是正确的,外部循环是log3(n ^ 2)。

内环稍微复杂一点,但求解1 + 8 + 27的总和..(求和^ ^ 3)为您提供解决方案。您可以使用一组线性方程计算立方体的总和,假设该和等于3次多项式并表示为a ^ ^ + + ^ 2 + cy。或谷歌它发现立方体的总和等于(n(n + 1)/ 2)^ 2(如果你想要,可以包括一个完整的解决方案)。

然后整个复杂度将是log3(n ^ 2)*(n(n + 1)/ 2)^ 2。大O表示法,log3(n ^ 2)* n ^ 3。可能是错的。