【问题标题】:Why is Time complexity of the code O(log n)?为什么代码的时间复杂度为 O(log n)?
【发布时间】:2018-03-19 04:12:48
【问题描述】:

这是 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)。书提供了简要说明,但我不明白。

【问题讨论】:

  • n 的位数为 log n。 (或者足够接近 O 复杂度的近似值。)
  • n 不减 1,因此不是线性的。循环中的每一次通过,n 都会减少一个数量级
  • Code complexity的可能重复

标签: time-complexity big-o


【解决方案1】:
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)) &gt; 1,所以它:

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

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

【讨论】:

  • 感谢 Adnan 的完美回答。
【解决方案2】:

逻辑运行的次数是 log(n) 以 10 为底,这与 (log(n) 以 2 为底)/(log (10) 以 2 为底) 相同。就时间复杂度而言,这将只是 O(log (n))。请注意,以 10 为底的 log(n) 是表示 n 中位数的方式。

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多