【问题标题】:Linear or (n log n) time complexity线性或 (n log n) 时间复杂度
【发布时间】:2016-02-03 16:06:51
【问题描述】:
function f(n) {
  var cnt = 0;

  for (var j = n; j > 0; j = Math.floor(j / 5)) {
    var k = j * 2;

    while (k > 0) {
      cnt++;
      k -= 5;
    }
  }

  return cnt;
}

这个函数的时间复杂度是O(n)还是O(n log n)以及为什么
测试产生接近线性增长,但对于某些n log n 算法也是如此,对吧?

【问题讨论】:

  • 测试时,请务必禁用所有运行时优化。它们会对您的测量产生非常大的影响...
  • @alesc:我认为他衡量的是cnt

标签: javascript algorithm time-complexity


【解决方案1】:

for 循环的每次迭代中完成的工作形成了一个可以用geometric series 近似的系列(它是一个近似值,如底数和-=5,但可以用作上限) .

级数的总和将等于第一项乘以某个常数,与 1+1/2+1/4... = 2 相同。

所以这是 O(n)。

【讨论】:

    【解决方案2】:

    它是2 * sum(5^j / 5) for j = 0 to log_{5}(n) = O(n)。它基本上是一个几何级数。维基百科的链接https://en.wikipedia.org/wiki/Geometric_progression

    【讨论】:

      【解决方案3】:

      让我们假设复杂度是迭代计算 C for 的复杂度是 C=ln(n)/ln(5) 而 while 的复杂度是 C=k/5 (k = j*2) 整体复杂度为

      N = 5^m  ->  m = ln(n)/ln(5)
      
      C(n) = sum(k = 0->m)(5^k/5) * 2
      
      C(n) = (1 - 5^m)/(1 - 5) * 2 = (n + 1)/2
      
      O(n) = n
      

      【讨论】:

      • 你不能简单地将这两个数字相乘。
      • 我除以 2,原因。
      • 没有区别。你有一个上限,但有一个宽松的上限。
      • 是的,我的错。让我改一下。
      【解决方案4】:

      您有从 i=1 到 log(n) 的 for 循环,而循环的长度为 2*n/5^i * 1/5。 让我们数一下总和:2/5*n *(从 i=1 到 log(n) 的总和:1/5^i)总和是 geom。进步所以它是有限的。所以你有 O(c*n) 其中 c 是一个常数。

      【讨论】:

      • “原来如此”...您的解释存在巨大且不正确的空白。
      猜你喜欢
      • 2011-07-09
      • 2010-11-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多