簡體   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