Chiffrer le gaspillage
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 17 — Programmation dynamique
Énoncé
Le chapitre affirme que fib 40 coûte « un milliard d'appels pour quarante valeurs distinctes ». Chiffrer exactement : combien la version récursive naïve fait-elle d'appels pour calculer fib n ? Et la version mémoïsée ?
Corrigé
Notons le nombre d'appels de la version naïve. Un appel se fait lui-même, puis lance et appels :
On vérifie par récurrence double que , où est la suite de Fibonacci : c'est vrai pour et , et .
Mesure (compteur incrémenté à chaque appel) :
n=10 fib= 55 appels naif= 177 appels memoise= 19
n=20 fib= 6765 appels naif= 21891 appels memoise= 39
n=30 fib= 832040 appels naif= 2692537 appels memoise= 59
On lit bien , et : le « milliard » du chapitre est un ordre de grandeur, la valeur exacte est trois cent trente et un millions.
Côté mémoïsation, la mesure donne : c'est . Pourquoi et non : chaque valeur entre et est calculée une fois, mais elle est demandée deux fois — une fois par , une fois par . Le second appel trouve la table garnie et rend immédiatement : il coûte , mais il compte comme appel. La complexité reste .
Ce que l'exercice montre : le chevauchement des sous-problèmes n'est pas une figure de style. Ici il fait passer de à , et le rapport vaut déjà pour .
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.