Fiche à trous · Terminale · NSI
Programmation dynamique — Mémoïsation
Complétez de mémoire, puis vérifiez avec la page de corrigé.
Mémoriser les résultats intermédiaires d'une fonction récursive peut la rendre des millions de fois plus rapide — ou n'avoir strictement aucun effet, sinon celui d'occuper de la mémoire. Tout dépend d'une seule propriété du problème, et il faut la vérifier avant d'écrire une ligne.
La condition
Règle
2Piège
Ajouter une mémoïsation à une fonction récursive quelconque en espérant l'accélérer.
Avant de mémoriser, vérifier que les mêmes entrées reviennent.
Exemple
Pourquoi la mémoïsation transforme-t-elle le calcul récursif de Fibonacci, et pas celui du tri fusion ?
- 3.
- 4.
- 5.
Résultat :
Deux façons de procéder
Propriété
Le choix entre les deux n'est pas qu'une question de goût. La mémoïsation se code en modifiant très peu la fonction récursive d'origine, ce qui limite les erreurs d'écriture. La tabulation demande de trouver le bon ordre de remplissage — chaque case ne doit dépendre que de cases déjà remplies —, ce qui est parfois le vrai travail du problème.
Deux problèmes de référence
Propriété
Ces deux problèmes partagent la structure qui rend le paradigme applicable : une solution optimale se compose de solutions optimales de sous-problèmes. Cette propriété n'est pas automatique — elle se vérifie, et c'est elle, avec le chevauchement, qui autorise le procédé. Un problème où un choix localement optimal interdit le meilleur choix global ne s'y prête pas.
Transformer une récursion en solution par programmation dynamique
- 9.
- 10.
- 11.
- 12.
- 13.
- Ai-je vérifié que les sous-problèmes se chevauchent ?
- Ai-je identifié ce qui caractérise un sous-problème — quels paramètres ?
- Ma table est-elle consultée avant le calcul et écrite après ?
- Ai-je mesuré le nombre de sous-problèmes distincts pour estimer le gain ?
- Si je tabule, chaque case ne dépend-elle que de cases déjà remplies ?
- Ai-je vérifié qu'une solution optimale se compose de sous-solutions optimales ?