Verwenden des folgenden rekursiven Fibonacci-Algorithmus:
def fib(n):
if n==0:
return 0
elif n==1
return 1
return (fib(n-1)+fib(n-2))
Wenn ich die Zahl 5 eingebe, um fib (5) zu finden, weiß ich, dass dies 5 ausgibt, aber wie überprüfe ich die Komplexität dieses Algorithmus? Wie berechne ich die Schritte?
Antworten:
In den meisten Fällen können Sie die rekursiven Algorithmen mithilfe von rekursiven Gleichungen darstellen. In diesem Fall lautet die rekursive Gleichung für diesen Algorithmus . Dann können Sie die geschlossene Form der Gleichung mithilfe der Substitutionsmethode oder der Expansionsmethode (oder einer anderen Methode zur Lösung von Wiederholungen) finden. In diesem Fall erhalten Sie T ( n ) = Θ ( ϕ n ) , wobei ϕT(n)=T(n−1)+T(n−2)+Θ(1) T(n)=Θ(ϕn) ϕ ist der goldene Schnitt ( ).ϕ=(1+5√)2
Wenn Sie mehr über das Lösen von Wiederholungen erfahren möchten, empfehlen wir Ihnen dringend, Kapitel 4 der Einführung in Algorithmen zu lesen .
quelle
alternativ zu wiederkehrenden beziehungen / mathematischen analysen (aber nicht als ersatz ) besteht eine einfache empirische übung, die anscheinend nicht sehr oft in klassen unterrichtet wird, aber sehr informativ ist, darin, die anzahl der ausführungen der funktion zu zählen und dann die zählung für einen bereich grafisch darzustellen von kleinen n Eingaben und dann Kurve passen das Ergebnis. Die Ergebnisse stimmen im Allgemeinen gut mit dem theoretischen mathematischen Ansatz überein.
Ein gutes Begleitmaterial für diese Übung finden Sie im kostenlosen Online-Kapitel 3, Laufzeit von Algorithmen / Grundlagen der Informatik , Ullman
quelle
Das Ergebnis von fib (n) ist die Summe aller rekursiven Aufrufe, die 1 zurückgegeben haben. Daher gibt es genau fib (n) rekursive Aufrufe, die fib (1) auswerten. Die Ausführungszeit ist also Ω (fib (n)); Sie müssen zeigen, dass die Aufrufe, die 0 zurückgeben, und die anderen rekursiven Aufrufe nicht wesentlich dazu beitragen.
Dieselbe Argumentation würde für jede rekursiv definierte Funktion gelten, die entweder 1 oder 0 oder das Ergebnis eines anderen rekursiven Aufrufs zurückgibt.
quelle
quelle