Un automate qui cherche un motif
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 29 — Langages réguliers et automates finis
É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.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.