Vers l'algorithme de Boyer - Moore
L'algorithme de Boyer - Moore propose un algorithme performant qui a nécessité des optimisations de l'algorithme naïf.
La première est celle proposée par Nigel Horspool : on compare depuis la fin du motif.
Question
Ré-écrire l'algorithme naïf (recherche de positions) en comparant non pas de gauche à droite, mais de droite à gauche...
def positions_naif(texte, motif):
""" motif - str, chaîne de caractères texte - str, chaîne de caractères Sortie: list - Tableau des positions où trouver motif dans texte """n = len(texte)
p = len(motif)
i = 0
lst_indices = []
while i <= n-p:
k = 0
while k < p and texte[i + k] == motif[k]:
k += 1
if k == p:
lst_indices.append(i)
i += 1
return lst_indices
Indice
On ne part pas de i = 0 mais de i = len(motif) - 1
Indice
Les seules parties à modifier sont repérées par des ...
def positions_naif_droite_gauche(texte, motif):
""" motif - str, chaîne de caractères texte - str, chaîne de caractères Sortie: list - Tableau des positions où trouver motif dans texte """n = len(texte)
p = len(motif)
i = p-1
lst_indices = []
while ... : # On va un peu plus loin dans le texte...
k = 0
while k < p and ... : # Prenez quelques exemples pour trouver une généralisation
k += 1
if k == p:
lst_indices.append(...)
i += 1
return lst_indices
Solution
def positions_naif_droite_gauche(texte, motif):
""" motif - str, chaîne de caractères texte - str, chaîne de caractères Sortie: list - Tableau des positions où trouver motif dans texte """n = len(texte)
p = len(motif)
i = p-1
lst_indices = []
while i <= n-1:
k = 0
while k < p and texte[i-k] == motif[p-1-k]:
k += 1
if k == p:
lst_indices.append(i-p+1)
i += 1
return lst_indices
Intéressons-nous au temps de recherche...
Question
Appliquer ce nouvel algorithme aux 3 recherches du roman « Les Misérables ». Que dire...
Indice
Quelques éléments de code :
import time
with open("Les_Miserables.txt") as f:
roman = f.read().replace('\n', ' ')
t0 = time.time()
motif = "maison"
print(f"recherche naïve de '{motif}'")
print(positions_naif(roman, motif))
print("Le temps (en naïf) mis est de", time.time()-t0)
Solution
Il n'y a pas de différences, voire c'est un peu plus long... On peut donc en conclure que cette première approche fonctionne impérativement avec la 2ème proposition de Horspool : la règle du mauvais caractère.