Complexité de l'algorithme de Fibonacci récursif

13

En utilisant l'algorithme récursif de Fibonacci suivant:

def fib(n):
   if n==0:
      return 0
   elif n==1
      return 1
   return (fib(n-1)+fib(n-2))

Si j'entre le nombre 5 pour trouver fib (5), je sais que cela produira 5 mais comment puis-je examiner la complexité de cet algorithme? Comment calculer les étapes impliquées?

joker
la source
Je cherchais la même chose, et je suis tombé sur cette vidéo de MyCodeSchool, je recommande de vérifier cela.
snbk97

Réponses:

23

La plupart du temps, vous pouvez représenter les algorithmes récursifs à l'aide d'équations récursives. Dans ce cas, l'équation récursive de cet algorithme est . Ensuite, vous pouvez trouver la forme fermée de l'équation en utilisant la méthode de substitution ou la méthode d'expansion (ou toute autre méthode utilisée pour résoudre les récurrences). Dans ce cas, vous obtenez T ( n ) = Θ ( ϕ n ) , où ϕT(n)=T(n-1)+T(n-2)+Θ(1)T(n)=Θ(ϕn)ϕest le nombre d'or ( ).ϕ=(1+5)2

Si vous souhaitez en savoir plus sur la façon de résoudre les récidives, je vous recommande fortement de lire le chapitre 4 de Introduction aux algorithmes .

ees_cu
la source
0

comme alternative aux relations récurrentes / analyse mathématique (mais pas comme substitut ), un simple exercice empirique, apparemment peu enseigné en classe mais très instructif, consiste à compter le nombre d'exécutions de la fonction, puis à représenter graphiquement le nombre d'une plage de petites entrées n , puis courbe ajuster le résultat. les résultats correspondent généralement étroitement à l'approche mathématique théorique.

Un bon matériel de support pour cet exercice peut être trouvé dans le chapitre 3 en ligne gratuit, Durée d'exécution des algorithmes / Fondements de l'informatique , Ullman

vzn
la source
1) Le tracé ne remplace en aucun cas l'analyse formelle. C'est facilement dupe. 2) Je pense que vous déformez la source que vous citez. Ils mentionnent le tracé, mais pas comme un moyen de déterminer la «complexité». 3) FWIW, je suis en désaccord avec l'approche et son utilisation telle que Ullman la présente, mais ce n'est pas de votre faute.
Raphael
1
la réponse commence essentiellement par votre avertissement, disant que le traçage ne remplace pas l'analyse mathématique . le traçage est une méthode scientifique et dire / observer qu'il est parfois dupe, c'est apprendre / évoquer les aspects statistiques des données, qui est un autre aspect primordial de l'analyse scientifique . penser qu'il est "facilement dupe" est assez dramatique, il y a des cas "pathologiques" où il échoue mais ils sont généralement "artificiels" ... la question était d' examiner la complexité de l'algorithme et l'analyse empirique est un aspect clé / angle sur cela, et évidemment pas le seul angle etc ...
vzn
0

Le résultat de fib (n) est la somme de tous les appels récursifs qui ont renvoyé 1. Par conséquent, il existe exactement des appels récursifs fib (n) évaluant fib (1). Le temps d'exécution est donc Ω (fib (n)); vous devez montrer que les appels renvoyant 0 et les autres appels récursifs n'y ajoutent pas de manière significative.

Le même raisonnement s'appliquerait à toute fonction définie récursivement qui retourne 1 ou 0, ou le résultat d'un autre appel récursif.

gnasher729
la source
"au moins O (fib (n))" - cela n'a aucun sens. Vous souhaitez utiliserΩ.
Raphael
N'hésitez pas à modifier la réponse si vous y tenez beaucoup.
gnasher729
0

Une borne inférieure est intuitive: T(n)=T(n-1)+T(n-2) T(n)>2T(n-2) puisque T(n-1)>T(n-2) Par conséquent T(n)=Ω(cn)

wabbit
la source