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