我需要计算以下代码的时间复杂度:
for (i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
{
// Some code
}
}
O(n ^ 2)?
答案 0 :(得分:42)
是的,嵌套循环是快速获得大O符号的一种方法。
通常(但不总是)一个嵌套在另一个循环中的循环将导致O(n²)。
考虑一下,内部循环执行i次,执行i 的每个值。 外循环执行n次。
因此你会看到这样的执行模式: 1 + 2 + 3 + 4 + ... + n次
因此,我们可以通过声明它执行的次数超过n次(下限)来约束代码执行次数,但就n而言,我们执行代码的次数是多少次?
嗯,从数学角度来说,我们可以说它的执行时间不会超过n²次,这给我们带来了最糟糕的情况,因此我们的O(n²)的Big-Oh界限也是如此。 (有关我们如何以数学方式说明Power Series)
的更多信息Big-Oh并不总是能够确切地测量完成了多少工作,但通常会给出最坏情况下的可靠近似值。
4年后编辑:因为这篇文章似乎获得了相当多的流量。我想更全面地解释如何使用幂级列
将执行限制为O(n²)从网站:1 + 2 + 3 + 4 ... + n =(n²+ n)/ 2 =n²/ 2 + n / 2。那我们怎么把它变成O(n²)?我们(基本上)说的是n 2> = n 2/2 + n / 2。这是真的?我们来做一些简单的代数。
应该清楚的是,n 2> = n(由于n = 0或1的情况,不严格地大于n),假设n总是一个整数。
实际的Big O复杂性与我刚才所说的略有不同,但这是它的要点。实际上,Big O复杂性会询问是否有一个常量我们可以应用于一个函数,使得它比另一个函数更大,对于足够大的输入(参见wikipedia页面)
答案 1 :(得分:23)
解释这一点的一种快速方法是将其可视化。
如果i和j都是从0到N,则很容易看到O(N ^ 2)
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
在这种情况下,它是:
O
O O
O O O
O O O O
O O O O O
O O O O O O
O O O O O O O
O O O O O O O O
这是N ^ 2的1/2,仍然是O(N ^ 2)
答案 2 :(得分:9)
实际上,它是O(n ^ 2)。另请参见具有相同运行时here的非常相似的示例。
答案 3 :(得分:0)
首先,我们考虑循环,其中内循环的迭代次数与外循环索引的值无关。例如:
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
sequence of statements
}
}
外循环执行N次。每次外循环执行时,内循环执行M次。结果,内循环中的语句总共执行N * M次。因此,两个循环的总复杂度是O(N2)。
答案 4 :(得分:0)
在外环(I = 1)的第一迭代中,内环将迭代1次
在外环(I = 2)的第二迭代中,内环将迭代2时间
在外环(I = 3)的第三迭代中,内环将迭代的3倍
。
。
在外循环的最后一次迭代(i = n)时,内环将
迭代n次
所以,总次数在内部循环的语句将被执行 将等于所述整数的从1到n的总和,这是:
((n)*n) / 2 = (n^2)/2 = O(n^2) times
答案 5 :(得分:0)
是的,时间复杂度为O(n ^ 2)。
答案 6 :(得分:0)
我认为最简单的思考方式是这样的:
外循环运行 n 次,对于 至少 n/2 次迭代,内循环运行 至少 n/2 次。因此,内循环迭代的总数至少为 n2/4。这是 O(n2)
同理,外循环运行n次,每次迭代,内循环最多运行n次。因此,内循环迭代的总数最多为 n2。这也是 O(n2).