以下每个代码段的时间复杂度是多少?
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是否正确?感谢大家的帮助。
答案 0 :(得分:2)
问题1
第一个循环是O(n)
,因为它运行n
次。 然而,第二个循环执行y
次,而不是n
- 因此总运行时间不是&#34; 2n
&#34;
在第一个循环结束时,y
的值为:
因此,第二个循环占主导地位,因为它是O(n^2)
,因此也是整体复杂性。
问题3
这个答案是正确的(但同样,在O符号中删除2
的因子)。
但是,你必须小心天真地将环的复杂性相乘,因为内环的边界可能取决于外环的自发值。
问题2
这是不是 O(n^(1/3))
!你的推理是不正确的。
如果仔细观察这个循环,它实际上类似于问题3中内循环的 reverse :
k
的值从1开始,每次乘以2,直到达到n
n
的值每次除以3,直到达到1。因此他们都采取O(log n)
步骤。
(作为旁注,O(n^(1/3))
循环看起来像这样:)
for (int i = 1; i*i*i <= n; i++)
/* ... */