Numérique et sciences informatiques (spécialité) · TerminaleBac
Recherche textuelle et Boyer-Moore : exercices de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Chercher un motif dans un texte, c'est trouver une ou toutes les positions où le motif apparaît.2
- Le coût d'une recherche se mesure surtout en nombre de comparaisons de caractères.1
- Dans la version simplifiée de Boyer-Moore (Horspool), on compare le motif de droite à gauche et on décale grâce à une table construite à partir du motif.
- Le décalage maximal vaut la longueur du motif : plus il est grand, moins on fait de comparaisons.
Comment utiliser ces exercices
Ces exercices s'adressent à toi si tu prépares l'épreuve de spécialité NSI du bac et que tu veux t'entraîner sur la recherche textuelle. Tu y manipules un petit nombre de notions : la définition du problème, le comptage des comparaisons, la table de décalage et la simulation à la main de l'algorithme de Horspool. Prends une feuille, écris les alignements du motif sous le texte, et ne regarde les indices qu'après avoir cherché.
L'algorithme de Boyer et Moore date de 1977 et il est très efficace.1 Une version simplifiée, due à Horspool, est celle que l'on étudie en classe.1 La version complète ajoute une seconde table de décalage, bien plus difficile à calculer, qui autorise des sauts plus grands.1 Les exercices portent uniquement sur la version simplifiée.
Rappel de la méthode de Horspool
Pourquoi compter les comparaisons
Comparer deux algorithmes par leur temps d'exécution dépend de la machine. Compter les comparaisons de caractères donne une mesure qui ne dépend ni de l'ordinateur ni du langage. La méthode naïve place le motif à chaque position possible du texte et compare de gauche à droite jusqu'à la première différence. Horspool saute des alignements entiers quand le caractère lu dans le texte prouve qu'aucune occurrence n'est possible juste après.
Les exercices
Exercice 1 Lire une table de décalage
Le motif est CARTE, de longueur . On construit la table de décalage de Horspool.
Quelle est la valeur du décalage pour la lettre R ?
Indice 1
Retire le dernier caractère du motif avant de construire la table.
Indice 2
Repère l'indice de R dans CART, puis applique .
Voir la correction pas à pas
On enlève la dernière lettre du motif : il reste
CART.Dans
CART, les indices sont C : 0, A : 1, R : 2, T : 3. La lettreRest donc à l'indice .On applique la formule : .
Contrôle :
Rest à deux lettres de la fin du motifCARTE(R, T, E), donc on décale de 2 pour amener ceRsous la lettre du texte qui vient d'être lue.
Le décalage de R est 2. Pour mémoire, T donne 1, A donne 3, C donne 4, et toute autre lettre donne 5.
Exercice 2 Le meilleur cas de Horspool
On cherche le motif ABC dans le texte XXXXXXXXXXXX (12 caractères X). On utilise l'algorithme de Horspool, et on compte une comparaison chaque fois que l'on compare un caractère du motif et un caractère du texte.
Combien de comparaisons fait-on au total ?
Indice 1
Que vaut le décalage d'une lettre qui n'appartient pas au motif ?
Indice 2
Les alignements testés sont 0, puis 0 plus le décalage, etc. Compte ceux qui tiennent dans le texte.
Voir la correction pas à pas
On a . La lettre
Xn'est pas dansAB, donc .À l'alignement 0, on compare la dernière lettre du motif,
C, avecX: échec, une comparaison. On décale de 3.Les alignements testés sont 0, 3, 6 et 9. L'alignement 12 ne convient pas car .
Chaque alignement coûte une seule comparaison, donc le total est .
Pour comparer, la méthode naïve teste les alignements avec une comparaison chacun, soit 10 comparaisons.
Horspool fait 4 comparaisons là où la méthode naïve en fait 10. Plus le motif est long et plus le texte est pauvre en lettres du motif, plus le gain augmente.
Exercice 3 Simuler Horspool sur BANANA
On cherche le motif ANA dans le texte BANANA avec l'algorithme de Horspool. Les indices commencent à 0.
- Construis la table de décalage du motif.
- Déroule la recherche alignement par alignement.
- Combien de comparaisons de caractères a-t-on faites au total ?
Indice 1
Pour la table, ne garde que AN : A est à l'indice 0 et N à l'indice 1.
Indice 2
Quand une occurrence est trouvée, on décale aussi, avec la lettre du texte située sous la fin du motif.
Voir la correction pas à pas
Table : . Dans
AN, et . Toute autre lettre donne 3.Alignement 0 : le motif est sous
BAN. On compare le dernierAdu motif àNdu texte : échec, 1 comparaison. La lettre lue estN, on décale de 1.Alignement 1 : le motif est sous
ANA. On compare de droite à gauche :A=A,N=N,A=A. Trois comparaisons, occurrence trouvée à l'indice 1. La lettre lue sous la fin du motif estA, on décale de 2.Alignement 3 : le motif est sous
ANA. Trois nouvelles comparaisons réussies, occurrence à l'indice 3. Le décalage suivant sortirait du texte, on s'arrête.Total : comparaisons, avec deux occurrences aux indices 1 et 3.
On obtient 7 comparaisons et deux occurrences. Comme les deux occurrences se chevauchent, il faut bien décaler de 2 et non de 3 après la première.
Exercice 4 Comparer avec la méthode naïve
On cherche encore ANA dans BANANA, mais avec la méthode naïve : on teste chaque alignement de 0 à , en comparant de gauche à droite et en s'arrêtant à la première différence.
Combien de comparaisons fait-on au total ? Compare avec le résultat de l'exercice précédent.
Indice 1
Il y a alignements.
Indice 2
Une comparaison qui échoue compte aussi.
Voir la correction pas à pas
Alignement 0 :
BcontreA, échec. 1 comparaison.Alignement 1 :
A=A,N=N,A=A. 3 comparaisons, occurrence.Alignement 2 :
NcontreA, échec. 1 comparaison.Alignement 3 :
A=A,N=N,A=A. 3 comparaisons, occurrence.Total : comparaisons, contre 7 pour Horspool.
La méthode naïve fait 8 comparaisons, Horspool 7. Sur un texte aussi court et un motif aussi répétitif, le gain est minime ; il devient visible quand le texte est long et que beaucoup de lettres sont absentes du motif.
Exercice 5 Écrire la fonction de table en Python
On représente la table de décalage par un dictionnaire dont les clés sont les lettres du motif (sauf la dernière position) et dont les valeurs sont les décalages. Une lettre absente du dictionnaire a pour décalage .
- Écris une fonction
table_decalage(motif)qui renvoie ce dictionnaire. - Donne le résultat de
table_decalage("BANANE"). - Explique pourquoi la boucle s'arrête avant le dernier caractère.
Indice 1
Parcours les indices de 0 à len(motif) - 2 inclus.
Indice 2
Si une lettre revient plus loin, la nouvelle valeur doit écraser l'ancienne : cela revient à garder la dernière occurrence.
Voir la correction pas à pas
On écrit la fonction :
def table_decalage(motif): m = len(motif) table = {} for k in range(m - 1): table[motif[k]] = m - 1 - k return tableLa boucle
range(m - 1)va de 0 à : le dernier caractère est exclu.Comme on parcourt de gauche à droite, une lettre qui réapparaît voit sa valeur remplacée par une valeur plus petite, ce qui correspond à sa dernière occurrence.
Pour
BANANE, :B(indice 0) donne 5,A(indice 1) donne 4 puisA(indice 3) donne 2,N(indice 2) donne 3 puisN(indice 4) donne 1. Le dictionnaire final est{'B': 5, 'A': 2, 'N': 1}.Le dernier caractère est exclu car son décalage serait : le motif ne bougerait plus et la recherche bouclerait indéfiniment. Les lettres absentes, y compris
Equand elle n'apparaît qu'en dernière position, ont le décalage 6, que l'on obtient avectable.get(c, m).
Le résultat est {'B': 5, 'A': 2, 'N': 1}. Le piège classique est d'oublier d'exclure la dernière lettre.
Exercice 6 Table complète du motif ABRACADABRA
Le motif est ABRACADABRA, de longueur . Construis la table de décalage de Horspool pour les cinq lettres A, B, C, D, R.
Donne la somme de ces cinq décalages.
Indice 1
Écris le motif privé de sa dernière lettre : ABRACADABR, avec ses indices de 0 à 9.
Indice 2
Pour chaque lettre, ne retiens que son indice le plus grand.
Voir la correction pas à pas
Le motif privé de sa dernière lettre est
ABRACADABR, avec A : 0, B : 1, R : 2, A : 3, C : 4, A : 5, D : 6, A : 7, B : 8, R : 9.Dernières occurrences : A à l'indice 7, B à l'indice 8, C à l'indice 4, D à l'indice 6, R à l'indice 9.
Décalages avec : , , , , .
Somme : .
La somme vaut 16. Remarque que A, dernière lettre du motif, a tout de même un décalage de 3 : il vient de son apparition plus tôt dans le motif, pas de la dernière position.
Exercice 7 Pire cas de la méthode naïve
Le texte est formé de 1000 caractères A. Le motif est formé de 9 caractères A suivis d'un B (longueur 10). On utilise la méthode naïve, avec des comparaisons de gauche à droite.
Combien de comparaisons au total ? Pourquoi ce cas est-il défavorable ?
Indice 1
Combien d'alignements y a-t-il ?
Indice 2
À chaque alignement, à quel rang l'échec a-t-il lieu ?
Voir la correction pas à pas
Le nombre d'alignements est .
À chaque alignement, les 9 premières lettres
Adu motif correspondent au texte. L'échec n'a lieu qu'à la dixième comparaison, entreBetA.Chaque alignement coûte donc 10 comparaisons.
Total : comparaisons.
Ce cas est défavorable parce que l'on ne détecte l'échec qu'à la dernière lettre : toutes les comparaisons précédentes ont été « gaspillées ».
On fait 9910 comparaisons. Avec Horspool, on comparerait d'abord la dernière lettre B du motif à un A du texte : l'échec est immédiat. Comme le dernier A avant la fin du motif donne un décalage de 1, on teste quand même les 991 alignements, mais chacun ne coûte qu'une comparaison : 991 comparaisons en tout, dix fois moins. Le gain vient ici de l'ordre de comparaison, pas de la taille des sauts.
Exercice 8 Nombre minimal d'alignements
On cherche un motif de longueur dans un texte de longueur avec l'algorithme de Horspool. On suppose que, à chaque alignement testé, la lettre du texte lue sous la fin du motif est absente du motif, donc le décalage vaut toujours 8, et qu'il n'y a aucune occurrence.
Combien d'alignements sont testés ? Quel est alors le nombre de comparaisons ?
Indice 1
Les alignements testés valent tant que .
Indice 2
Chaque alignement coûte une seule comparaison dans ce scénario.
Voir la correction pas à pas
Un alignement est possible si , soit .
Les alignements testés forment la suite jusqu'à , donc .
Il y a donc alignements, en comptant l'alignement 0.
Chaque alignement fait une unique comparaison (celle de la dernière lettre du motif, qui échoue), donc 1250 comparaisons au total.
En comparaison, un parcours naïf testerait alignements.
On teste 1250 alignements, soit 1250 comparaisons, environ . C'est le meilleur cas de Horspool, et il explique pourquoi un motif long peut rendre la recherche plus rapide.
Les questions qu'on se pose
Pourquoi compare-t-on le motif de droite à gauche ?
Parce que la lettre du texte située sous la fin du motif sert à choisir le décalage. En commençant par la dernière lettre, un échec dès la première comparaison permet souvent de sauter plusieurs positions d'un coup, sans lire le reste du motif.
Dois-je connaître l'algorithme complet de Boyer-Moore pour le bac ?
Le document officiel précise que l'algorithme complet utilise une seconde table de décalage, beaucoup plus difficile à calculer, et que sa justification et sa programmation dépassent le cadre visé.1 On travaille donc la version simplifiée de Horspool, celle des exercices ci-dessus.
Comment vérifier ma simulation à la main ?
Programme la fonction de recherche en comptant les comparaisons, puis compare avec ton tableau d'alignements. Vérifie aussi que chaque occurrence trouvée est bien le motif lu dans le texte à la position annoncée, et que ta table ne contient pas le dernier caractère du motif.
Sources
- Document Éduscol - Recherche textuelle et algorithme de Boyer-Moore, Éduscol (Ministère de l'Éducation nationale). Consulté le 7 novembre 2026.
- Algorithmique du texte, Wikipédia. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.