2010-06-27 3 views
2

Есть ли кто-то, кто знает, что такое вычислительная стоимость для этих двух частей кода?Вычислительная стоимость

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

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

Это домашнее задание? – kennytm

+0

Нет, это просто мое любопытство (я вижу вопрос на форуме, и я стал любопытным). :) – BlackShadow

+0

Это скорее зависит от того, что представление n является - для произвольной точности, sqrt (n) само является O (log n) –

ответ

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).

+0

Я тоже думал то же самое (что-то вроде log2 (log2 (n)), но я не был уверен , для второго? – BlackShadow

+0

@BlackShadow - просто используйте следующие формулы: 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

+0

Я предполагаю, что вы использовали также свойства big-O для удаления «1/log 2» и «log log p/log 2». – ony

4

Ответ на первый должен стать очевидным, если один переделывает его в логарифмической области:

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

Сколько раз вам нужно сократить вдвое число для того, чтобы достичь 1? O (log n).

Смежные вопросы