以下是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)。书中提供了简要描述,但我不明白。
答案 0 :(得分:3)
while(n > 0)
{
sum += n % 10;
n /= 10;
}
那么,这个while循环会采取多少步骤,以便n
来到0
?您在每个步骤中执行的操作,将n
与10
分开。因此,您需要k
次来0
。请注意,k是n
中的位数。
让我们一步一步走:
第一步是在n > 0
时,您将n
除以10
。如果n
仍为正值,则将其除以10
。你得到的是n/10/10
或n / (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中的位数。