Aller au contenu

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

★☆☆Environ 5 min

Le motif est CARTE, de longueur m=5m=5. 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 m−1−km-1-k.

Voir la correction pas à pas
  1. On enlève la dernière lettre du motif : il reste CART.

  2. Dans CART, les indices sont C : 0, A : 1, R : 2, T : 3. La lettre R est donc à l'indice k=2k=2.

  3. On applique la formule : d(R)=m−1−k=5−1−2=2d(\text{R})=m-1-k=5-1-2=2.

  4. Contrôle : R est à deux lettres de la fin du motif CARTE (R, T, E), donc on décale de 2 pour amener ce R sous 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

★☆☆Environ 8 min

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
  1. On a m=3m=3. La lettre X n'est pas dans AB, donc d(X)=3d(\text{X})=3.

  2. À l'alignement 0, on compare la dernière lettre du motif, C, avec X : échec, une comparaison. On décale de 3.

  3. Les alignements testés sont 0, 3, 6 et 9. L'alignement 12 ne convient pas car 12+3>1212+3>12.

  4. Chaque alignement coûte une seule comparaison, donc le total est 4×1=44\times 1=4.

  5. Pour comparer, la méthode naïve teste les 12−3+1=1012-3+1=10 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

★★☆Environ 12 min

On cherche le motif ANA dans le texte BANANA avec l'algorithme de Horspool. Les indices commencent à 0.

  1. Construis la table de décalage du motif.
  2. Déroule la recherche alignement par alignement.
  3. 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
  1. Table : m=3m=3. Dans AN, d(A)=3−1−0=2d(\text{A})=3-1-0=2 et d(N)=3−1−1=1d(\text{N})=3-1-1=1. Toute autre lettre donne 3.

  2. Alignement 0 : le motif est sous BAN. On compare le dernier A du motif à N du texte : échec, 1 comparaison. La lettre lue est N, on décale de 1.

  3. 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 est A, on décale de 2.

  4. 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.

  5. Total : 1+3+3=71+3+3=7 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

★★☆Environ 10 min

On cherche encore ANA dans BANANA, mais avec la méthode naïve : on teste chaque alignement de 0 à n−mn-m, 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 6−3+1=46-3+1=4 alignements.

Indice 2

Une comparaison qui échoue compte aussi.

Voir la correction pas à pas
  1. Alignement 0 : B contre A, échec. 1 comparaison.

  2. Alignement 1 : A=A, N=N, A=A. 3 comparaisons, occurrence.

  3. Alignement 2 : N contre A, échec. 1 comparaison.

  4. Alignement 3 : A=A, N=N, A=A. 3 comparaisons, occurrence.

  5. Total : 1+3+1+3=81+3+1+3=8 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

★★☆Environ 15 min

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 mm.

  1. Écris une fonction table_decalage(motif) qui renvoie ce dictionnaire.
  2. Donne le résultat de table_decalage("BANANE").
  3. 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
  1. 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 table
    
  2. La boucle range(m - 1) va de 0 à m−2m-2 : le dernier caractère est exclu.

  3. 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.

  4. Pour BANANE, m=6m=6 : B (indice 0) donne 5, A (indice 1) donne 4 puis A (indice 3) donne 2, N (indice 2) donne 3 puis N (indice 4) donne 1. Le dictionnaire final est {'B': 5, 'A': 2, 'N': 1}.

  5. Le dernier caractère est exclu car son décalage serait m−1−(m−1)=0m-1-(m-1)=0 : le motif ne bougerait plus et la recherche bouclerait indéfiniment. Les lettres absentes, y compris E quand elle n'apparaît qu'en dernière position, ont le décalage 6, que l'on obtient avec table.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

★★★Environ 15 min

Le motif est ABRACADABRA, de longueur m=11m=11. 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
  1. 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.

  2. Dernières occurrences : A à l'indice 7, B à l'indice 8, C à l'indice 4, D à l'indice 6, R à l'indice 9.

  3. Décalages avec d=m−1−k=10−kd=m-1-k=10-k : d(A)=3d(\text{A})=3, d(B)=2d(\text{B})=2, d(C)=6d(\text{C})=6, d(D)=4d(\text{D})=4, d(R)=1d(\text{R})=1.

  4. Somme : 3+2+6+4+1=163+2+6+4+1=16.

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

★★★Environ 12 min

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
  1. Le nombre d'alignements est n−m+1=1000−10+1=991n-m+1=1000-10+1=991.

  2. À chaque alignement, les 9 premières lettres A du motif correspondent au texte. L'échec n'a lieu qu'à la dixième comparaison, entre B et A.

  3. Chaque alignement coûte donc 10 comparaisons.

  4. Total : 991×10=9910991\times 10=9910 comparaisons.

  5. 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

★★★Environ 12 min

On cherche un motif de longueur m=8m=8 dans un texte de longueur n=10000n=10000 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 0,8,16,…0, 8, 16, \dots tant que i+8≤10000i+8 \leq 10000.

Indice 2

Chaque alignement coûte une seule comparaison dans ce scénario.

Voir la correction pas à pas
  1. Un alignement ii est possible si i+m≤ni+m\leq n, soit i≤9992i\leq 9992.

  2. Les alignements testés forment la suite 0,8,16,…0, 8, 16, \dots jusqu'à 8q≤99928q\leq 9992, donc q≤1249q\leq 1249.

  3. Il y a donc 1249+1=12501249+1=1250 alignements, en comptant l'alignement 0.

  4. Chaque alignement fait une unique comparaison (celle de la dernière lettre du motif, qui échoue), donc 1250 comparaisons au total.

  5. En comparaison, un parcours naïf testerait 10000−8+1=999310000-8+1=9993 alignements.

On teste 1250 alignements, soit 1250 comparaisons, environ n/mn/m. 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

  1. Document Éduscol - Recherche textuelle et algorithme de Boyer-Moore, Éduscol (Ministère de l'Éducation nationale). Consulté le 7 novembre 2026.
  2. 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.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page