edit et corrections d'erreurs factuelles, de calculs et de mise en page
This commit is contained in:
@@ -245,19 +245,22 @@ def traitement(motif):
|
||||
def morris_pratt(texte, motif):
|
||||
m = len(motif)
|
||||
n = len(texte)
|
||||
i = 0
|
||||
j = 0
|
||||
sol = [] # Tableau pour stocker les solutions
|
||||
s = traitement(motif) # Pré-traitement du motif
|
||||
while i < m and j < n:
|
||||
if i >= 0 and motif[i] != texte[j]:
|
||||
i = s[i]
|
||||
else:
|
||||
sol = [] # Tableau pour stocker les positions trouvées
|
||||
i = 0 # indice dans le motif
|
||||
j = 0 # indice dans le texte
|
||||
while j < n:
|
||||
if motif[i] == texte[j]:
|
||||
i += 1
|
||||
j += 1
|
||||
if i >= m: # Si le motif est présent
|
||||
sol.append(j - m) # La position dans le texte est ajoutée à la liste
|
||||
i = 0 # Une nouvelle recherche commence après le motif trouvé
|
||||
if i == m: # Le motif est présent
|
||||
sol.append(j - m) # La position dans le texte est ajoutée à la liste
|
||||
i = s[i - 1] + 1 # On poursuit la recherche (occurrences suivantes)
|
||||
else:
|
||||
if i == 0:
|
||||
j += 1 # Échec dès le premier caractère : on avance dans le texte
|
||||
else:
|
||||
i = s[i - 1] + 1 # On reprend la comparaison au bon endroit du motif
|
||||
return sol
|
||||
```
|
||||
|
||||
@@ -265,9 +268,7 @@ Ici, par rapport à recherche2, on modifie les instructions dans le cas où ***m
|
||||
|
||||
Dans le programme naïf, les indices i et j sont modifiés par ***j = j - i + 1*** pour décaler le motif d'une unité et ***i = 0*** pour recommencer les comparaisons à partir du premier caractère du motif.
|
||||
|
||||
Dans ce nouveau programme, j n'est pas modifié. On reste donc sur le caractère posant problème, on ne revient pas en arrière.
|
||||
|
||||
Pour la valeur de i, qui permet d'effectuer le bon décalage, on effectue une fois le traitement s = traitement (motif), s est alors un tableau, et s[i] est la nouvelle valeur de i.
|
||||
Dans ce nouveau programme, j ne revient jamais en arrière : en cas d'échec à la position i du motif, ce sont les i premiers caractères du motif qui ont coïncidé. Le tableau s nous dit alors où reprendre : ***s[i - 1] + 1*** est la nouvelle valeur de i (la longueur du plus long bord du préfixe déjà reconnu). Si l'échec a lieu dès le premier caractère (i = 0), on avance simplement dans le texte.
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user