双 for 循环的最坏情况运行时间
worst case runtime of the double for loop
谁能解释一下在下面的练习中,最坏情况 运行 的时间是 O(N) 而不是 O(N^2)。有两个 for 循环,其中对于每个 i 我们需要将 j 与 i 进行比较,求和 ++ 然后递增并再次重复该操作直到达到 N.
以下代码片段的最坏情况运行时间的增长顺序是什么
作为 N?
的函数
int sum = 0;
for (int i = 1; i <= N; i = i*2)
for (int j = 0; j < i; j++)
sum++;
问题解释
答案是:N
内循环体执行了1 + 2 + 4 + 8 + ... + N ~ 2N次
我想你已经在你的问题中给出了答案——内循环执行了2N次,即O(N)。在渐近(或大 O)表示法中,任何倍数都被丢弃,因为对于非常非常大的值,2N 的图形看起来就像 N,因此它不被认为是重要的。在这种情况下,问题的复杂度等于"sum++"被调用的次数,因为算法是如此简单。这有意义吗?
复杂度不依赖于嵌套循环的数量
it is O(Nc):
Time complexity of nested loops is equal to the number of times the
innermost statement is executed.
For example the following sample loops have O(N2) time complexity
for (int i = 1; i <=n; i += c) {
for (int j = 1; j <=n; j += c) {
// some O(1) expressions
}
}
for (int i = n; i > 0; i += c) {
for (int j = i+1; j <=n; j += c) {
// some O(1) expressions
}
谁能解释一下在下面的练习中,最坏情况 运行 的时间是 O(N) 而不是 O(N^2)。有两个 for 循环,其中对于每个 i 我们需要将 j 与 i 进行比较,求和 ++ 然后递增并再次重复该操作直到达到 N.
以下代码片段的最坏情况运行时间的增长顺序是什么 作为 N?
的函数int sum = 0;
for (int i = 1; i <= N; i = i*2)
for (int j = 0; j < i; j++)
sum++;
问题解释
答案是:N
内循环体执行了1 + 2 + 4 + 8 + ... + N ~ 2N次
我想你已经在你的问题中给出了答案——内循环执行了2N次,即O(N)。在渐近(或大 O)表示法中,任何倍数都被丢弃,因为对于非常非常大的值,2N 的图形看起来就像 N,因此它不被认为是重要的。在这种情况下,问题的复杂度等于"sum++"被调用的次数,因为算法是如此简单。这有意义吗?
复杂度不依赖于嵌套循环的数量
it is O(Nc):Time complexity of nested loops is equal to the number of times the
innermost statement is executed.
For example the following sample loops have O(N2) time complexity
for (int i = 1; i <=n; i += c) {
for (int j = 1; j <=n; j += c) {
// some O(1) expressions
}
}
for (int i = n; i > 0; i += c) {
for (int j = i+1; j <=n; j += c) {
// some O(1) expressions
}