Time complexity 为什么代码的时间复杂度是O(logn)?

Time complexity 为什么代码的时间复杂度是O(logn)?,time-complexity,big-o,Time Complexity,Big O,以下是Gayle Laakmann在《破解编码采访》一书中给出的代码。下面是要查找的代码的时间复杂性:- int sumDigits(int n) { int sum=0; while(n >0) { sum+=n%10; n/=10 } return sum ; } 我知道时间复杂度应该是n中的位数 根据这本书,它的运行时复杂性是OLOGN。这本书提供了简短的描述,但我不明白 while(n > 0) { sum += n % 10; n /=

以下是Gayle Laakmann在《破解编码采访》一书中给出的代码。下面是要查找的代码的时间复杂性:-

int sumDigits(int n)
{ int sum=0;
 while(n >0)
{
    sum+=n%10;
    n/=10
}
return sum ;
}
我知道时间复杂度应该是n中的位数

根据这本书,它的运行时复杂性是OLOGN。这本书提供了简短的描述,但我不明白

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+1步骤才能完成循环,这就是逻辑运行的原因。

逻辑运行的次数是logn到10的基数,这与logn到2的基数相同/log10到2的基数相同。就时间复杂度而言,这只是一个Olog n。请注意,以10为底的logn表示n中的位数。

n中的位数是logn。或者是O复杂度的一个足够接近的近似值。n不会减少1,因此不是线性的。循环中的每一次传递,n都会减少一个数量级,这可能是感谢阿德南给出的完美答案的重复。