答案 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)
。