NSI · terminale spe
Chapitre 6 — Algorithmique : recherche textuelle, programmation dynamique, diviser pour régner
L'essentiel en 30 secondes
Diviser pour régner décomposer un problème en indépendants, les résoudre récursivement, puis combiner : tri fusion). La programmation dynamique optimise les problèmes avec chevauchants en stockant les résultats déjà calculés (mémoïsation). La recherche textuelle naïve teste le motif chaque position du texte en .
Notions clés
- Diviser pour régner
- Paradigme en 3 étapes : diviser le problème, résoudre les sous-problèmes (récursion), combiner les solutions.
- Tri fusion (merge sort)
- Divise la liste en deux moitiés, trie récursivement chaque moitié, fusionne les deux listes triées. O(n log n) garanti.
- Programmation dynamique
- Résout un problème en stockant les solutions des sous-problèmes (table ou mémoïsation) pour éviter les recalculs.
- Mémoïsation
- Version top-down de la programmation dynamique : on garde un cache (dict) des résultats déjà calculés.
- Recherche textuelle naïve
- Pour chaque position du texte, on compare caractère par caractère avec le motif. dans le pire cas.
Formules
Tri fusion
Condition : Complexité O(n log n) en temps, O(n) en espace auxiliaire
Fibonacci avec mémoïsation
Condition : Sans mémo : O(2^n). Avec mémo : O(n). Gain considérable.
Recherche textuelle naïve
Condition : dans le pire cas, avec et
A retenir
- Diviser pour régner = sous-problèmes INDÉPENDANTS. Prog. dynamique = sous-problèmes CHEVAUCHANTS.
- Le tri fusion est toujours en log , contrairement au tri rapide qui est en dans le pire cas.
- La mémoïsation transforme un algorithme exponentiel en algorithme polynomial quand les sous-problèmes se recouvrent.
Erreurs classiques
Erreur : Confondre diviser pour régner et programmation dynamique
Correction : DPR : sous-problèmes indépendants (tri fusion). PD : sous-problèmes qui se chevauchent (Fibonacci).
Erreur : Oublier la fusion dans le tri fusion
Correction : Diviser ne suffit pas : il faut fusionner les sous-listes triées avec la fonction fusion() dédiée.
Erreur : Ne pas gérer la borne supérieure dans la recherche textuelle
Correction : La boucle va de 0 à len(texte) - len(motif), inclus. Sinon, dépassement d'indice.
Astuce méthode
Au bac, si on te demande la complexité d'un algo diviser pour régner, retiens la formule : si on divise en 2 et qu'on fusionne en O(n), la complexité est O(n log n). Dessine l'arbre des appels pour le vérifier.