LGT Saint-Exupéry, Mantes-la-Jolie
Activité Terminale NSI – L’algorithme de Boyer-Moore 1/3
Objectifs pédagogiques :
✓ Connaître le principe de la rechercher textuelle
✓ Connaître l’algorithme de Boyer-Moore
Gordon Earle Moore est un docteur en chimie et en physique, un chef d'entreprise américain. En 1968, il fonde avec Robert Noyce et Andrew Grove la société Intel, premier fabricant mondial de microprocesseurs. Il est connu pour avoir publié une loi empirique portant son nom, la loi de Moore en 1965. Il n’a rien à voir avec J Strother Moore, le co-inventeur de l’algorithme de Boyer-Moore.
Activité 1 – Principe de la recherche textuelle
1. Regarder la capsule vidéo sur l’algorithme de Boyer-Moore sur le site nsi4noobs.fr 2. Résumer le principe de l’algorithme de recherche textuelle naïve
3. Écrire une fonction de recherche naïve d’une chaine de caractère dans un texte. Cette fonction recherche_naive(cle, texte) devra renvoyer le nombre d’occurrences de cle trouvées dans texte.
Activité 2 – Algorithme de Boyer-Moore
1. Dans quelle(s) condition(s) de rechercher textuelle peut-on décaler la recherche de plus d’un caractère ? 2. En déduire pourquoi la recherche d’un mot dans un texte est un cas particulier permettant d’accélérer
notablement le traitement.
3. Décrire le fonctionnement de l’algorithme de Boyer-Moore 4. Expliquer l’avantage du prétraitement dans cet algorithme
5. Écrire la fonction décrite dans la vidéo permettant de retourner la table des sauts pour une clé donnée. Cette fonction table_saut(cle) retournera un dictionnaire dont les clés seront les lettres de la clé, et les valeurs le saut associé.
6. Indiquer le résultat obtenu avec votre fonction pour la clé « EXCELLENT »
7. A partir de l’algorithme précédent, sous votre IDE préféré, ajouter l’ensemble des commentaires expliquant les différentes étapes de l’algorithme :
Algorithmique
Algorithme de Boyer-Moore
LGT Saint-Exupéry, Mantes-la-Jolie
Activité Terminale NSI – L’algorithme de Boyer-Moore 2/3
def boyer_moore (texte, cle):
long_txt = len(texte) long_cle = len(cle) positions = []
if long_cle <= long_txt :
decalage = table_sauts(cle) i=0
trouve = False
while (i <= long_txt-long_cle):
for j in range (long_cle -1, -1, -1):
trouve = True
if texte[i+j] != cle[j] :
if (texte[i+j] in decalage and decalage[texte[i+j]]<=j):
i+=decalage[texte[i+j]]
else : i+=j+1 trouve = False break
if trouve :
positions.append(i) i=i+1
trouve = False return positions
8. Ajouter dans votre fonction recherche_naive un compteur permettant de déterminer le nombre de comparaisons et d’étapes effectuées.
9. Effectuer de même avec la fonction boyer_moore.
10. A partir du texte présent dans l’encadré ci-dessous, indiquer le nombre d’étapes en recherche naïve, puis en recherche Boyer-Moore pour la clé « recherche ».
L’algorithme de Boyer-Moore fut inventé en 1977. Il peut être encore amélioré avec plusieurs tables de saut, chacune correspondant au saut possible en fonction du caractère testé dans la clé. Cet ajout de table présente un intérêt pour les recherches avec une clé de taille importante.
LGT Saint-Exupéry, Mantes-la-Jolie
Activité Terminale NSI – L’algorithme de Boyer-Moore 3/3
Activité 3 – Pour aller plus loin…
On va comparer les deux algorithmes sur un texte plus long en faisant varier la clé.
1. Ajouter sur vos deux algorithmes précédents une fonction renvoie le temps de recherche de toutes les occurrences d’une clé dans un texte donné.
2. Récupérer le fichier texte fourni dans l’ENT TexteATester.txt. Écrire une fonction qui récupère le fichier texte, qui l’ouvre, le lit et stocke son contenu dans une chaine de caractères
3. Tester les fonctions de recherche écrites à la question 1 sur ce texte avec quelques mots comme « avec », « esprit »,
« est », « le », puis avec la lettre « e ». Que remarquez-vous ?