这两个简单的 for 循环的复杂性是多少
What would be the complexity of these 2 simple for loops
for (int i = 0; i < n / 2 + 1; i++) {
for (int j = i; j < n; j++) {
}
}
此示例的复杂性如何?知道这一点的快速计算是什么? n为数组长度
我认为最简单的解释方式如下:
外循环运行了将近一半的n次,并且对于至少n/2次迭代,内循环至少运行了n 次。因此,内循环迭代的总数至少为 n * n/2 即 O(n^2)
计算您执行的迭代次数。
- 在外循环的第一遍中,您执行了内循环的 n 个循环
- 第二个是n - 1
- 这一直持续到外循环
i
是 n / 2 并且内循环 n - n/2 次。
因此总迭代次数为:
n + n - 1 + .. + n - n/2 = n * (n/2+1) - (n/2) * (n/2 + 1)/2 = 3 * n * n/8 + 3 * n/4
因此复杂度函数是 3*n*n/8 + 3*n/4
,它是 O(n^2) 的成员(也是 tetha(n^2))
编辑:在我的计算中,我使用公式 1+2+3+..+n = n*(n+1)/2,至少对我来说这是我熟记的东西,但被高斯推断为公式
当您加倍 n
时,迭代次数变为 4 倍。
当您三倍 n
时,迭代次数变为 9 倍。
...
=> 复杂度为 O(n^2)。
其他答案并没有错,但是如果你编译这个并尝试测量 n
的不同值的执行时间,无论 [ 的值如何,你都可能得到相同的结果=10=].
这是因为,根据优化设置,编译器可能会识别出这些循环中没有发生任何在它们完成后产生任何影响的事情。因此,可以完全优化循环。参见例如https://godbolt.org/z/bc9Mzr7db.
for (int i = 0; i < n / 2 + 1; i++) {
for (int j = i; j < n; j++) {
}
}
此示例的复杂性如何?知道这一点的快速计算是什么? n为数组长度
我认为最简单的解释方式如下:
外循环运行了将近一半的n次,并且对于至少n/2次迭代,内循环至少运行了n 次。因此,内循环迭代的总数至少为 n * n/2 即 O(n^2)
计算您执行的迭代次数。
- 在外循环的第一遍中,您执行了内循环的 n 个循环
- 第二个是n - 1
- 这一直持续到外循环
i
是 n / 2 并且内循环 n - n/2 次。
因此总迭代次数为: n + n - 1 + .. + n - n/2 = n * (n/2+1) - (n/2) * (n/2 + 1)/2 = 3 * n * n/8 + 3 * n/4
因此复杂度函数是 3*n*n/8 + 3*n/4
,它是 O(n^2) 的成员(也是 tetha(n^2))
编辑:在我的计算中,我使用公式 1+2+3+..+n = n*(n+1)/2,至少对我来说这是我熟记的东西,但被高斯推断为公式
当您加倍 n
时,迭代次数变为 4 倍。
当您三倍 n
时,迭代次数变为 9 倍。
...
=> 复杂度为 O(n^2)。
其他答案并没有错,但是如果你编译这个并尝试测量 n
的不同值的执行时间,无论 [ 的值如何,你都可能得到相同的结果=10=].
这是因为,根据优化设置,编译器可能会识别出这些循环中没有发生任何在它们完成后产生任何影响的事情。因此,可以完全优化循环。参见例如https://godbolt.org/z/bc9Mzr7db.