informatique (MP2I/MPI) · Chapitre 29 · Exercice de TD
Un automate qui cherche un motif
Langages réguliers et automates finis · niveau 2
Énoncé
Construire l'automate déterministe qui reconnaît les mots contenant le facteur aba, sans passer par une expression régulière. Comment le modifier pour compter les occurrences, recouvrements compris ?
Corrigé
L'idée, et c'est la seule. L'état retenu est la longueur du plus long préfixe du motif qui soit un suffixe de ce qu'on a lu. Cette quantité est bornée par la longueur du motif, donc les états sont , et l'on pose
Le calcul donne, avec absorbant :
| ce que signifie | |||
|---|---|---|---|
| rien de commencé | |||
on a lu a | |||
on a lu ab | |||
| motif trouvé (absorbant) |
Noter et non : après aa, le plus long préfixe de aba qui soit un suffixe est a, de longueur . C'est là que le recouvrement se joue.
Pour compter, on rend l'état non absorbant en lui appliquant la même règle : après aba, le plus long préfixe de aba qui soit un suffixe de abaa est a, et de abab est ab. Donc et . On incrémente un compteur chaque fois qu'on entre en .
Mesures. La table absorbante a été comparée au prédicat « contient aba » sur les mots de longueur au plus : accord complet. La variante comptante trouve occurrences dans abababa, dans ababab, dans aabab, dans aaa — chaque fois le compte exact avec recouvrements.
Le coût. La recherche est en , une lecture par caractère, sans jamais revenir en arrière — ce qu'aucun des deux algorithmes du chapitre chap:textes ne garantit : la version simplifiée de Boyer-Moore reste en au pire, et Rabin-Karp n'est linéaire qu'en moyenne. Le prix est la table, en place.