Vous êtes sur la page 1sur 9

Chap.

5 Recherche textuelle

Ce qu’il faut savoir


Vidéo Boyer-Moore-Horspool Vidéo Boyer-Moore première table Vidéo Boyer-Moore deuxième table

1. De quoi parle-t-on ?

1.1 Définition
Un très grand nombre de logiciels ou de navigateurs internet (traitement de texte, pyscrypter, google,
firefox, etc) possèdent une fonction de recherche textuelle, permettant de trouver un mot ou une partie d'un mot
(chaire ou sous-chaine) appelé motif.

Definition 1. L’algorithme permettant de retrouver une sous-chaîne, appelée « motif » dans une chaîne
de caractère est un algorithme de recherche textuelle

1.2 Des exemples


Exemple, soit le texte suivant :
"Les sanglots longs des violons de l'automne blessent mon cœur d'une langueur monotone. Tout
suffocant et blême, quand sonne l'heure, je me souviens des jours anciens et je pleure."

Question : le motif "vio" est-il présent dans le texte ci-dessus, si oui, en quelle(s) position(s) ? (la
numérotation d'une chaine de caractères commence à zéro et les espaces sont considérés comme des
caractères)
Réponse : on trouve le motif "vio" en position 23

Les algorithmes de recherche textuelle sont


aussi utilisés en bio-informatique pour analyser
l’ADN.

L'information génétique présente dans nos cellules


est portée par les molécules d'ADN. Les molécules
d'ADN sont, entre autres, composées de bases
azotées ayant pour noms : Adénine (représenté par
un A), Thymine (représenté par un T), Guanine
(représenté par un G) et Cytosine (représenté par un
C).

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 1
L'information génétique est donc très souvent représentée par de très longues chaînes de caractères, composées
des caractères A, T, G et C.
Exemple : ATAACAGGAGTAAATAACGGCTGGAGTAAAGGCTGCTGCGGCTGCTAGGTCGG….

Il est souvent nécessaire de détecter la présence de certains enchaînements de bases azotées.


Par exemple, on peut se poser la question suivante : trouve-t-on le motif CGGCTG dans le brin d'ADN suivant
et si oui, en quelle position ?

2. Algorithme de recherche naïve


Un premier algorithme dit naïf permet de comparer la première lettre de la chaîne recherchée en
parcourant le texte de gauche à droite

Principe :
On place le motif recherché au début de notre chaîne, puis on compare le motif avec la chaîne lettre par
lettre.
Si la lettre du motif coïncide avec celle de la chaîne, on regarde la lettre suivante. Si on arrive à
la dernière lettre on a détecté un motif.

Si la lettre du motif ne coïncide pas avec celle de la chaîne, on décale le motif d’une position et on
recommence…

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 2
Pseudo-code
Fonction recherche_naive(texte,motif)
Position= liste vide
m = longueur du motif.
n= longueur du texte
i=0
Tant que i<=n - m
Si motif = texte[de l’indice i… jusqu’à.l’indice.i+m-1]
Ajoute i dans Position
i = i+1
Fin du Tant que
Retourne Position

Observe son fonctionnement avec le logiciel du site de ton prof.

Exercice 1. Implémente ce code en Python et teste-le sur la chaîne d’ADN donnée en exemple.
Remarque : il y a deux façons en python d’implémenter le pseudo-code « Si motif=texte[de i…
jusqu’à..i+m-1] » :
On peut utiliser l’extraction de sous-chaine python L[a:b] qui retourne la sous-chaine de L de
l’indice a à l’indice b-1
On peut implémenter une fonction def occurrence (motif , texte , i) qui renvoie true s’il y a une
occurrence du motif à l’indice i dans texte et false dans le cas contraire en utilisant une boucle for. Dans ce
cas cette partie du pseudo code devient :

Tant que i<=n - m


Si occurrence(motif , texte , i) est Vrai alors
Ajoute i dans Position
i = i+1
Fin du Tant que

Essaie d’implémenter l’algorithme naïf avec les deux méthodes

