L'algorithme Boyer-Moore, introduit en 1977 par Robert S. Boyer et J Strother Moore, est conçu pour rendre la recherche de sous-chaînes dans un texte plus rapide.
Il utilise deux heuristiques principales : la mauvaise correspondance, qui permet de sauter plusieurs caractères lorsqu'un caractère ne correspond pas, et le bon suffixe, qui ajuste la recherche en fonction des parties déjà appariées.
Cet algorithme est particulièrement efficace sur les grands textes et a influencé de nombreuses méthodes de recherche optimisée.
Le fait de faire "une recherche textuelle" signifie chercher une séquence ordonnée de caractères dans une chaîne de caractères plus grande.
Programmer la fonction recherche_textu_basique(sequence, texte, affiche_indices=False) qui prend en paramètres deux chaînes de caractères :
sequence : la sous-chaîne que l’on cherche ;texte : la longue chaîne dans laquelle on cherche.affiche_indices est un booléen.La fonction doit retourner True si sequence est présente dans texte et False sinon.
Exemple : recherche_textu_basique("coucou", "Bonjour, coucou!") doit retourner True.
Si la séquence n’est pas trouvée la fonction retourne False.
Si le paramètre affiche_indices est égal à True, la fonction affichera une liste de deux nombres de type int correspondant à l'indice du début et à l'indice de fin où a été trouvé la séquence dans le texte en cas de succès.
Tests :
Affichage :
Console:
L'algorithme de Boyer Moore permet d'optimiser cette recherche.
Il fonctionne à l'aide d'un pré-traitement de la séquence à chercher.
Programmer la fonction constru_dico(sequence) qui prend en paramètre un string sequence.
Cette fonction retournera le dictionnaire des décalages (heuristique du « mauvais caractère » version Horspool) pour l’algorithme de Boyer–Moore : pour chaque caractère apparaissant dans sequence sauf la dernière position, on associe la distance entre cette position (la plus à droite possible) et la dernière case (indice len(sequence)-1).
Exemple : constru_dico("coucou") doit renvoyer {'c': 2, 'o': 1, 'u': 3}.
Tests :
Affichage :
Console:
Compléter la fonction recherche_BOYER_MOORE(sequence,texte) qui prend en paramètres deux strings.
Cette fonction retournera un booléen selon l'appartenance ou non de sequence à texte.
Par exemple, recherche_BOYER_MOORE("coucou","Bonjour, coucou!") retournera True.
Tests :
Affichage :
Console:
Ce fichier contient l'ensemble du roman "Le Horla" de "Guy de Maupassant".
Le code suivant permet d'ouvrir ce genre de fichier et de mettre le contenu du roman dans la variable contenu.
import os
os.chdir("u:\\") # à modifier
with open("le_horla_guy_de_maupassant.txt", "r", encoding="utf-8") as f:
contenu = f.read()
Dans un IDE python, tester les fonctions vues précédemment sur ce roman.