双重for循环的运行时复杂性

时间:2014-02-04 17:36:41

标签: algorithm big-o time-complexity

我对以下算法感到困惑。特别是,我不明白为什么第一个是O(n),第二个是O(n ^ 2)。我唯一的直觉可能是第一个算法的内部和外部循环没有“链接”。其次,我可以直观地看到第二个算法是O(n ^ 2),但我们如何找到一些常数c1,c2来证明f(n)是大0和小0的n ^ 2?< / p>

sum = 0;
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    sum++;

sum = 0;
for (int i = 0; i < n; i++)
    for (int j = 0; j < i; j++)
        sum++;

3 个答案:

答案 0 :(得分:2)

要正式推断增长顺序,您可以按以下步骤进行:

enter image description here

对于 c'情况,内部循环将不会在i = 0时执行,因此,解决方案是外部化外部循环“迭代”,这不会影响内部循环。

答案 1 :(得分:1)

这两个都是 O(n 2

您的代码有一个方便的机制来衡量时间复杂度,那就是sum变量

使用n的不同值实现该实现。如果你的sum成了一条线,那就是线性的。如果他们不这样做,那就不是线性的。我认为您会发现,在您的第一个算法中,sum始终是n^2

答案 2 :(得分:0)

两个代码块都代表O(n ^ 2)

第一个块应该是n ^ 2复杂度的典型示例。内部和外部循环遍历N次。

第二个区块也是n ^ 2,即使内环比第一个区块早在小i上破坏。如果你打印出i和j,你会看到这个循环代表i和j的组合对...即(1,0),(2,0),(2,1),(3,0) ,(3,1),(3,2)等