Cet algorithme naïf peut, selon les situations demander un très grand nombre de comparaisons, ce qui
peut entraîner un très long temps de "calcul" avec des chaînes très très longues.

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 3
3. L'algorithme de Boyer-Moore Horspool

3.1 Différences et avantages par rapport à l’algorithme naïf

L'algorithme de Boyer-Moore a été développé par les américains Robert Stephen Boyer et J Strother
Moore en 1977, il permet de faire beaucoup mieux en termes de comparaisons à effectuer.

Cependant cet algorithme est un peu compliqué… Dans ce cours on va étudier une version simplifiée :
L'algorithme de Boyer-Moore-Horspool. Il a été publié par Nigel Horspool en 1980.

Dans la méthode naïve, les décalages du motif vers la droite se faisaient toujours d'un "cran" à la fois.
L'intérêt de l'algorithme de Boyer_Moore-Horspool, c'est qu'il permet, dans certaines situations, d'effectuer un
décalage de plusieurs lettre en une seule fois.

3.2 Principe
Observe son fonctionnement ici.

L’algorithme de Boyer_Moore-Horspool effectue la vérification, c’est-à-dire qu’il tente d’établir la


correspondance entre le motif et le texte à une certaine position. Il commence la comparaison motif-chaine par
la droite du motif. Par exemple pour le motif CGGCTG, on compare d'abord le G, puis le T, puis C...on
parcourt le motif de la droite vers la gauche.

Voici les décalages pour différentes situations :

cas n°1 : Ici la lettre G ne correspond pas à la lettre A, mais une étude du motif démontre qu’il n’y a pas
de lettre A dans le reste du motif. On peut donc faire un décalage de 6 positions.

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 4
cas n°2 : Ici la lettre G ne correspond pas à la lettre C, mais une étude du motif démontre qu’il y a une
lettre C dans le reste du motif à 2 cases de distance. On peut donc faire un décalage de 2 positions.

cas n°3 : Ici la lettre G correspond à la lettre G du texte, on étudie donc la deuxième lettre du motif, mais
on garde en mémoire le fait que le prochain G du motif se trouve à 3 cases de distance.

Ici la lettre T ne correspond pas à la lettre A, mais attention le calcul du décalage se fait sur la première
lettre. Pour aligner les deux G on fait donc un saut de 3 cases.

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 5
Dans l’algorithme de Boyer-Moore-Horspool, la calcul du décalage se fait toujours sur la dernière lettre du
motif.

On remarque que dans cet algorithme qu’en cas de non coïncidence on doit calculer à chaque fois la
prochaine occurrence de la lettre dans le motif… Ce calcul augmente considérablement le coût et le gain
obtenu par rapport à l’algorithme naïf pourrait être perdu dans ces recherches supplémentaires…
QUE FAIRE ?

La solution consiste à faire un prétraitement du motif pour éviter de recalculer le décalage à chaque
situation.

3.3 Prétraitement du motif.

L'algorithme effectue un prétraitement du motif. Cela signifie que l'algorithme "connaît" les caractères
qui se trouvent dans le motif ce qui fait gagner beaucoup de temps dans les recherches.

Plus le motif est grand et plus l'algorithme de Boyer_Moore-Horspool sera efficace.

L’idée est de calculer toutes les possibilités de sauts et de mémoriser ces données dans un tableau appelé
« table des sauts », ou « table des décalages » ou même « table de Horspool ».

Dans cette table on calcule dans un premier temps la position de la dernière occurrence à droite de chaque
lettre dans le motif, sauf pour la dernière lettre !
On peut faire cela très facilement avec un dictionnaire.

pos={}
for i in range(len(motif) -1) :
pos[motif[i]]=i

Exercice 2. Teste ce code sur le motif « CGGCTG » et affiche le dictionnaire pos. Celui-ci donne t-il bien la
dernière occurrence de chaque lettre ?

Dans un deuxième temps, à l’aide du dictionnaire pos, on créé la table de Horspool qui donne le décalage
à faire pour chaque lettre rencontrée dans le texte. Dans notre exemple, on obtient :

