Mines Option Informatique MP 2013Sujet, corrigé et rapport du jury
Recherche de motif dans un texte
- Théorie des langages et automates
- Algorithmique (programmes itératifs et récursifs)
- Complexité algorithmique
- Programmation en Caml ou Pascal
Téléchargements
Présentation du sujet
Recherche d'un motif dans un texte : de l'algorithme naïf à un algorithme efficaceAfficher ou masquer la section
Présentation du sujet
Le problème étudie plusieurs algorithmes de recherche d'un motif dans un texte, représentés comme des chaînes de caractères codées sous forme de tableaux. Il part d'un algorithme naïf de recherche puis construit progressivement, à travers plusieurs parties, des méthodes plus efficaces s'appuyant sur des automates, jusqu'à un algorithme final de complexité linéaire en la taille du texte.
- 1Première partie : algorithme simpleÉcriture et étude de complexité d'un algorithme naïf de recherche d'un motif dans un texte.
- 2Deuxième partie : une amélioration de la méthode précédenteIntroduction d'une fenêtre de recherche et d'un tableau de décalage pour accélérer la recherche.
Ce qu'a observé le jury
6 erreurs relevéesTerminaison et rigueur du code non soignées · Complexité linéaire non respectée · Complexité dépendant de la taille de l'alphabet non simplifiéeAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet couvre une large partie du programme d'informatique autour de la recherche de sous-chaîne dans une chaîne de caractères. La présentation et la rédaction sont globalement bonnes, mais le jury relève un manque de rigueur récurrent sur la terminaison des algorithmes et sur le calcul de complexité, ainsi qu'une utilisation abusive des exceptions en programmation.
Les erreurs les plus sanctionnées
- 1Terminaison et rigueur du code non soignéesQ3
Un code rigoureux est attendu dès le début de l'énoncé, avec un contrôle explicite du dépassement de la borne supérieure du tableau.
« Un code rigoureux en début d'énoncé est attendu. »
- 2Complexité linéaire non respectéeQ5
L'énoncé impose une complexité linéaire pour le code demandé, condition non respectée dans un grand nombre de copies.
« Une complexité linéaire est imposée par l'énoncé. »
- 3Complexité dépendant de la taille de l'alphabet non simplifiéeQ11-Q15
Beaucoup de candidats ne considèrent pas qu'une complexité dépendant seulement de la taille de l'alphabet, fixée à 26 par l'énoncé, peut être vue comme constante.
« Beaucoup de candidats ne considèrent pas qu'une complexité qui dépend seulement de la taille de »
- 4Déterminisation d'un automate mal maîtriséeQ21
De nombreuses erreurs apparaissent sur cette question, la déterminisation d'un automate n'étant très souvent pas maîtrisée.
« Très souvent, la déterminisation d'un automate ne semble pas »
- 5Preuve de validité de l'algorithme absenteQ22
La preuve de validité de l'algorithme final est rarement fournie, et sa complexité ne correspond pas toujours à celle imposée par l'énoncé.
« La preuve de validité est rarement faite. »
- 6Utilisation abusive des exceptions
De nombreux candidats utilisent des mécanismes d'exception pour interrompre une boucle, alors que de simples instructions conditionnelles suffisaient.
« on constate toujours une utilisation abusive des exceptions et de la »
Ce qui a été bien réussi
- Globalement, les candidats abordent les trois premières parties du problème.
- La présentation ainsi que la rédaction sont bonnes dans l'ensemble.
Conseils du jury
- Toujours vérifier et justifier explicitement la terminaison et les conditions de bord d'un algorithme.
- Respecter scrupuleusement la complexité imposée par l'énoncé pour chaque question.
- Simplifier les complexités qui ne dépendent que d'une constante donnée par l'énoncé, comme la taille de l'alphabet.
- Indenter soigneusement les programmes et référencer explicitement les questions déjà traitées lors de leur réutilisation.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ECOLE DES PONTS PARISTECH, SUPAERO (ISAE), ENSTA PARISTECH, TELECOM PARISTECH, MINES PARISTECH, MINES DE SAINT-ETIENNE, MINES DE NANCY, TELECOM BRETAGNE, ENSAE PARISTECH (FILIERE MP) ECOLE POLYTECHNIQUE (FILIERE TSI)
EPREUVE d'INFORMATIQUE
Filière : MP
Durée de l'épreuve : 3 heures. L'utilisation d'une calculatrice est autorisée.
- Si, au cours de l'épreuve, un candidat repère ce qui lui semble être une erreur d'énoncé, il le signale sur sa copie et poursuit sa composition en expliquant les raisons des initiatives qu'il est amené à prendre.
- Tout résultat fourni dans l'énoncé peut être utilisé pour les questions ultérieures même s’il n’a pas été démontré.
- Il ne faut pas hésiter à formuler les commentaires qui semblent pertinents même lorsque l'énoncé ne le demande pas explicitement.
Composition de l'épreuve
Dans l'énoncé du problème, un même identificateur écrit dans deux polices de caractères différentes désigne la même entité, mais du point de vue mathématique pour la police écrite en italique (par exemple :
(
P ) déterminer la position de chaque occurrence de
m dans
t .
Par exemple, quand
Indications pour la programmation
Caml
Si u est de type string et si
Fin des indications pour Caml
Pascal
On utilise les définitions suivantes:
const MAX_LONGUEUR = 100;
const MAX_SIGMA = 26;
type tab_char = array[0 .. MAX_LONGUEUR - 1] of char;
type tab_int_sigma = array[0 .. MAX_SIGMA - 1] of integer;
type pile = RECORD
nb : integer;
table : array[0 .. MAX_LONGUEUR - 1] of integer;
end;
La constante MAX_SIGMA donne le nombre maximum de lettres de l'alphabet.
Les mots sont toujours codés en utilisant des tableaux de type tab_char ; les lettres du mot sont écrites consécutivement dans ce tableau à partir de l'indice
Fin des indications pour Pascal
Première partie : algorithme simple
Caml : Écrire en Caml une fonction nommée est_present telle que, si :
- m et t , de type string, codent
m ett , - s code l'entier s, alors est_present m t s renvoie le booléen true si
m figure danst à la positions et le booléen false dans le cas contraire.
Pascal : Écrire en Pascal une fonction nommée est_present telle que, si : - m et t , de type tab_char, contiennent
m ett , - lm, de type integer, contient la longueur de
m , -
s , de type integer, contient la valeur des , alors est_present (m, lm, t, s) renvoie le booléen true si m figure dans t à la position s et le booléen false dans le cas contraire.
2 - Préciser la complexité de la fonction est_present dans le pire cas et le meilleur cas.
3 - Il s'agit d'écrire une fonction nommée positions qui résout le problème (P ) en utilisant la fonction est_present.
Caml : Écrire en Caml la fonction positions telle que sim ett , de type string, codentm ett , alors positions m t renvoie une liste contenant les positions dem danst .
- m et t , de type tab_char, contiennent
m ett , -
lm etlt , de type integer, contiennent les longueurs dem ett , alors positions(m, lm,t, lt) renvoie un résultat de type pile contenant, dans le champ (ou membre) nb, le nombre de positions dem danst et, dans le champ table, la liste des positions dem danst .
Deuxième partie : une amélioration de la méthode précédente
On suppose que l'on a défini en langage de programmation une fonction numero telle que :
- en Caml, si
x , de type char, code une lettrex deΣ , numerox renvoie le numéro de la lettrex dansΣ ; - en Pascal, si
x , de type char, code une lettrex deΣ , numero (x ) renvoie une valeur de type integer donnant le numéro de la lettrex dansΣ .
On ne demande pas d'écrire en langage de programmation la fonction numero. On suppose que cette fonction a une complexité constante.
- dans la case d'indice 0 , la valeur 3,
- dans la case d'indice 1 , la valeur 1 ,
- dans la case d'indice 2 , la valeur -1 .
◻5 - Il s'agit de construire le tableauD en un temps linéaire en la longueurl(m) du motifm . On justifiera la complexité linéaire de la construction du tableauD .
Caml : Écrire en Caml une fonction nommée calcul_D telle que, si : -
m , de type string, code le motifm , - nbSigma contient le nombre de lettres de l'alphabet
Σ , alors calcul_D m nbSigma renvoie un vecteur (ou tableau) codant le tableauD .
Pascal : Écrire en Pascal une fonction nommée calcul_D telle que, si : - m, de type tab_char, contient
m , - lm, de type integer, contient la longueur de
m , - nbSigma, de type integer, contient le nombre de lettres de l'alphabet
Σ ,
On considère l'exemple défini par :
| Indices | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
On considère alors la lettre de
| Indices | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Maintenant, clé est la lettre de
| Indices | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 - Dans l'exemple de la figure 3, indiquer la prochaine position de la fenêtre de recherche et dire si cette position correspond ou non à une occurrence de
7 - Décrire la suite du déroulement de l'algorithme appliqué à Exemple1 jusqu'à ce qu'on puisse conclure que toutes les occurrences de
8 - On revient au déroulement de l'algorithme amélioré dans le cas général. On suppose que la fenêtre est à la position
9 - Il s'agit d'écrire une fonction positions2 qui résout le problème
Caml : Écrire en Caml la fonction positions2 telle que si :
- m et t , de type string, codent
m ett , - nbSigma contient le nombre de lettres de l'alphabet
Σ ,
alors positions2 mt nbSigma renvoie une liste contenant les positions dem danst déterminées selon l'algorithme amélioré.
Pascal : Écrire en Pascal la fonction positions2 telle que si : - m et t , de type tab_char, contiennent
m ett , -
lm etlt , de type integer, contiennent les longueurs dem ett , - nbSigma, de type integer, contient le nombre de lettres de l'alphabet
Σ , alors positions2(m, lm,t , lt, nbSigma) renvoie un résultat de type pile contenant, dans le champ nb, le nombre de positions dem danst et, dans le champ table, la liste des positions dem danst déterminées selon l'algorithme amélioré.
Un automate
-
Σ est un alphabet ; -
Q est un ensemble fini et non vide appelé ensemble des états deA ; -
I ⊆ Q est appelé ensemble des états initiaux deA ; -
F ⊆ Q est appelé ensemble des états finals deA ; -
T ⊆ Q × Σ × Q est appelé l'ensemble des transitions; étant donnée une transition(p, x, q) ∈ T , on dit qu'elle va de l'étatp à l'étatq et qu'elle est d'étiquettex ; on pourra la noterp ^x → q ; on dit aussi quep est l'origine de la transition etq son extrémité.
Un calcul de
L'automate
Si
- si
p ∈ Q, δ^∗(p, ε) = p , - si
p ∈ Q, u ∈ Σ^∗ etx ∈ Σ, δ^∗(p, ux) = ∅δ^∗(p, u), x) .
L'état 0 est l'état initial.
Aex possède un seul état final, l'état 2 .
Aex possède trois transitions, les transitions

