1. Le problème
On dispose d’un texte T et d’un motif M.
On cherche à savoir si M apparaît dans T, et éventuellement à quelle position.
LE CODE EST EFFICACE, chercher le motif FACE.
2. Méthode naïve
La méthode naïve aligne le motif sous le texte, compare de gauche à droite, puis décale d’une position en cas d’échec.
Elle est simple, mais refait souvent des comparaisons inutiles.
3. Idée de Boyer-Moore
Boyer-Moore compare de droite à gauche (on commence par la dernière lettre du motif).
Quand il y a un échec, on ne décale pas forcément d’une seule position : on peut souvent faire un grand saut.
4. Prétraitement : la règle du « mauvais caractère »
On construit une table indiquant, pour chaque caractère du motif, la dernière position où il apparaît dans le motif. Si un caractère n’apparaît pas, on prend -1.
Exemple : motif BANANE
B A N A N E
0 1 2 3 4 5
Dernières occurrences :
B → 0
A → 3
N → 4
E → 5
Autres lettres → -1
5. Comment se calcule le décalage ?
Lors d’un échec sur le caractère du texte placé sous l’index j du motif :
j - derniere_occurrence(caractère_en_échec)puis on décale d’au moins 1 :
max(1, décalage).
Interprétation :
- Si le caractère existe dans le motif, on l’aligne avec sa dernière occurrence.
- S’il n’existe pas, on peut « sauter » tout le motif.
6. Simulation
Texte : ACCTGCATTAGATTACA
Motif : GATTA
- Aligner le motif sous le texte.
- Comparer de droite à gauche.
- Au premier échec, utiliser la table des dernières occurrences pour calculer le décalage.
- Recommencer jusqu’à trouver une occurrence ou dépasser la fin du texte.
Le déroulé
Texte : ACCTGCATTAGATTACA
Motif : GATTA
Table des dernières occurrences (motif = GATTA)
Motif : G A T T A
Index : 0 1 2 3 4
derniere_occurrence(G) = 0
derniere_occurrence(A) = 4
derniere_occurrence(T) = 3
autre lettre → -1
Règle du « mauvais caractère » :
decalage = j - derniere_occurrence(T[i+j])
puis i ← i + max(1, decalage).
(Comparaison de droite à gauche.)
Indices (pour se repérer)
T : A C C T G C A T T A G A T T A C A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Déroulé (comparaison de droite à gauche)
Étape 1 : Alignement i = 0
T : A C C T G C A T T A G A T T A C A
M : G A T T A
0 1 2 3 4
-
j = 4:
M[4]vsT[4]
AvsG→ ÉCHEC
carac_fautif = T[i+j] = T[4] = Gderniere_occurrence(G) = 0decalage =
j - derniere_occurrence(carac_fautif) = 4 - 0 = 4Donc
i ← i + max(1, decalage) = 0 + 4 = 4
Étape 2 : Alignement i = 4
T : A C C T G C A T T A G A T T A C A
M : G A T T A
0 1 2 3 4
j = 4 :M[4] vs T[4+4]M[4] vs T[8]A vs T → ÉCHEC
carac_fautif = T[i+j] = T[8] = Tderniere_occurrence(T) = 3decalage =
j - derniere_occurrence(carac_fautif) = 4 - 3 = 1Donc
i ← i + max(1, decalage) = 4 + 1 = 5
Étape 3 : Alignement i = 5
T : A C C T G C A T T A G A T T A C A
M : G A T T A
0 1 2 3 4
-
j = 4:
M[4] = AvsT[9] = A→ SUCCÈS -
j = 3:
M[3] = TvsT[8] = T→ SUCCÈS j = 2:
M[2] = TvsT[7] = T→ SUCCÈSj = 1:
M[1] = AvsT[6] = A→ SUCCÈSj = 0:
M[0] = GvsT[5] = C→ ÉCHEC
carac_fautif = T[i+j] = T[5] = Cderniere_occurrence(C) = -1decalage =
j - derniere_occurrence(carac_fautif) = 0 - (-1) = 1Donc
i ← i + max(1, decalage) = 5 + 1 = 6
Étape 4 : Alignement i = 6
T : A C C T G C A T T A G A T T A C A
M : G A T T A
0 1 2 3 4
j = 4:
M[4] = AvsT[10] = G→ ÉCHEC
carac_fautif = T[i+j] = T[10] = Gderniere_occurrence(G) = 0decalage =
j - derniere_occurrence(carac_fautif) = 4 - 0 = 4Donc
i ← i + max(1, decalage) = 6 + 4 = 10
Étape 5 : Alignement i = 10
T : A C C T G C A T T A G A T T A C A
M : G A T T A
0 1 2 3 4
j = 4:
M[4] = AvsT[14] = A→ SUCCÈSj = 3:
M[3] = TvsT[13] = T→ SUCCÈSj = 2:
M[2] = TvsT[12] = T→ SUCCÈSj = 1:
M[1] = AvsT[11] = A→ SUCCÈSj = 0:
M[0] = GvsT[10] = G→ SUCCÈS
j = -1, donc une occurrence du motif commence en i = 10.
Bilan
GATTA dans ACCTGCATTAGATTACA :
10.
7. Mise en œuvre python (dans le notebook)
La programmation est faite dans le notebook associé :
- construction de la table des dernières occurrences ;
- implémentation pas à pas de Boyer-Moore (mauvais caractère) ;
- tests sur plusieurs textes et motifs ;
8. À retenir
- Boyer-Moore compare de droite à gauche.
- Le prétraitement du motif permet de calculer des décalages efficaces.
- La règle du « mauvais caractère » utilise la dernière occurrence d’un caractère dans le motif.