edit et corrections d'erreurs factuelles, de calculs et de mise en page

This commit is contained in:
2026-07-02 15:01:24 +02:00
parent 3067e1918e
commit 28d4a75c1b
32 changed files with 174 additions and 109 deletions

View File

@@ -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.