2016-05-27 12 views
0

Ich habe log n aber es ist nicht log n es ist log (log n)
aber warum?Wie findet man diese Funktionskomplexität?


int function(int n){ 
    return aux(n , 2) 
} 

int aux(int n, int x){ 
    while (n<x) { 
    x *= x; 
    } 
    return x; 
} 

, was die Komplexität der Funktion?

+4

Unendlich. Dieser Algorithmus wird niemals beendet, wenn "n" kleiner als 2 ist. Der * Code * andererseits wird je nach Architektur nach 5 oder 6 Iterationen überlaufen. – RBarryYoung

+3

Eigentlich ist es * O (1) * wenn 'n> 0', weil die Anzahl der Operationen, die benötigt werden um 'x' zu überfließen, unabhängig von' n' ist. – user3386109

+2

Sollte es nicht 'x harold

Antwort

1

Ziemlich sicher, dass die Schleife Bedingung n > x sein soll, so werde ich es in dieser Antwort annehmen.

Zuerst beachten Sie die Werte von x:

x1 = x0 * x0 
    = 2 * 2 
    = 2^2 
x2 = x1 * x1 
    = x0 * x0 * x0 * x0 
    = 2 * 2 * 2 * 2 
    = 2^4 
x3 = x2 * x2 
    = x1 * x1 * x1 * x1 
    = x0 * x0 * x0 * x0 * x0 * x0 * x0 * x0 
    = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 
    = 2^8 

Wir sehen, dass der Exponent wächst als 2^t wo t die Anzahl der Iterationen in der Schleife ist, so dass wir die geschlossene Form Gleichung für x erhalten:

x = 2^(2^t) 

Dann können wir für die Anzahl der Iterationen lösen t:

n > x 
=> n > 2^(2^t) 
=> log(n) > 2^t 
=> log(log(n)) > t 

wie erforderlich.