【发布时间】:2017-09-07 20:53:57
【问题描述】:
以下每个代码段的时间复杂度是多少?
1. int i, j, y=0, s=0;
for ( j = 1; j <= n; j ++)
{
y=y+j;
}
for ( i = 1; i <= y; i ++)
{
s++;
}
我的答案是 O(2n),因为它遍历每个循环 n 次并且有两个循环
2. function (n) {
while (n > 1) {
n = n/3 ;
}
我对此的回答是 n^(1/3),因为 n 每次都会变成它的三分之一
3. function (n) {
int i, j, k ;
for ( i = n/2; i <= n; i ++ ) { //n/2?
for ( j = 1; j <= n; j = 2*j ) { //logn
for ( k = 1; k <= n; k = 2*k ) { //logn
cout << ”COSC 2437.201, 301” << endl;
}
}
}
}
我说这个问题的答案是 O(log2*log2n*n/2) 但我对第一个 for 循环感到很困惑。循环只需要迭代 n 次的一半,所以它是 n/2 正确的吗?谢谢大家的帮助。
【问题讨论】:
-
首先,
O(2n)只是O(n)- 这是问题 1 的错误答案。 -
第一个 for 循环究竟是什么让你感到困惑?
-
第一段怎么可能是 O(n) 之外的任何东西?对于第一个循环,循环只需要迭代 n 次的一半,所以它会是 n/2 正确吗?
-
第二个循环呢?这取决于第一个循环后
y的值,对吧?那会是什么? -
"n^(1/3) 因为 n 每次都变成它的三分之一" 不合逻辑。
标签: c++ algorithm time-complexity notation