For 循环的大 O 表示法
Big O Notation for a For-Loop
如何找到此 for 循环代码行的大 O 表示法
for (int j = 0; pow(j,2) < n; j++) ?
有人知道吗?
我读了一些大 O 表示法,这是一个非常难以理解的话题。我知道通常像这样的 for-loop → for (int n = 0; n < 20; ++n)
,有一个大 O 符号 O(1),随着输入增加 13,它的输出也增加,线性复杂。是不是和上面一样的情况?
像这样的循环:
for (int i = 0; i < n; ++i) {
doSomething(i);
}
迭代 n 次,所以如果 doSomething
有 O(1) 运行 次,那么整个循环有 O(n) 运行次.
类似这样的循环:
for (int j = 0; pow(j, 2) < n; j++) {
doSomething(j);
}
迭代 ⌈√n⌉ 次,所以如果 doSomething
有 O(1) 运行 时间,那么整个循环有 O( √n)运行次.
顺便说一下,请注意虽然 pow(j, 2)
是 O(1) 运行 时间——所以它不会影响你的循环的渐近复杂度——它仍然很慢,因为它涉及对数和求幂。对于大多数用途,我建议改为:
for (int j = 0; j * j < n; j++) {
doSomething(j);
}
或者这个:
for (int j = 0; 1.0 * j * j < n; j++) {
doSomething(j);
}
如何找到此 for 循环代码行的大 O 表示法
for (int j = 0; pow(j,2) < n; j++) ?
有人知道吗?
我读了一些大 O 表示法,这是一个非常难以理解的话题。我知道通常像这样的 for-loop → for (int n = 0; n < 20; ++n)
,有一个大 O 符号 O(1),随着输入增加 13,它的输出也增加,线性复杂。是不是和上面一样的情况?
像这样的循环:
for (int i = 0; i < n; ++i) {
doSomething(i);
}
迭代 n 次,所以如果 doSomething
有 O(1) 运行 次,那么整个循环有 O(n) 运行次.
类似这样的循环:
for (int j = 0; pow(j, 2) < n; j++) {
doSomething(j);
}
迭代 ⌈√n⌉ 次,所以如果 doSomething
有 O(1) 运行 时间,那么整个循环有 O( √n)运行次.
顺便说一下,请注意虽然 pow(j, 2)
是 O(1) 运行 时间——所以它不会影响你的循环的渐近复杂度——它仍然很慢,因为它涉及对数和求幂。对于大多数用途,我建议改为:
for (int j = 0; j * j < n; j++) {
doSomething(j);
}
或者这个:
for (int j = 0; 1.0 * j * j < n; j++) {
doSomething(j);
}