Les 3 différentes lettres du motif sont C, G, T. Si on rencontre une autre lettre dans le texte (A, B, D, E…
représenté ici par des pointillés.) le décalage sera donc maximum (ici 6 cases).

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 6
Si tu reprends les exemples précédents la table de Horspool permet d’obtenir directement le saut.
Cas n°1 : Avec un A décalage de 6 cases
Cas n°2 Avec un C décalage de 2 cases
Cas n°3 Avec un G décalage de 2 cases

Exercice 3. Pourquoi selon toi on ne prend pas en compte le dernier caractère G pour le calcul du décalage ?

Nous allons implémenter une fonction def calcul_decalage(motif) qui retourne un dictionnaire donnant
le décalage pour toute lettre :

decalage = calcul_decalage(« CGGCTG ») est un dictionnaire qui donne le décalage pour toute lettre
majuscule de l’alphabet, y compris celles qui ne sont pas dans le motif.

Avec l’exemple précédent, decalage[A] retourne 6 ; decalage[K] retourne 6 ; decalage[M] aussi 6 …


et pour les lettres du motif decalage[C] retourne 2 ; decalage[G] retourne 3 ; decalage[T] retourne 1

Rappels : le code ASCII des lettres majuscules va de 65 (A) jusqu’à 90 (B). ord(« A ») retourne 65 et
chr(65) retourne « A »

Exercice 4. En te servant du code de l’exercice 2 et du code ASCII, implémente en python la fonction


def calcul_decalage(motif)

3.4 Implémentation de l’algorithme de Boyer-Moore-Horspool

Exercice 5. La fonction recherche_Boyer_Moore_Horspool(texte, motif) fait une comparaison lettre par


lettre comme pour l’algorithme naïf sauf qu on parcourt le motif de droite à gauche en partant de la dernière
lettre. En cas de non coïncidence on fait appel à la table décalage pour calculer le saut.
Implémente en python la fonction recherche_Boyer_Moore_Horspool(texte, motif)

Aide : Dans un premier temps tu créeras la table de décalage de Horspool avec


decalage = calcul_decalage(motif)
Puis tu reprends le code de l’algorithme naïf et tu dois juste changer une ligne de ce code !

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 7
4. Le vrai algorithme de Boyer-moore

Boyer Moore Horspool est très efficace car il évite des tests de comparaison grâce au prétraitement du
motif.
Dans le vrai algorithme de Boyer Moore, la première table des décalages est la même table que celle de
Horspool mais utilisée différemment. Le calcul du décalage ne se fait plus uniquement sur le dernier caractère
mais sur le caractère où il n’y a pas coïncidence.

Observe son fonctionnement ici et regarde la vidéo qui explique son fonctionnement.

Exercice 6. (facultatif). Implémente la fonction recherche_Boyer_Moore(texte, motif)

Dans l’algorithme de Boyer Moore il y a une deuxième table des sauts calculée suivant les règles du
« bon suffixe ». Cette deuxième table n’est pas explicitement au programme.
Regarde la vidéo qui explique son fonctionnement.

5. Peut-on faire mieux ?


Oui, dans de nombreux cas, lorsque un grand nombre de recherche se fait dans le même texte, il est
préférable d’utiliser un autre algorithme. Celui-ci prétraite le texte original.
C’est l’algorithme de recherche textuelle avec l’arbre des suffixes. Observe son fonctionnement et
regarde la vidéo qui l’explique son fonctionnement. Cet algorithme n’est pas au programme de NSI.

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 8
6. Annexes

6.1 Bibliographie :
Les sources d’inspiration pour faire ce support de cours sont trop nombreuses pour être toutes énumérées. Voici
les principales :
Livres : apprendre à programmer en Python Swinnen ; Ellipses…
Échanges avec des profs
Sites : Cours de Canopé Poitiers (professeurs de la formation au DIU) ; Cours https://pixees.fr/
… et d’autres…

6.2 Programme officiel

Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 9

Vous aimerez peut-être aussi