对于所有这些,我必须找出运行时间。
1
for ( int i = 0; i < n; i+=2 )
sum++;
2。
for ( int i = 1; i < n; i*=2 )
sum++
3
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < n; j++ )
sum++;
4
for ( int i = 0; i < n; i++ )
sum++
for ( int j = 0; j < n; j++ )
sum++
// The above are two loops one after the other, NOT nested
5
for ( int i = 0; i < 2*n; i++ )
sum++
6
for ( int i = 0; i < n*n; i++ )
sum++;
7
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < n*n; j++ )
sum++;
8
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < 10000; j++ )
sum++;
第一个是O(n),第四个是O(n ^ 2)。这些是正确的吗?我怎么做其他人?我真的很困惑第二个。
答案可以用大O或大theta表示。
答案 0 :(得分:5)
基本上,您可以按n
计算操作次数。
E.g:
for ( int i = 0; i < n; i+=2 )
sum++;
sum++
是1次操作,您循环n/2
次。因此,此代码执行n/2
次操作。因此,大O是O(n/2) = O(n)
(你可以抛出常数因子1/2
)。
对于其他问题,只需执行相同的操作(计算执行sum++
的次数,然后通过抛出常量来简化)。
答案 1 :(得分:2)
一种正式但又乏味的方法,使用Sigma符号(离散数学)来提出增长复杂性的循环顺序。
1. Linear
2. Logarithmic
3. Nested Independent Loops
4. Independent Loops
5. Linear
6. Quadratic
7. Independent Nested Loops
8. Independent Nested Loops