在Big Oh Complexity中嵌套for循环

时间:2015-02-11 07:43:30

标签: data-structures

for(int i = 0; i < n; i++) {
    for(int j = 0; j < i; j++){
        //do swap stuff, constant time
    }
}

我读到单个for循环是O(N)并且遍历它两次将使它成为O(n ^ 2)我观看了相关的教程,这表明每个操作都需要1 - O(1)的单位。我想详细了解O(n ^ 2)实际上是如何出现的。我试着为每个陈述做数学,但我相信我做得不对。如果有人可以从字面上向我展示如何嵌套for循环变为O(n ^ 2),我将不胜感激。先谢谢

3 个答案:

答案 0 :(得分:1)

你需要使用古老而模糊的数学艺术并计算内部陈述的执行次数。

在你的情况下,内循环执行了一次。 i的值为0,1,2,...,n-1。所以你需要一个计算这个总和的公式,这就是你的结果。

您读到单个循环是O(n)。那是胡说八道。这取决于循环。

for (i = 1; i < n; i *= n)

不会迭代n次。它迭代log2(n)次,这通常要少得多。您需要查看实际代码并弄清楚。对此没有简单的规则。

答案 1 :(得分:1)

如你所说

  

每个单位为1 - O(1)

因此内循环的每次迭代都需要1,2,3,...,n单位时间。

total_time = 1 +   2   +   3   + ... + (n-2) + (n-1) + n

倒车

total_time = n + (n-1) + (n-2) + ... +   3   +   2   + 1

添加

2 * total_time = (n+1) + (n+1) + (n+1) + ... + (n+1) + (n+1) + (n+1)

共有n个术语

2 * total_time = (n+1) * n

=> total_time = (n+1) * n / 2

=> total_time = n^2 / 2 + n / 2

对于大O复杂度,忽略较低项和常系数。

结果

<强>为O(n ^ 2)

答案 2 :(得分:0)

一个从i = 1循环到n然后有一个从1到i的内部循环的函数会经过一个等于这个公式的迭代次数:

N(N + 1)/ 2

正如你所看到的,当我们除去主要指数之外的所有东西时,你以O(n ^ 2)结束