我需要计算以下代码的时间复杂度:
for (i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
{
// Some code
}
}
这是O(n^2)吗?
我需要计算以下代码的时间复杂度:
for (i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
{
// Some code
}
}
这是O(n^2)吗?
是的,嵌套循环是一种快速获得大O符号表示的方式之一。
通常(但并不总是),一个循环嵌套在另一个循环中将导致O(n²)。
想想看,内部循环执行了i次,对于每个i的值。外部循环执行了n次。
因此,你会看到这样的执行模式: 1 + 2 + 3 + 4 + ... + n次
因此,我们可以通过说它显然执行超过n次(下限)来限制代码执行次数,但从n的角度来看,我们执行代码多少次?
好吧,从数学上讲,我们可以说它最多会执行n²次,给出我们的最坏情况和Big-Oh边界为O(n²)。(有关如何在数学上表达这一点的更多信息,请参见幂级数)
Big-Oh并不总是准确衡量正在做多少工作,但通常给出最坏情况的可靠近似值。
4年后编辑: 因为这篇文章似乎有相当多的流量。我想更完全地解释如何使用幂级数将执行限制为O(n²)
从网站上看到的:1+2+3+4...+n = (n² + n)/2 = n²/2 + n/2。那么,我们如何将其转换为O(n²)?我们(基本上)说,n² >= n²/2 + n/2。这是真的吗?让我们做一些简单的代数运算。
可以明显地看出,n² >= n(不是严格大于,因为在n=0或1的情况下是相等的),假设n始终是整数。
实际的大O复杂度略有不同,但这就是其要点。实际上,大O复杂度询问是否存在一个常数可应用于一个函数,使它比另一个函数更大,对于足够大的输入(请参阅维基百科页面)。
//some code
是O(1),因此不会被计入大O复杂度中。如果它实际上是O(N),那么我们的总体复杂度就变成了O(N^3)。可以将其看作乘法(因为它就是乘法)。对于大约N次外部循环迭代,内部循环迭代大约N次,每次迭代执行大约N个操作。N次N次N=N^3. - AndyG一个快速解释的方法是通过可视化展示。
如果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的平方的1/2,仍然是O(N的平方)
for (int i = 1; i <= n; i++){ // outer loop
for (int j = 1; j <= i; j++){ // inner loop
// some code
}
}
一次
。两次
。三次
。n 次
。1 + 2 + 3 + … + n
= (n(n + 1) / 2)
(自然数求和公式)
= (((n^2) + n) / 2)
= O(n^2)
——————On the 1st iteration of the outer loop (i = 1), the inner loop will iterate 1 times
On the 2nd iteration of the outer loop (i = 2), the inner loop will iterate 2 time
On the 3rd iteration of the outer loop (i = 3), the inner loop will iterate 3 times
.
.
On the FINAL iteration of the outer loop (i = n), the inner loop will
iterate n times
So, the total number of times the statements in the inner loop will be executed will be equal to the sum of the integers from 1 to n, which is:
((n)*n) / 2 = (n^2)/2 = O(n^2) times
是的,这个的时间复杂度是O(n^2)。
正如其他正确的答案所示,结果的复杂度是O(n²)。它主要是O(n²/2),但归结为O(n²)。这里是为什么/2并不重要:
重要的是要理解时间复杂度并不指算法的速度,而是指速度相对于n的变化率。即变化的速率。
假设我们有两个算法:
对于输入大小为n=5,你可以这样计算时间复杂度:
现在,对于输入大小为n=10,你可以这样计算复杂度:
我认为最容易理解的方法是这样的:
外部循环运行n次,对于至少n/2次迭代,内部循环运行至少n/2次。因此,内部循环迭代的总数至少为n2/4。这是O(n2)。
同样地,外部循环运行n次,在每次迭代中,内部循环最多运行n次。因此,内部循环迭代的总数最多为n2。这也是O(n2)。
内部循环依赖于外部循环,内部循环运行I次,这给了我
对于n = 5 如果i = 1,内部循环运行1次,1 = 1
如果i = 2,内部循环运行2次,1 + 2 = 3
如果i = 3,内部循环运行3次,1 + 2 + 3 = 6
如果i = 4,内部循环运行4次,1 + 2 + 3 + 4 = 10
如果i = 5,内部循环运行5次,1 + 2 + 3 + 4 + 5 = 15
从上面可以知道n (n + 1) / 2
所以 O(n *(n+1))/2 = O(n2/2 + n/2) = O(n2/2) + O(n/2)
我不太擅长算法分析,所以请随意纠正我的答案。
首先,我们将考虑循环,其中内部循环的迭代次数与外部循环索引的值无关。例如:
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
sequence of statements
}
}
外部循环执行N次。每次外部循环执行时,内部循环会执行M次。因此,内部循环中的语句总共执行了N * M次。因此,两个循环的总复杂度为O(N²)。