线性或(n log n)时间复杂度

时间:2016-02-03 16:06:52

标签: javascript algorithm time-complexity

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算法也是如此,对吗?

4 个答案:

答案 0 :(得分:2)

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

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

所以这是O(n)。

答案 1 :(得分:0)

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

的链接

答案 2 :(得分:0)

假设复杂性为迭代法 C 的复杂性为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

答案 3 :(得分:-1)

你有从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是常数。