NSIChapitre 6

Algorithmique : recherche textuelle, programmation dynamique, diviser pour régner

L'essentiel en 30 secondes

Diviser pour régner décompose un problème en sous-problèmes indépendants, les résout récursivement et combine (tri fusion : $O(n \\log n)$ garanti). La programmation dynamique optimise les problèmes à sous-problèmes chevauchants en stockant les résultats : mémoïsation (top-down, cache dict) ou tabulation (bottom-up, tableau). Fibonacci passe de $O(2^n)$ à $O(n)$. La recherche textuelle naïve teste le motif à chaque position en $O(n \\times m)$.

Les notions à connaître

Diviser pour régner
Paradigme algorithmique en 3 étapes : (1) Diviser le problème en sous-problèmes indépendants plus petits, (2) Régner en résolvant récursivement chaque sous-problème, (3) Combiner les solutions. Ex : tri fusion, recherche dichotomique, exponentiation rapide.
Tri fusion (merge sort)
Divise la liste en deux moitiés, trie récursivement chaque moitié, fusionne les deux listes triées. Complexité TOUJOURS O(nlogn)O(n \log n) (meilleur, moyen et pire cas). Stable (préserve l'ordre des éléments égaux). Espace auxiliaire O(n)O(n).
Programmation dynamique
Optimise les problèmes ayant des sous-problèmes chevauchants et une sous-structure optimale. Deux approches : top-down (mémoïsation avec cache) ou bottom-up (tabulation avec tableau). Évite les recalculs redondants.
Mémoïsation
Approche top-down de la prog. dynamique : on garde un dictionnaire (cache) des résultats déjà calculés. Avant de calculer f(n), on vérifie si f(n) est dans le cache. Transforme O(2n)O(2^n) en O(n)O(n) pour Fibonacci.
Tabulation
Approche bottom-up de la prog. dynamique : on remplit un tableau du plus petit sous-problème au plus grand. Pas de récursion, donc pas de risque de RecursionError. Ex : tab[0]=0, tab[1]=1, tab[i]=tab[i-1]+tab[i-2].
Recherche textuelle naïve
Pour chaque position i du texte (de 0 à n-m), comparer le motif caractère par caractère. Complexité O(n×m)O(n \times m) dans le pire cas (n=len(texte), m=len(motif)).
Algorithme de Boyer-Moore (simplifié)
Optimise la recherche textuelle en comparant le motif de droite à gauche et en sautant des positions grâce à une table de décalage. Complexité moyenne sous-linéaire O(n/m)O(n/m).
Sous-structure optimale
Propriété clé de la prog. dynamique : la solution optimale du problème contient les solutions optimales des sous-problèmes. Ex : le plus court chemin de A à C passant par B = plus court AA \to B + plus court BB \to C.

Les erreurs à éviter en nsi

Sais-tu répondre à ces questions ?

Les corrigés détaillés sont dans le quiz du chapitre.

  1. Quelle est la complexité dans le pire cas de la recherche naïve d'un motif de taille m dans un texte de taille n ?
  2. Quel est le principe fondamental de la programmation dynamique ?
  3. Combien de fois le motif 'AB' apparaît-il dans le texte 'ABABCABAB' ?
  4. On calcule la suite de Fibonacci avec programmation dynamique : def fibdp(n):b_dp(n): tab = [0] * (n + 1) tab[1] = 1 for i in range(2, n + 1): tab[i] = tab[i - 1] + tab[i - 2] return tab[n] Quelle est la complexité temporelle de cette approche ?
  5. L'algorithme de Boyer-Moore améliore la recherche textuelle grâce à une heuristique. Quelle est son idée principale ?

Accède à la fiche complète

Crée ton compte gratuit pour lire la fiche en entier et accéder à 7 000+ contenus de révision.

Les autres chapitres de nsi en tle spécialité