Niveau : Terminale générale, enseignement de spécialité NSI
Tout logiciel de traitement de texte possède une fonction de recherche textuelle, permettant de trouver un mot ou une partie d'un mot (chaine ou sous-chaine) appelé motif. Il en est de même pour les navigateurs internet. Appuyer sur ctrl f puis rechercher dans la page la chaine "mot"
Un premier algorithme dit naïf permet de comparer la première lettre de la chaine recherchée en parcourant le texte de gauche à droite
Principe :
L'une des citations de Laurent de Lavoisier est la suivante : "rien ne se perd, rien ne se crée, tout se transforme".
Cherchons la chaine "rien" dans le texte de la citation.
Le motif est trouvé dans le texte, on rajoute son indexe (0 ou 17) à la liste des indexes puis on le décale d'un cran vers la droite
La recherche se termine lorsqu'on atteint le rang : longueur du texte - longueur du motif
Fonction recherche_naive(texte,motif)
m ← longueur du motif
n ← longueur du texte - m + 1
positions ← []
pour i variant de 0 à n faire
si motif=texte[i...i+m] alors
ajouter i à la liste positions
retourne positions
Code python
Algorithme de Boyer Moore Horspool :
L’algorithme de Boyer-Moore-Horspool ou Horspool est un algorithme de recherche de sous-chaîne publié en 1980 par Nigel Horspool, un professeur à l’université de Victoria au Canada. Il consiste en une simplification de l’algorithme de Boyer-Moore qui ne garde que la première table de saut.
Principe :
L’algorithme de Boyer-Moore effectue la vérification, c’est-à-dire qu’il tente d’établir la correspondance entre le motif et le texte à une certaine position, à l’envers.
exemples de décalages lorsque la lettre existe dans le motif :
Exemple 1 | Exemple 2 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
La structure choisie peut être un dictionnaire dont la clé représente la lettre : saut={"r":3,"i":2,"e":1} toute autre lettre impose un saut de la longueur du motif, ici 4 cases.
Voici les opérations que l'on peut effectuer sur un dictionnaire :
saut['n']=7 # on associe à le clé 'n' la valeur 7.
print(saut)
{'e': 1, 'i': 2, 'n': 7, 'r': 3}
saut['e']=4 print(saut)
{'e': 4, 'i': 2, 'n': 7, 'r': 3}
saut.pop('n') print(saut)
{'e': 4, 'i': 2, 'r': 3}
print(saut['e'])
4
print(saut.keys())
dict_keys(['r', 'e', 'i'])
print('n' in saut)
False
Cas où le motif contient des lettres identiques
On recherche "rien ne se" : e, espace et n apparraissent plusieurs fois. Il faut donc éviter les sauts trop grand.
Le tableau cidessous donne les valeurs des sauts pour chaque lettre :
Saut | 9 | 8 | 4 | 3 | 2 | 1 | ||||
---|---|---|---|---|---|---|---|---|---|---|
Motif | r | i | e | n | n | e | s | e |
Contenu du dictionnaire saut :
Algorithme
Fonction dic_saut(motif,avd)
# Parcourt le motif de gauche à droite jusqu'à l'avant dernière lettre
début
saut ← {}
pour i variant de 0 à avd faire
ajouter au dictionnaire saut la clé [motif[i]] et la valeur avd-i
retourne saut
fin
Fonction recherche(texte,motif)
début
lm ← longueur(motif)
saut ← dic_saut(motif,lm-1)
lt ← longueur du texte
positions ← []
i ← lm
tant que i ≤ lt alors
si motif = texte[i-lm...i] alors
ajouter positions i-lm
i ← i+lm
sinon
si la clé texte[i-1] est présente dans saut alors
i ← i + valeur de la clé texte[i-1] de saut
sinon
i ← i + lm
retourne positions
fin
Code python
Nombre de comparaisons de la recherche naïve :
Nombre de comparaisons de la recherche de Boyer-Moore-Horspool :
Pour charger le texte on procède comme suit :
fichier=open("Texte.txt,"r") texte= fichier.read() fichier.close()
Résultats obtenus avec la recherche naïve :
Nombre de comparaisons : 7152 Nombre de "e" : 848 Nombre de comparaisons : 7146 Nombre de "enfants" : 10 Nombre de comparaisons : 7139 Nombre de "intérieurement" : 1
Résultats obtenus avec l'algorithme de Boyer Moore Horspool :
Nombre de tests : 7152 Nombre de "e" : 848 Nombre de tests : 1196 Nombre de "enfants" : 10 Nombre de tests : 702 Nombre de "intérieurement" : 1
Conclure sur l’efficacité de l’algorithme suivant la taille du motif.
Fond : Texte : Tables : Thème du langage:
Contenu
sous licence CC BY-NC-SA 3.0
Pascal Hassenforder 21/11/2020
source : Gisèle Bareux