Troisième partie : implémentation d'un automate
Indications pour Caml
let MAX_Q = 100 ;;
MAX_Q donne le nombre maximum d'états des automates considérés.
Si
Si
L'ensemble des transitions d'un automate
Pour définir un automate
type automate = {nbQ : int;
F : int list;
T : (char * int) list vect;
};;
- pour nbQ, au nombre d'états de
A , - pour F , à la liste des états finals de
A , - pour T, à l'ensemble des transitions de
A .
let T_Aex = make_vect 3 [];;
T_Aex. (0) <- [(
a,1)];T_Aex.(1) <- [(
a,1); (b,2)];;let Aex = {nbQ = 3 ; F = [2]; T = T_Aex};;
Fin des indications pour Caml
Indications pour Pascal
On ajoute les définitions suivantes aux définitions données plus haut :
const MAX_Q = 100;
type transition = RECORD
etiquette : char;
extremite : integer;
end;
type tab_int_Q = array[0 .. MAX_Q - 1] of integer;
type tab_transition = array[0 .. MAX_SIGMA - 1] of transition;
type tab_tab_transition = array[0 .. MAX_Q - 1] of tab_transition;
type automate = RECORD
nbQ : integer;
nbF : integer;
F : tab_int_Q;
nbT : tab_int_Q;
T : tab_tab_transition;
end;
Si
L'ensemble des transitions d'un automate est codé par un tableau de type tab_tab_transition, la case d'indice
Un automate déterministe
- pour nbQ, au nombre d'états de
A ; - pour nbF, au nombre d'états finals de
A ; - pour F , à un tableau contenant la liste des états finals de
A ; - pour nbT, à un tableau donnant les nombres de transitions issues de chaque état ; plus précisément, si p est compris entre 0 et nbQ -
1, nbT[p] contient le nombre de transitions d'originep ; - pour T, à l'ensemble des transitions de
A .
Aex.nbQ := 3;
Aex.nbF := 1;
Aex.F[0]:= 2;
Aex.nbT[0] := 1;
Aex.T[0][0].etiquette := 'a';
Aex.T[0][0].extremite := 1;
Aex.nbT[1] := 2;
Aex.T[1][0].etiquette := 'a';
Aex.T[1][0].extremite := 1;
Aex.T[1][1].etiquette := 'b';
Aex.T[1][1].extremite := 2;
Aex.nbT[2] := 0;
Fin des indications pour Pascal
11 - Il s'agit de savoir si un état est final ou non. On rappelle qu'un état est identifié avec son numéro.
Caml : Écrire en Caml une fonction nommée est_final telle que si :
- A, de type automate, code l'automate
A , - p est un entier codant un état de
A , alors est_final A p renvoie le booléen true sip est un état final deA et false sinon. Indiquer la complexité de cette fonction.
Pascal : Écrire en Pascal une fonction nommée est_final telle que si : - A, de type automate, code l'automate
A , - p , de type integer, contient un état de
A , alors est_final(A, p) renvoie un booléen qui vaut true sip est un état final deA et false dans le cas contraire. Indiquer la complexité de cette fonction.
◻12 - On suppose quep est un état etx une lettre ; on veut connaître l'étatq atteint à partir de l'étatp par la transition d'étiquettex si cette transition existe.
On rappelle que le cardinal de l'alphabet est majoré par une constante (égale à 26).
Caml : Écrire en Caml une fonction nommée etat_suivant telle que si : - A, de type automate, code l'automate
A , - p est un entier codant un état de
A , - x est une lettre appartenant à
Σ ,
alors etat_suivant Ap × renvoie un entier codant l'étatq tel que (p, x, q ) soit une transition deA si cette transition existe et -1 sinon. Indiquer la complexité de cette fonction.
Pascal : Écrire en Pascal une fonction nommée etat_suivant telle que si : - A, de type automate, code l'automate
A , - p , de type integer, contient le numéro d'un état de
A , - x, de type char, contient une lettre appartenant à
Σ , alors etat_suivant(A, p, x) renvoie une valeur de type integer contenant l'étatq tel que (p, x, q ) soit une transition deA si cette transition existe et -1 sinon. Indiquer la complexité de cette fonction.
Caml : Écrire en Caml une fonction nommée execution telle que si :
- A, de type automate, code l'automate
A , - u, de type string, code un mot
u surΣ , alors execution A u renvoie un entier codant l'étatq qui est l'extrémité du calcul dont l'origine est l'état initial et dont l'étiquette estu , siq existe, et -1 sinon. Indiquer la complexité de cette fonction.
Pascal : Écrire en Pascal une fonction nommée execution telle que si : - A, de type automate, code l'automate
A , - u, de type tab_char, contient un mot
u surΣ , - lu, de type integer, contient la longueur de
u , alors execution(A, u, lu ) renvoie une valeur de type integer donnant l'étatq qui est extrémité du calcul dont l'origine est l'état initial et dont l'étiquette estu , siq existe, et -1 sinon. Indiquer la complexité de cette fonction.
Caml : Écrire en Caml une fonction nommée reconnait telle que si :
- A, de type automate, code l'automate
A , - u, de type string, code le mot
u surΣ , alors reconnait A u renvoie le booléen true si le motu est reconnu parA et false sinon. Indiquer la complexité de cette fonction.
Pascal : Écrire en Pascal une fonction nommée reconnait telle que si : - A, de type automate, code l'automate
A , - u, de type tab_char, contient le mot
u surΣ , - lu, de type integer, contient la longueur de
u , alors reconnait (A, u, lu) renvoie le booléen true si le motu est reconnu parA et false sinon. Indiquer la complexité de cette fonction.
◻15 - On considère un automate A déterministe complet sur un alphabetΣ , un étatp deA et une lettrex deΣ . L'objectif de la question est de concevoir une fonction permettant de modifier l'extrémité de la transition d'originep et d'étiquettex .
Caml : On considère une liste, nommée trans, de type (char * int) list, codant l'ensemble des transitions d'originep . Écrire en Caml une fonction remplace telle que, si : -
x code la lettrex , - q code un état de
A ,
alors remplacex transq renvoie une liste identique à trans sauf que le couple contenant l'étiquettex est remplacé par le couple (x, q ). Indiquer la complexité de cette fonction.
Pascal : On considère un tableau, nommé trans, de type tab_transition, codant l'ensemble des transitions d'originep . Écrire en Pascal une fonction remplace telle que, si : - x , de type char, contient la lettre
x , - q, de type integer, contient un état de
A , alors remplace(x , trans,q ) renvoie un tableau de type tab_transition identique à trans sauf que le couple contenant l'étiquettex est remplacé par le couple (x, q ). Indiquer la complexité de cette fonction.
Quatrième partie : utilisation d'automates.
Caml : Écrire en Caml une fonction nommée automate_de_mot telle que, si m, de type string, code le mot
Pascal : Écrire en Pascal une fonction nommée automate_de_mot telle que, si :
- m, de type tab_char, contient le mot
m , - lm, de type integer, contient la longueur de
m , alors automate_de_mot(m, lm ) renvoie un résultat de type automate codant l'automateA_m .
Caml : Écrire en Caml une fonction nommée est_prefixe telle que, si
On utilisera les fonctions automate_de_mot et execution.
- m et u , de type tab_char, contiennent les mots
m etu , -
lm etlu , de type integer, contiennent les longueurs dem etu , alors est_prefixe(m, lm, u, lu) renvoie le booléen true quandu est préfixe dem et false dans le cas contraire.
On utilisera les fonctions automate_de_mot et execution.
◻19 - On s'intéresse à présent au langage composé des mots dontm est suffixe. On le noteLS_m . Montrer que ce langage est rationnel.
Caml : On suppose que l'on dispose d'une fonction DS telle que, si
Pascal : On suppose que l'on dispose d'une fonction DS telle que, si :
- m, de type tab_char, contient le mot
m , -
lm , de type integer, contient la longueur dem , alorsDS(m, lm) renvoie un résultat de type automate codant l'automateDS_m . En utilisant cette fonction, écrire en Pascal une fonction nommée positions3 telle que, si : - m et t , de type tab_char, contiennent
m ett , -
lm etlt , de type integer, contiennent les longueurs dem ett , alors positions3(m, lm, t , lt) résout le problème (P ), c'est-à-dire renvoie un résultat de type pile contenant, dans le champ nb, le nombre de positions dem danst et, dans le champ table, la liste des positions du motifm dans le textet .
Cinquième partie : automate des suffixes
On note
Soit
24 - Préciser
On revient au cas général :
25 - Soit
26 - Préciser
27 - Montrer que
On définit un automate déterministe et complet sur l'alphabet
- les états de
S_m sont les préfixes dem , - l'état initial de
S_m estε , - l'état final de
S_m estm , - pour tout préfixe
u dem et toute lettrex , (u, x, h_m(ux) ) est une transition deS_m etS_m n'admet pas d'autres transitions que les transitions de cette forme.
Convention : on numérote les états deS_m ; l'état initialε est noté 0 et pouri compris entre 1 etl(m) , le préfixem_0 m_1…m_(i − 1) est notéi .
28 - On suppose que l'on aΣ = {a, b} . Dessiner l'automateS_E .
Indication : cet automate n'a qu'un seul état, noté 0.
29 - On suppose que l'on aΣ = {a, b} et on considère le motab . Dessiner l'automateS_(ab) en représentant les états par leurs numéros.
Indication : cet automate a trois états, les étatsε, a, ab , numérotés 0,1 et 2 .
30 - On considère l'automateS_m et un motu surΣ ; on noteδ la fonction de transition deS_m . Montrer l'égalitéδ^∗(ε, u) = h_m(u) .
31 - Montrer queS_m reconnaît le même langage queDS_m , c'est-à-direLS_m .
Soit
(i) Si
(ii) Si
(iii) Si
32 - Donner des règles simples de construction pour passer de
33 - On considère le cas
34 - Il s'agit de programmer la fonction DS pour l'alphabet
Caml : Écrire en Caml une fonction nommée DS telle que, si
Pascal : Écrire en Pascal une fonction nommée DS telle que, si :
- m, de type tab_char, contient le mot
m surΣ , -
lm , de type integer, contient la longueur dem , alors DS(m, lm) renvoie un résultat, de type automate, codant l'automateS_m .
35 - On revient à un alphabetΣ quelconque. Donner la complexité de la fonction positions3.
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique option info MP Mines-Ponts 2013 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique option info MP Mines-Ponts 2013 ?
Le sujet porte sur la recherche d'un motif dans un texte : théorie des langages et automates, algorithmique itérative et récursive, et analyse de complexité, en Caml ou en Pascal.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet d'informatique MP Mines-Ponts 2013 ?
Le jury relève un manque de rigueur sur la terminaison des algorithmes, des complexités ne respectant pas celle imposée par l'énoncé, une déterminisation d'automate mal maîtrisée et une utilisation abusive des exceptions en programmation.
Quelles parties du sujet informatique MP Mines-Ponts 2013 sont le plus souvent traitées ?
Le rapport indique que les candidats abordent globalement les trois premières parties du problème, la présentation et la rédaction étant bonnes dans l'ensemble.
Faut-il bien maîtriser les automates pour ce sujet d'informatique MP Mines-Ponts 2013 ?
Oui, le sujet mobilise la théorie des langages et des automates, et le rapport signale que la déterminisation d'un automate (question 21) n'est très souvent pas maîtrisée.
Pas de description pour le moment
