为什么代码的时间复杂度为O(log n)?

时间:2017-10-07 14:22:13

标签: time-complexity big-o

以下是Gayle Laakmann撰写的“Cracking the Coding Interview”一书中给出的代码。这里找到代码的时间复杂度: -

int sumDigits(int n)
{ int sum=0;
 while(n >0)
{
    sum+=n%10;
    n/=10
}
return sum ;
}

我知道时间复杂度应该是n中的位数。

根据该书,其运行时复杂度为O(log n)。书中提供了简要描述,但我不明白。

2 个答案:

答案 0 :(得分:3)

while(n > 0)
{
    sum += n % 10;
    n /= 10;
}

那么,这个while循环会采取多少步骤,以便n来到0?您在每个步骤中执行的操作,将n10分开。因此,您需要k次来0。请注意,k是n中的位数。

让我们一步一步走: 第一步是在n > 0时,您将n除以10。如果n仍为正值,则将其除以10。你得到的是n/10/10n / (10^2)。第三次,它的n / (10^3)。经过k次,它的n/(10^k) = 0。循环将结束。但这在数学意义上不是0,而是0因为我们处理整数。你真正拥有的是|n|/(10^k) < 1,其中k∈N

所以,我们现在有了这个:

n/(10^k) < 1
n < 10^k
logn < k

顺便说一下。它也是n/(10^(k-1)) > 1,所以它的:

k-1 < logn < k。 (顺便说一句。别忘了,这是基础10)。

因此,您需要执行logn + 1步骤才能完成循环,这就是为什么O(log(n))

答案 1 :(得分:0)

逻辑运行的次数是log(n)到10的基数,它与(基数2的log(n))/ log(10)到2的基数相同。就时间复杂度而言,这只是O(log(n))。请注意,log(n)到10的基数是如何表示n中的位数。