🔍 Recherche Textuelle
Le problème : Trouver toutes les occurrences d'un motif (mot) dans un texte (chaîne de caractères).
C'est ce que fait Ctrl+F ou grep.
1. Recherche Naïve
On fait glisser le motif le long du texte, caractère par caractère.
Principe
- On aligne le motif avec le début du texte.
- On compare les lettres une par une.
- Si ça ne correspond pas, on décale le motif de 1 cran vers la droite.
Complexité
Si le texte a une longueur et le motif une longueur . Dans le pire des cas (ex: Texte "AAAAAAAA", Motif "AAAB"), on fait comparaisons à chaque position. Complexité : O(N × M). C'est lent si le texte est très long (ex: génome humain).
2. Algorithme de Boyer-Moore (Simplifié)
L'idée de génie : Commencer la comparaison par la fin du motif. Cela permet de faire des sauts plus grands que 1 !
Le décalage (Règle du mauvais caractère)
Si on compare la dernière lettre du motif avec le texte et que ça ne correspond pas (lettre X dans le texte) :
- Si X n'est pas du tout dans le motif : On peut sauter directement toute la longueur du motif ! (Inutile de tester les positions intermédiaires).
- Si X est dans le motif : On décale le motif pour aligner le X du texte avec le X du motif.
Exemple
Texte : L'ALGORITHME
Motif : RITHME
- On compare la fin du motif (
E) avec le texte (L).- Ça ne matche pas.
Lest-il dansRITHME? Non.- -> On peut décaler de 6 crans d'un coup !
Complexité
Dans le meilleur des cas (souvent le cas pratique), la complexité est sub-linéaire : O(N/M). Plus le motif est long, plus ça va vite !
Table des sauts
Pour Boyer-Moore, on pré-calcule un dictionnaire donnant la dernière position de chaque lettre dans le motif.
Motif : "BANANA"
Longueur : 6
Remplissez la table :
"A": dernière position ?"N": dernière position ?"B": dernière position ?- Autres lettres : -1