2010-06-27 122 views
2

是否有人知道這兩段代碼的計算成本是多少?計算成本

while (n > 2) 
    n = sqrt(n); 

while (n > 2) 
    n = log(n); 
+1

作業嗎? – kennytm 2010-06-27 11:04:53

+0

不,這只是我的好奇心(我在一個論壇上看到了問題,我變成了好奇)。 :) – BlackShadow 2010-06-27 11:17:29

+0

它寧可取決於n的表示 - 對於任意精度,sqrt(n)本身是O(log n) – 2010-06-28 10:54:20

回答

9

第二是O(log* n)其中log *iterated logarithm

分析第一個得出這樣的事:

sqrt(n) = n^(1/2) 
sqrt(sqrt(n)) = n^(1/4) 
sqrt(sqrt(sqrt(n))) = n^(1/8) 
... 
sqrt applied k times = n^(1/2^k) 

認爲第一算法執行k倍(基本上,我們的次數適用sqrt直到n <= 2)。

考慮這樣一個道理:

n^(1/2^k) = p (p <= 2) |^(2^k) 
n = p^(2^k) | log 
log n = (2^k) log p | log 
log log n = log (2^k) + log log p 
log log n = klog2 + log log p 
=> k ~= log log n 

所以第一個算法是O(log log n)

n = log2(n); 
while (n > 1) 
    n = n/2; 

多少次,你需要以一個減半數達到1:

+0

我也認爲同樣的事情(類似於log2(log2(n)),但我不確定,第二個? – BlackShadow 2010-06-27 11:33:35

+0

@黑色陰影 - 簡單地使用這些公式:1. sqrt(n)= n ^(1/2); 2.(a^b)^ c = a ^(b * c) log(a * b)= log a + log b; 4. log(a^b)= b * log a'這就是你需要證明的全部內容 – IVlad 2010-06-27 11:39:00

+0

我想你也使用了big-O的專有名詞來刪除「1/log 2」和「log log p/log 2」。 – ony 2010-06-27 12:26:16

4

如果重鑄它在對數域中的答案,第一個應該變得明顯嗎? O(log n)。