【问题标题】:What is the complexity of this double loop这个双循环的复杂度是多少
【发布时间】:2014-02-01 16:34:03
【问题描述】:
#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),那么 i 每次乘以 3 就意味着外部循环需要 n/3 次迭代?

但检查是 N* N 或 N^2 ,因此意味着将增长

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

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

那么你如何看待内循环?如果它每次都增加到 i ,我该如何用数学方式表达呢?如何将内部循环与 N 联系起来?

我希望 a) 能够用 N 在数学上表达“复杂性”。然后下一步,b) 是使用大 O 表示法。

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

【问题讨论】:

    标签: c algorithm time-complexity


    【解决方案1】:

    我认为外部循环会执行log3(N*N) 次,因为每次乘以 3,所以您有 1、3、9... 并且需要以 N*N 执行次数的 3 为底的对数才能达到 N*N。

    内部循环最多执行N*N次,所以一切都变成log3(N*N)*N*N

    【讨论】:

    • 您不能总是通过假设每次运行时最坏的情况(此处为 N*N)来估算内部循环的总成本。通常这样做在逻辑上是不正确的,但会产生正确的复杂性,但在这里它给出了高估。
    【解决方案2】:

    递增指令(大约)执行 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 整数可以表示任意大的数字)。

    【讨论】:

      【解决方案3】:

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

      内部循环稍微复杂一点,但解决 1 + 8 + 27.. (sum x^3) 的总和会给您解决方案。您可以使用一组线性方程计算立方体的总和,假设总和等于 3 次多项式并表示为 ay^3 + by^2 + cy。或者谷歌它,发现立方体的总和等于 (n(n+1)/2)^2 (如果你愿意,可以包括一个完整的解决方案)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多