我怎样才能在这个 while 循环中获得大 O 符号?
How can i get the Big O Notations in this while loop?
计算成本只会考虑c = c+1;
执行了多少次
我想用 n 表示大 O 表示法。
count = 0; index = 0; c = 0;
while (index <= n) {
count = count + 1;
index = index + count;
c = c + 1;
}
我认为如果“计数的迭代”是k
,“索引的迭代”是n
,那么k(k+1)/2 = n
。
所以,我认为 O(root(n)) 就是答案。
这个问题的答案是正确的吗?
让我们先看看index
每次循环迭代是如何变化的:
index = 0 + 1 = 1
index = 0 + 1 + 2 = 3
index = 0 + 1 + 2 + 3 = 6
...
index = 0 + 1 + ... + i-1 + i = O(i^2)
然后我们需要计算循环运行了多少次,相当于在等式中隔离i
:
i^2 = n =>
i = sqrt(n)
所以你的算法运行在 O(sqrt(n))
也可以写成 O(n^0.5)
.
Is that right solution about this question?
这很容易测试。 while
循环结束时 c
的值将是循环 运行 的次数(因此, c = c + 1;
语句的执行次数).因此,让我们检查 c
的值,对于各种 n
,看看它们与假定的 O(√n)
复杂性有何不同:
#include <stdio.h>
#include <math.h>
int main()
{
printf(" c root(n) ratio\n"); // rubric
for (int i = 1; i < 10; ++i) {
int n = 10000000 * i;
int count = 0;
int index = 0;
int c = 0;
while (index < n) {
count = count + 1;
index = index + count;
c = c + 1;
}
double d = sqrt(n);
printf("%5d %8.3lf %8.5lf\n", c, d, c / d);
}
return 0;
}
输出:
c root(n) ratio
4472 3162.278 1.41417
6325 4472.136 1.41431
7746 5477.226 1.41422
8944 6324.555 1.41417
10000 7071.068 1.41421
10954 7745.967 1.41416
11832 8366.600 1.41419
12649 8944.272 1.41420
13416 9486.833 1.41417
我们可以看到,尽管有一些 'rounding' 错误,但最后一列似乎 合理地 常量(而且,碰巧是 √2 的近似值,通常会随着 n
变大而改善)——因此,,正如您预测的那样,复杂度是 O(√n)
.
计算成本只会考虑c = c+1;
执行了多少次
我想用 n 表示大 O 表示法。
count = 0; index = 0; c = 0;
while (index <= n) {
count = count + 1;
index = index + count;
c = c + 1;
}
我认为如果“计数的迭代”是k
,“索引的迭代”是n
,那么k(k+1)/2 = n
。
所以,我认为 O(root(n)) 就是答案。
这个问题的答案是正确的吗?
让我们先看看index
每次循环迭代是如何变化的:
index = 0 + 1 = 1
index = 0 + 1 + 2 = 3
index = 0 + 1 + 2 + 3 = 6
...
index = 0 + 1 + ... + i-1 + i = O(i^2)
然后我们需要计算循环运行了多少次,相当于在等式中隔离i
:
i^2 = n =>
i = sqrt(n)
所以你的算法运行在 O(sqrt(n))
也可以写成 O(n^0.5)
.
Is that right solution about this question?
这很容易测试。 while
循环结束时 c
的值将是循环 运行 的次数(因此, c = c + 1;
语句的执行次数).因此,让我们检查 c
的值,对于各种 n
,看看它们与假定的 O(√n)
复杂性有何不同:
#include <stdio.h>
#include <math.h>
int main()
{
printf(" c root(n) ratio\n"); // rubric
for (int i = 1; i < 10; ++i) {
int n = 10000000 * i;
int count = 0;
int index = 0;
int c = 0;
while (index < n) {
count = count + 1;
index = index + count;
c = c + 1;
}
double d = sqrt(n);
printf("%5d %8.3lf %8.5lf\n", c, d, c / d);
}
return 0;
}
输出:
c root(n) ratio
4472 3162.278 1.41417
6325 4472.136 1.41431
7746 5477.226 1.41422
8944 6324.555 1.41417
10000 7071.068 1.41421
10954 7745.967 1.41416
11832 8366.600 1.41419
12649 8944.272 1.41420
13416 9486.833 1.41417
我们可以看到,尽管有一些 'rounding' 错误,但最后一列似乎 合理地 常量(而且,碰巧是 √2 的近似值,通常会随着 n
变大而改善)——因此,O(√n)
.