2016-02-03 102 views
0
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算法也是如此,對嗎?線性或者(N log n)的時間複雜度

+0

測試時,一定要禁用所有運行時優化。他們可以對您的測量產生非常大的影響... – alesc

+0

@alesc:我認爲他測量了'cnt'。 –

回答

2

是在for每次循環執行的操作的鏈接形成一系列可以通過geometric series近似(這是一個近似的地板, - = 5,但可以作爲一個上限)。

進展的總和將是等於第一項乘以某個常數,以相同的方式如1 + 1/2 + 1/4 ... = 2

所以這是O (N)。

-1

你有for循環從i = 1到log(n),while循環的長度是2 * n/5^i * 1/5。 讓我們來計算summ:2/5 * n *(從i = 1到log(n):1/5^i)summ是幾何。進展,所以它是有限的。所以你有O(c * n),其中c是一個常數。

+0

「所以這是......」這是你的解釋中巨大的,不正確的差距。 –

0

假設複雜度的迭代COUN Ç complexiti的是C = LN(N)/ LN(5)和同時爲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 
+0

你不能簡單地乘以這兩個數字。 –

+0

我除以2,原因。 – TheBook

+0

沒有區別。你有一個上限,但是一個鬆動。 –

相關問題