我试图弄清楚这些算法并计算出如下的复杂性,这是正确的吗?
for (i=1; i<2*n; i++) // runs 2n-1 times
for (j=1; j<=n; j*=3)// runs log n(base 3)
for (k=n; k>=1; k--)// runs n times
复杂性:O(n ^ 2 log n)
int t=0;
for(int i=1; i<=n; i++) //runs n times
for(int j=0; j*j<4*n; j++) //runs (2√n)
for(int k=1; k*k<=9*n; k++) //runs (3√n)
t++;
复杂性:O(n ^ 2)
int x=0;
for(int i=1; i<=n; i=i*3){ //runs 1, 3, 9, 27..
if(i%2 != 0) // true for values above
for(int j=0; j<i; j++) // runs n times
x++;
}
无法弄清楚这一个
请解释我是否错了。
答案 0 :(得分:0)
int x=0;
for(int i=1; i<=n; i=i*3){ //log n
if(i%2 != 0) // true for values above
for(int j=0; j<i; j++) // runs n times
x++;
}
在这里,您可以看到第一个循环以O(log n)
复杂度运行。并且内部运行直到i
即n
次,这表示n
值是什么,j
值的增量是常数,即{{1}字面意思是1
。所以结合两者。根据主定理,内部O(n)
和外部T(n)
,我们将复杂度定为T(logn)
。
答案 1 :(得分:0)
第一个循环的运行时间为O(log_3(n))
。 if
评论始终为真,因此第二次循环会一直运行到j<i
(不是j<n
)。
所以总运行时间如下:
1 + 3 + 9 + 27 + ... =Σ{i = 0到log_3(n)}(3 ^ i)==(3 * n-1)/ 2
所以复杂性是
O(n)