Algorithme de Boyer Moore.

Rechercher une chaîne dans une autre.

L'algorithme de Boyer Moore permet de trouver "rapidement" si une suite de caractère apparaît dans un texte, cela à plusieurs intérêt par exemple :

On dispose de deux chaines, une le "motif" de longueur len(motif) contient ce qu'on cherche, l'autre le "texte" de longueur len(texte) est l'endroit où on effectue la recherche.

Exemple

Pour illustrer les algorithmes dans les exemples, rentrer le texte.

Entrer le motif à chercher :

Algorithme naïf

Algorithme
Exemple
matrice

Méthode naive : i = 0
j = 0
nombre de comparaisons =
nombre de correspondances = 0


Le nombre de comparaison dans le meilleur des cas est de len(texte)-len(motif) + 1 (soit O(len(texte)-len(motif)) dans le pire des cas il est borné par len(texte) × len(motif).

Exemple

Compléter l'algorithme de l'epreuve pratique :

Modifier le programme pour qu'il compte les occurences.

Algorithme de Boyer-Moore.

Présentation.

Algorithme
Remarque

Il reste à définir cette table de décalage, on donnera plusieures versions mais seule la première semble être au programme.

Version simple

Idée

Imaginons que l'on cherche le motif maman dans le texte, on commence par la fin, on compare le n avec le caractère de la position i si celui-ci est m alors il n'y a pas correspondance mais de combien doit se décaler ?

Envisageons un deuxième cas le caractère i du texte est un n, le caractère i -1 est un a et le caractère i -2 est un z, le z n'est pas dans maman ! On peut alors décaler maman de 3.

-4-3-2-10123
zan
maman

Pour voir le décalage appuyer sur la case du tableau, par exemple si vous appuyer sur m de recul j = 1, vous avez le décalage de i à effectuer.

Implémentation.

Dans cette version de Boyer Moore il n'est pas nécessaire d'avoir un tableau deux dimensions, un simple dictionnaire D suffit.

Pour chaque lettre du motif on cherche de combien il est distant de la fin :

Lettredistance
m2
a1
n0

Maintenant le décalage dépend de j :

Trois cas de figures

  1. Si texte[i - j] est égal à motif[len(motif) - j], c'est que c'est très bien et on augmente j de 1 et si on arrive à la fin du motif on a trouvé une occurrence.
  2. Si texte[i-j] est une lettre du motif mais pas celle qu'il faut alors deux cas :
    1. Soit j est supérieur au nombre indiqué D[texte[i-j]], et on décale i de 1.
    2. Soit j est inférieur au nombre indiqué, on décale i de D[texte[i-j]] - j.
  3. Si texte[i-j] n'est pas une lettre du motif on décale i de len(motif) - j.
Exemple
matrice

Méthode Boyer : i = 0
j = 0
nombre de comparaisons =
nombre de correspondances = 0



Exercice
  1. Trouver la table des caractères précédents de erreur.
  2. Lettredistance
    e
    r
    u
  3. Compléter la table de décalage de erreur.
  4. recul543210
    e
    r
    u
    autre
  5. Trouver la table des caractères précédents de barbapapa.
  6. Lettredistance
    b
    a
    r
    p
  7. Compléter la table de décalage de barbapapa.
  8. recul876543210
    b
    a
    r
    p
    autre
  9. Faire une fonction en Python qui va retourner le dictionnaire des derniers caractères d'un mot donné.
  10. Faire une fonction en Python qui a un motif donné va donner le dacalage en suivant l'algorithme de Boyer Moore simple.
  11. Implémenter l'algorithme de Boyer Moore simple.

Version plus

Dans la version précédente on cherche la dernière apparition d'un caractère et si on l'a passé alors on avance de 1.

Regardons la cas si dessous :

-7-6-5-4-3-2-1012
aar
zanzibar

Dans la version précédente l'erreur (le a à la place du b) va entrainer un déplacement de 1 (car on a déjà dépasser le dernier a).

-7-6-5-4-3-2-1012
aar
zanzibar

Mais on sait déjà que le résultat ne va pas marcher car le a se trouve en face du i, on peut le déplacer de jusqu'au a précédant.

-7-6-5-4-3-2-101234
aar
zanzibar

Implémentation

L'implémentation est plus difficile, il faut pour chaque valeur de j un dictionnaire où on donne la distance à la lettre précédente.

Exemple
matrice

Méthode Boyer évoluée : i = 0
j = 0
nombre de comparaisons =
nombre de correspondances =0

Exercice
  1. Compléter la table de décalage de erreur avec la version plus de Boyer Moore.
  2. recul543210
    e
    r
    u
    autre
  3. Compléter la table de décalage de barbapapa.
  4. recul876543210
    b
    a
    r
    p
    autre
  5. Faire une fonction en Python qui a un motif donné va donner le décalage en suivant l'algorithme de Boyer Moore plus.
  6. Implémenter l'algorithme de Boyer Moore plus.

Version finale

Idée

Dans les versions précédentes on ne considère que la case i - j du texte et on effectue un décalage du motif pour que la correspondance à cette case marche, mais regardons le cas suivant :

-7-6-5-4-3-2-1012
br
zanzibar

Dans les versions précédentes le décalage donne :

-7-6-5-4-3-2-1012
br
zanzibar

Et on refait le test de savoir si il y a correspondance à partir de la case 1, peut être que le texte correspond (on a un r) par contre quand j = 1 on va comparer r avec a et on n'obtiendra pas de correspondance ! Et en réalité on pouvait en être sur à l'avance.

Voilà ce que donne la matrice de decalage :

Implémentation

Il faut pour toutes les valeurs de j (de 0 à len(motif) -1) construire un dictionnaire avec pour clef les lettres (ou autre) et indiquer le minimum de de combien il faut décaler pour avoir une correspondance. Essayons pour j = 3 avec la lettre m, si on est arrivé jusque là ca veut dire qu'il y a correspondance du mot avec le motif pour j = 0,1,2,3.

-4-3-2-1012345
mman
maman

Avec les versions de Boyer Moore précédente la décalage est de 1, mais la correspondance ne peut pas se faire.

Décalage de un.

-4-3-2-1012345
mman
maman

Pareil pour deux :

-4-3-2-1012345
mman
maman

Pareil pour trois :

-4-3-2-1012345
mman
maman

Pareil pour quatre :

-4-3-2-1012345
mman
maman

Il faut donc décaler de cinq :

-4-3-2-1012345
mman
maman

Regardons le motif tintin,si pour j = 4 on trouve un z avec les versions précédentes on décale de 2 :

-5-4-3-2-10123
zntin
tintin

Mais on sait à l'avance que cela ne va pas aller, il faut décaler de 3 !

-5-4-3-2-10123
zntin
tintin
Exemple

Essayer

matrice

Méthode Boyer évoluée : i = 0
j = 0
nombre de comparaisons =
nombre de correspondances = 0



Exercice
  1. Compléter la table de décalage de erreur avec la version finale de Boyer Moore.
  2. recul543210
    e
    r
    u
    autre
  3. Compléter la table de décalage de barbapapa.
  4. recul876543210
    b
    a
    r
    p
    autre
  5. Faire une fonction en Python qui a un motif donné va donner le décalage en suivant l'algorithme de Boyer Moore finale.
  6. Implémenter l'algorithme de Boyer Moore finale.