2010-06-27 91 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)。