Programmation dynamique et recherche textuelle
Principe de la programmation dynamique (sous-problèmes qui se recoupent, mémoïsation, tableau ascendant), rendu de monnaie optimal, comptage de chemins ; recherche d'un motif dans un texte : algorithme naïf et algorithme de Boyer-Moore-Horspool.
1. Programmation dynamique
Définition
La programmation dynamique résout un problème en combinant les solutions de sous-problèmes qui se recoupent, chacun n'étant calculé qu'une seule fois : soit en mémorisant les résultats d'une fonction récursive (mémoïsation, approche descendante), soit en remplissant un tableau du plus petit au plus grand sous-problème (approche ascendante).
Méthode · Rendu de monnaie optimal
def rendu_min(s, pieces):
m = [0] + [float("inf")] * s
for x in range(1, s + 1):
for p in pieces:
if p <= x and m[x - p] + 1 < m[x]:
m[x] = m[x - p] + 1
return m[s]
rendu_min(6, [1, 3, 4]) # 2Contrairement à l'algorithme glouton, la programmation dynamique donne toujours le nombre minimal de pièces.
Exemple · Chemins dans une grille
Nombre de chemins de la case en haut à gauche à la case $(i, j)$ en n'allant qu'à droite ou en bas : $c(i, j) = c(i - 1, j) + c(i, j - 1)$, avec $c = 1$ sur la première ligne et la première colonne. Pour une grille $3 \times 3$ cases : $c(2, 2) = 6$.
2. Recherche textuelle
Propriété · Algorithme naïf
On place le motif (longueur $m$) à chaque position du texte (longueur $n$) et on compare caractère par caractère : jusqu'à environ $n \times m$ comparaisons.
Propriété · Boyer-Moore-Horspool
On compare le motif de droite à gauche ; en cas d'échec, on regarde le caractère du texte aligné avec la dernière lettre du motif et on décale le motif d'après une table de décalages pré-calculée (distance de la dernière occurrence de ce caractère à la fin du motif, ou longueur du motif s'il en est absent). On saute ainsi de nombreuses positions : l'algorithme est très rapide en pratique.
Activité · Table des décalages
def table(motif):
m = len(motif)
return {motif[i]: m - 1 - i for i in range(m - 1)}
table("CHANT") # {'C': 4, 'H': 3, 'A': 2, 'N': 1}Un caractère absent (par exemple « E ») donne un décalage de $5$.
S'entraîner
Exercices corrigés
🎓 20 exercices corrigés et un quiz vous attendent dans ce chapitre.
Créez votre compte gratuit pour voir les corrections, faire les quiz et suivre votre progression.
Principe
★☆☆Quelle est l'idée centrale de la programmation dynamique ?
Remplir la table
★★☆Compléter la table du rendu minimal avec les pièces $\{1, 3, 4\}$ jusqu'à $s = 8$.
Comparer au glouton
★★☆Que donne le glouton pour $s = 6$ et les pièces $\{1, 3, 4\}$ ? et la programmation dynamique ?
Exécuter rendu_min
★★☆Que renvoie rendu_min(10, [1, 5, 6]) ? Que donnerait l'algorithme glouton ?
Retrouver les pièces
★★★Comment modifier rendu_min pour connaître les pièces utilisées ?
Fibonacci ascendant
★★☆Écrire fib(n) en programmation dynamique ascendante.
Chemins dans une grille
★★☆Combien de chemins dans une grille de $4 \times 4$ cases (aller de $(0,0)$ à $(3,3)$) ?
Programmer les chemins
★★★Écrire une fonction chemins(n, p) qui renvoie le nombre de chemins jusqu'à la case $(n - 1, p - 1)$.
Coût
★★☆Quel est le coût de rendu_min(s, pieces) avec $k$ pièces ?
Recherche naïve
★☆☆Combien de positions faut-il tester au plus pour chercher un motif de $5$ lettres dans un texte de $100$ lettres (algorithme naïf) ?
Programmer la recherche naïve
★★☆Écrire une fonction qui renvoie la liste des positions du motif m dans le texte t.
Table de décalages
★★☆Calculer la table de Horspool pour le motif « RIRE ».
Décalage absent
★☆☆Avec le motif « CHANT », de combien décale-t-on si le caractère du texte aligné sur la dernière lettre est « Z » ?
Lecture de la figure
★★☆Dans la figure, pourquoi le motif est-il décalé de $5$ positions d'un coup ?
Intérêt pratique
★☆☆Où utilise-t-on la recherche textuelle ?
ADN
★★☆Dans l'alphabet {A, C, G, T}, pourquoi les décalages de Horspool sont-ils souvent petits ?
Mémoïsation ou tableau
★★☆Quelle différence entre mémoïsation et approche ascendante ?
Sac à dos
★★★Pourquoi le problème du sac à dos se résout-il bien en programmation dynamique ?
Triangle de Pascal
★★☆Quel lien entre les chemins dans une grille et le triangle de Pascal ?
Vrai ou faux
★★☆a) La programmation dynamique recalcule les sous-problèmes. b) Boyer-Moore compare de droite à gauche. c) La recherche naïve peut coûter $n \times m$ comparaisons.
Vérifier
Avez-vous bien compris ?
Répondez au quiz : la correction s'affiche immédiatement.