循环调整的时间复杂度

时间:2018-06-18 02:07:24

标签: time-complexity big-o

你能解释为什么第一个是真的,第二个是假的吗?

enter image description here

4 个答案:

答案 0 :(得分:0)

让我用一个例子总结一下,假设n的值是8,那么{8}的可能值是1,2,4,8只要8看起来就会破坏。你可以看到循环运行3次,即log {n)次,因为i的值继续增加2倍。因此,真实。

对于第二部分,它是一个正常的循环,它从1到n的所有i值运行。并且p的值增加是因子p ^ 2n。所以它应该是O(p ^ 2n)。这就是为什么它是错误的。

答案 1 :(得分:0)

O(logn)时间:

for(i=0;i<n;i=i*c){// Any O(1) expression} 

这里,当索引i乘以/除以常数值时,时间复杂度为O(logn)。

在第二种情况下,

for(p=2,i=1,i<n;i++){ p=p*p }

增量增量是常数,即i=i+1,无论p的值如何,循环都将运行n次。因此,单独的循环具有O(n)的复杂性。考虑到朴素乘法p = p * p是O(n)表达式,其中n是p的大小。因此,复杂性应该是 O(n ^ 2)

答案 2 :(得分:0)

第一个循环,循环执行的次数是k次,  对于给定的n,i取值1,2,4,......小于n。

              2 ^ k <= n
              Or,  k <= log(n).

这意味着,k执行第一个循环的次数是log(n),即时间复杂度为O(log(n))。

第二个循环不会基于p执行,因为在for循环的决策语句中没有使用p。 p确实在循环中采用不同的值,但不会影响决策语句,p * p执行的次数,其时间复杂度为O(n)。

答案 3 :(得分:0)

为了理解为什么某些算法是O(log n),只需检查n = 2^k时会发生什么(即,我们可以将自己限制在log n恰好是整数的情况下k)。

如果我们将其注入表达式

for(i=1; i<2^k; i=i*2) s+=i;

我们看到i将采用值2, 4, 8, 16,...,即2^1, 2^2, 2^3, 2^4,...,直到到达最后一个2^k。换句话说,循环体将被评估k次。因此,如果我们假设正文为O(1),我们会发现复杂性为k*O(1) = O(k) = O(log n)