繁体   English   中英

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

[英]Linear or (n log n) 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算法也是如此,对吗?

for循环的每次迭代中完成的工作形成一个可以由几何级数近似的级数 (它是底数和-= 5的近似值,但可以用作上限)。

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

所以这是O(n)。

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

让我们假设复杂度, 因为for的迭代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

您拥有从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是一个常数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM