【问题标题】:How the time complexity of the following code is O(n)?以下代码的时间复杂度是O(n)?
【发布时间】:2017-02-14 10:12:01
【问题描述】:

我在 Interview Bit 上解决一个时间复杂度问题,如下图所示。

这个问题的正确答案是 O(N)。但在我看来,答案应该是 O(NlogN)。由于第一个“for循环”的复杂度应该是O(logN),因为变量i在每次迭代中除以2,我研究过每当循环变量被乘以或除以2时,时间复杂度是O (logN)。现在,对于第二个“for循环”,复杂度应该是O(N),因此最终的复杂度应该是O(N*logN)。

谁能解释我错在哪里?

【问题讨论】:

  • 请注意,O(NlogN) 实际上并不是错误,因为 O() 是一个上限。它的信息量比 O(N) 少。
  • 你出错的地方是,当外部循环进入 O(log N) 次时,提供的想法可能是整个算法确实需要 O(? * log N),内部循环不会对于外循环的每次执行,对于某个常数 c,平均执行 cN 次。正如 IVlad 的回答所述,您需要计算得出几何级数。

标签: algorithm time-complexity big-o asymptotic-complexity


【解决方案1】:

做实际的数学运算:

T(N) = N + N/2 + N/4 + ... + 1 (log_2 N terms in the sum)

这是一个几何级数,比率为1/2,所以和等于:

T(N) = N*[1 - (1/2)^(log_2 N)] / (1 - 1/2) =
     = [N - N/(2^log_2 N)] / 0.5 =
     2^log_2 N = N
     = (N - 1) / 0.5 

所以T(N)O(N)

【讨论】:

  • @IVIAd,我了解您如何计算 T(n) = O(n)。但我认为你只计算了外部 for 循环。但是对于内部的 for 循环我们应该怎么做呢?
  • @DG4 不,它适用于整个程序。当i = N 时,内部被执行N 次。当i = N/2 时,内部被执行N/2 次,以此类推。所以总和考虑了一切。
猜你喜欢
  • 1970-01-01
  • 2016-10-27
  • 2015-01-06
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2015-02-18
相关资源
最近更新 更多