【问题标题】:Order of growth of triple for loop三重for循环的增长顺序
【发布时间】:2025-11-28 20:45:01
【问题描述】:

我正在练习算法复杂性,我在网上看到了这段代码,但我无法弄清楚它的增长顺序。有什么想法吗?

    int counter= 0;
    for (int i = 0; i*i < N; i++)
    for (int j = 0; j*j < 4*N; j++)
    for (int k = 0; k < N*N; k++)
    counter++;

【问题讨论】:

    标签: time-complexity


    【解决方案1】:

    一次走一步(或在这种情况下循环):

    1. 第一个循环递增i,只要它的平方小于N,所以它必须是O(sqrt N),因为int(sqrt(N))int(sqrt(N)) - 1是平方小于的最大整数值N;

    2. 第二个循环也是如此。我们可以忽略4,因为它是一个常数,在处理大哦符号时我们不关心那些。所以前两个循环一起是O(sqrt N)*O(sqrt N) = O(sqrt(N)^2) = O(N)。您可以增加复杂性,因为循环是嵌套的,因此第二个循环将在第一个循环的每次迭代中完全执行;

    3. 第三个循环显然是O(N^2),因为k上升到N的平方。

    所以整个事情必须是O(N) * O(N^2) = O(N^3)。您通常可以通过计算第一个循环的复杂性来解决此类问题,然后是第二个,然后是前两个,依此类推。

    【讨论】:

    • 感谢您的详细解释。现在确实更有意义了。
    【解决方案2】:

    Sqrt n x 2 Sqrt n x n ^ 2

    这给出了:

    开n^3

    解释:

    对于第一个循环,对等式两边求平方根

    i^2 = n

    对于第二个循环,对等式两边求平方根

    j^2 = 4n^2

    第三个循环是直截了当的。

    【讨论】:

    • @JVTura - 我注意到您尚未接受任何问题的答案。如果某个答案对您有所帮助,请勾选其左侧的绿色复选标记以将其标记为已接受。