[英]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.