Die naive Rekursionsversion von Fibonacci ist aufgrund der Wiederholungen in der Berechnung exponentiell:
An der Wurzel rechnest du:
F(n) hängt von F(n-1) und F(n-2) ab
F(n-1) hängt wiederum von F(n-2) und F(n-3) ab
F(n-2) hängt wiederum von F(n-3) und F(n-4) ab
dann haben Sie auf jeder Ebene 2 rekursive Aufrufe, die eine Menge Daten in der Berechnung verschwenden, die Zeitfunktion wird wie folgt aussehen:
T(n) = T(n-1) + T(n-2) + C, wobei C konstant ist
T(n-1) = T(n-2) + T(n-3) > T(n-2) dann
T(n) > 2*T(n-2)
...
T(n) > 2^(n/2) * T(1) = O(2^(n/2))
Dies ist nur eine untere Grenze, die für den Zweck Ihrer Analyse ausreichen sollte, aber die Echtzeitfunktion ist ein Faktor einer Konstanten durch die gleiche Fibonacci-Formel und die geschlossene Form ist bekanntlich ein Exponentialwert des Goldenen Schnitts.
Darüber hinaus können Sie optimierte Versionen von Fibonacci finden, indem Sie dynamische Programmierung wie diese verwenden:
static int fib(int n)
{
/* memory */
int f[] = new int[n+1];
int i;
/* Init */
f[0] = 0;
f[1] = 1;
/* Fill */
for (i = 2; i <= n; i++)
{
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
Das ist optimiert und macht nur n Schritte, sondern ist auch exponentiell.
Kostenfunktionen werden von der Eingabegröße bis zur Anzahl der Schritte zur Lösung des Problems definiert. Wenn Sie die dynamische Version von Fibonacci ( n Schritte zur Berechnung der Tabelle) oder der einfachste Algorithmus zur Feststellung, ob eine Zahl eine Primzahl ist ( sqrt(n) um die gültigen Teiler der Zahl zu analysieren). Sie könnten denken, dass diese Algorithmen O(n) o O(sqrt(n)) aber das ist aus folgendem Grund einfach nicht richtig: Die Eingabe für Ihren Algorithmus ist eine Zahl: n Bei Verwendung der binären Notation ist die Eingabegröße für eine ganze Zahl n est log2(n) dann eine variable Änderung von
m = log2(n) // your real input size
Ermitteln Sie die Anzahl der Schritte in Abhängigkeit von der Eingabegröße
m = log2(n)
2^m = 2^log2(n) = n
dann sind die Kosten Ihres Algorithmus in Abhängigkeit von der Eingabegröße:
T(m) = n steps = 2^m steps
und deshalb sind die Kosten exponentiell.