WikiPrépaLivrets

Mines Option Informatique MP 2022Sujet et rapport du jury

Pas encore noté
  • Programmation dynamique et mémoïsation
  • Analyse de complexité (temps et espace)
  • Structures arborescentes (tries) et dictionnaires
  • Automates et scripts de transformation

Téléchargements

  • Corrigé : pas encore disponible

Présentation du sujet

Difficile
Correction orthographique d'un mot : distance d'édition, tries et automates
Afficher ou masquer la section

Le problème étudie un mécanisme pour corriger un mot brouillé en proposant un mot ciblé, comme dans un correcteur orthographique. La première partie mesure les erreurs de saisie par la distance d'édition de Levenshtein, calculée par programmation dynamique. La deuxième partie stocke un corpus de mots dans une structure arborescente appelée trie et fouille ce corpus à l'aide d'un automate. La troisième partie construit un filtre de fouille inspiré de la théorie des automates.

  1. 11. Une mesure des erreurs de saisieDistance d'édition de Levenshtein entre deux mots, calcul par mémoïsation et étude de complexité.
  2. 22. Fouille dans un trieReprésentation d'un corpus de mots par une structure de trie et fouille à l'aide d'un automate.
  3. 33. Filtre de fouilleConstruction d'un filtre de fouille inspiré de la théorie des automates, à partir des scripts de transformation.

Difficile. Le rapport indique que la troisième partie est très peu abordée convenablement et que de nombreuses questions de la deuxième partie n'ont été traitées correctement que par une faible proportion de candidats.

Ce qu'a observé le jury

4 erreurs relevées
Erreur de typage sur une inégalité · Programmation dynamique non mise en œuvre · Complexité d'insertion dans un dictionnaire méconnue
Afficher ou masquer la section

Le sujet, composé de 27 questions en trois parties, mobilise l'analyse et la programmation de méthodes de correction d'erreurs dans un mot. Peu de candidats savent manipuler la mémoïsation, et beaucoup ont éprouvé de grandes difficultés à s'approprier la structure de trie introduite en deuxième partie.

Les erreurs les plus sanctionnées

  1. 1
    Erreur de typage sur une inégalitéQ1

    Certains candidats commettent l'erreur surprenante de croire qu'une inégalité entre deux valeurs implique qu'elles sont toutes deux des entiers.

    « En particulier,a≤b n’implique pas quea et b sont des entiers. »
  2. 2
    Programmation dynamique non mise en œuvreQ8

    Beaucoup de candidats ne savent pas mettre en œuvre un algorithme de programmation dynamique et restent cantonnés à une approche récursive simple, moins efficace.

    « beaucoup de candidats ne savent pas mettre en œuvre un algorithme de programmation dynamique et restent cantonnés à une approche récursive. »
  3. 3
    Complexité d'insertion dans un dictionnaire méconnueQ12

    Le jury constate une méconnaissance des différentes implémentations possibles d'un dictionnaire et de la complexité de l'opération d'insertion.

    « On constate une méconnaissance des différentes implémentations possibles d’un dictionnaire et »
  4. 4
    Confusion avec la structure usuelle d'automatesQ20

    Peu de candidats ont perçu le caractère très spécifique de la structure d'automate proposée, la confondant avec la structure usuelle.

    « peu de candidats ont perçu le caractère très spécifique ici. »

Ce qui a été bien réussi

  • Les candidats ont abordé de façon équilibrée les questions de programmation et celles portant sur des démonstrations.
  • Les questions bien comprises grâce à un effort de compréhension et de rigueur, notamment sur la structure du trie, donnent souvent lieu à des codes appropriés.

Conseils du jury

  • S'entraîner à reconnaître les situations qui appellent une programmation dynamique avec mémoïsation plutôt qu'une simple récursivité.
  • Prendre le temps de bien comprendre une structure de données non standard avant de coder les fonctions demandées.
  • Utiliser des fonctions auxiliaires avec des noms significatifs et des commentaires pour faciliter la lecture du code.
  • Rédiger les preuves par récurrence ou par équivalence de façon complète, en vérifiant toutes les hypothèses nécessaires.

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

Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.

Lecture du sujet en ligne

L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.
Afficher ou masquer la section

ÉCOLE DES PONTS PARISTECH, ISAE-SUPAERO, ENSTA PARIS, TÉLÉCOM PARIS, MINES PARIS, MINES SAINT-ÉTIENNE, MINES NANCY, IMT ATLANTIQUE, ENSAE PARIS, CHIMIE PARISTECH - PSL.
Concours Mines-Télécom, Concours Centrale-Supélec (Cycle International).

CONCOURS 2022

ÉPREUVE D'INFORMATIQUE MP

Durée de l'épreuve : 3 heures
L'usage de la calculatrice et de tout dispositif électronique est interdit.
Cette épreuve concerne uniquement les candidats de la filière MP.
Les candidats sont priés de mentionner de façon apparente
sur la première page de la copie :
INFORMATIQUE - MP
L'énoncé de cette épreuve comporte 9 pages de texte.
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.
Les sujets sont la propriété du GIP CCMP. Ils sont publiés sous les termes de la licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 France. Tout autre usage est soumis à une autorisation préalable du Concours commun Mines Ponts.

Préliminaires

Présentation du sujet

L'épreuve est composée d'un problème unique, comportant 27 questions. Dans ce problème, nous étudions un mécanisme pour lire un mot qui a été brouillé (par exemple corekte) et proposer un mot ciblé comme correction de ce mot (par exemple correct). Ce type de traitement est couramment utilisé dans le contexte de la vérification orthographique, de la reconnaissance vocale, de la lecture optique ou encore de la conception de moteurs de recherche tolérant aux requêtes mal formulées.
Après cette section de préliminaires, le problème est divisé en trois sections. Dans la première section (page 1), nous étudions comment mesurer des erreurs commises à la saisie d'un mot par une méthode de programmation dynamique. Dans la deuxième section (page 4), nous étudions comment stocker un corpus de mots par une méthode arborescente et comment fouiller ce corpus à l'aide d'un automate déjà construit. Dans la troisième section (page 7), nous étudions comment construire un filtre de fouille par une méthode inspirée de la théorie des automates.
Dans tout l'énoncé, un même identificateur écrit dans deux polices de caractère différentes désignera la même entité, mais du point de vue mathématique pour la police en italique (par exemple n ou n^′ ) et du point de vue informatique pour celle en romain avec espacement fixe (par exemple n ou nprime).

Travail attendu

Pour répondre à une question, il sera permis de réutiliser le résultat d'une question antérieure, même sans avoir réussi à établir ce résultat.
Il faudra coder des fonctions à l'aide du langage de programmation OCaml, en reprenant l'en-tête de fonction fourni par le sujet, sans nécessairement recopier la déclaration des types. Quand l'énoncé demande de coder une fonction, sauf demande explicite de l'énoncé, il n'est pas nécessaire de justifier que celle-ci est correcte ou que des préconditions sont satisfaites.
Le barème tient compte de la clarté des programmes : nous recommandons de choisir des noms de variables intelligibles ou encore de structurer de longs codes par des blocs ou par des fonctions auxiliaires dont on décrit le rôle.

1 Une mesure des erreurs de saisie

1.1 Une fonction mystère

La constante entière max_int désigne le plus grand entier représentable par OCaml. Nous nous donnons la fonction mystere suivante.
let rec mystere z = match z with
(* La fonction mystere calcule ... *)
    | [] -> max_int
    | [a] -> a
    | a::b::y -> mystere ((if a <=b then a else b)::y);;
1 - Donner la signature de la fonction mystere. Justifier brièvement.
2 - Dire si, quelle que soit l'entrée z respectant le typage, le calcul de mystere z se termine et le démontrer. Préciser, le cas échéant, le nombre d'appels à la fonction mystere.
3 - Compléter sommairement le commentaire de la ligne 2. Énoncer une propriété qui caractérise exactement la valeur de retour de la fonction mystere. Démontrer cette propriété.
Dans la question suivante, le terme complexité en espace désigne un ordre de grandeur asymptotique de l'espace utilisé en mémoire lors de l'exécution d'un algorithme pour stocker tant l'entrée que des résultats intermédiaires et la valeur de retour.
4 - Quelle est la complexité en espace de l'appel mystere z? Est-elle optimale?

1.2 Distance d'édition de Levenshtein

Nous fixons un alphabet de 27 symboles Σ = {a, b, …, y, z, $} qui se représentent par le type char. L'ensemble des mots sur l'alphabet Σ se note Σ^∗; la longueur d'un mot w ∈ Σ^∗ se note |w|. Dans toute cette sous-section, nous fixons deux mots : le mot b = b_1…b_m, dit brouillé, de longueur m et le mot c = c_1…c_n, dit ciblé, de longueur n.
Définition : Nous appelons distance entre un mot brouillé b ∈ Σ^∗ et un mot ciblé c ∈ Σ^∗, et nous notons dist (b, c), le nombre minimum de symboles qu'il faut supprimer, insérer ou substituer à un autre symbole pour transformer le mot brouillé b en le mot ciblé c. On remarque que dist(b, c) = dist(c, b).
Par exemple, la distance entre le mot brouillé b = corekte et le mot ciblé c = correct vaut 3 : en effet, on peut insérer un r, substituer un c au k et supprimer le e final pour passer du mot b au mot c; par ailleurs, on peut vérifier que cette transformation est impossible en effectuant deux opérations ou moins.
Nous notons préf _i(b) le préfixe de longueur i du mot b, c'est-à-dire le mot des i premiers symboles de b. Pour i = 0, il s'agit du mot vide ε. Pour tous les indices i compris entre 0 et m et pour j compris entre 0 et n, nous notons d_(i, j) = dist( préf _i(b), préf _j(c)) la distance entre les préfixes préf _i(b) et préf _j(c).
5 - Pour tous les entiers i compris entre 0 et m et j compris entre 0 et n, déterminer les distances d_(i, 0) et d_(0, j).
6 - Pour tous les entiers i compris entre 0 et m − 1 et j compris entre 0 et n − 1, exprimer la distance d_(i + 1, j + 1) en fonction des distances (d_(i^′, j^′))_(0 ⩽ i^′ ⩽ i; 0 ⩽ j^′ ⩽ j).
Indication Ocaml : Un élément de type char se déclare entre deux apostrophes : par exemple, on code 'a' pour définir le symbole a. Les mots de Σ^∗ se représentent par le type char list. Nous déclarons
type mot = char list;;
Nous rappelons la syntaxe des fonctions suivantes :
  • List.length, de type 'a list -> int : la longueur d'une liste ℓ est List.length 1 ;
  • Array.make, de type int -> 'a -> 'a array: un tableau de longueur n dont chaque case est initialisée avec la valeur v s'obtient par Array.make n v. Dans un tableau, les indices sont numérotés à partir de 0 . On accède au coefficient en position i du tableau a par l'expression a.(i), on le modifie par l'instruction a.(i) <- v.
    ◻7 - Écrire une fonction array_of_mot (w:mot) : char array dont la valeur de retour est un tableau formé des symboles du mot w écrits dans le même ordre.
Indication Ocaml : Nous rappelons la syntaxe de la fonction suivante :
  • Array.make_matrix, de type int -> int -> 'a -> 'a array array: une matrice de taille s × t dont toutes les cases sont initialisées avec la valeur v s'obtient par Array.make_matrix s t v. Dans une matrice, les indices sont numérotés à partir de 0 . On accède au coefficient en position (i, j) de la matrice a par l'expression a.(i).(j), on le modifie par l'instruction a.(i).(j) <- v.
    ◻8 - Écrire une fonction distance ( b : mot) ( c : mot) : int qui calcule par mémoïsation la distance dist( b, c ).
Indication Ocaml : Nous rappelons la syntaxe de la fonction suivante :
  • List.filter, de type ('a -> bool) -> 'a list -> 'a list: la sous-liste des éléments x de la liste ℓ tels que le prédicat p(x) vaut true s'obtient par filter p1.
    ◻9 - Soit n_(max) un entier. Exprimer la complexité en temps de la fonction distance b c en fonction des longueurs m et n des mots b et c. En déduire la complexité de l'instruction List.filter (fun c -> (distance b c) <= k) lc;; où ℓ_c est une liste de mots ciblés, chacun de longueur inférieure ou égale à n_(max), et où k est un entier naturel.
10 - Soit k la distance dist(b, c). Montrer qu'il existe un entier r, des mots b_0, b_1, …, b_r appartenant chacun à Σ^∗, des mots c_0, c_1, …, c_r appartenant chacun à Σ^∗ et des symboles x_0, x_1, …, x_(r − 1) appartenant chacun à Σ tels que
b = b_0 x_0 b_1…x_(r − 1)b_r et c = c_0 x_0 c_1…x_(r − 1)c_r
et
k = ∑_(i = 0)^r max(|b_i|, |c_i|)

2 Fouille dans un trie

2.1 Représentation d'un corpus de mots par un trie

Définition : Un trie est un type particulier d'arbre dont chaque arête est orientée de la racine vers les feuilles et est étiquetée par un symbole de Σ. Le trie vide est formé d'un seul sommet et de zéro arête. Lorsqu'une arête est étiquetée par le symbole $, son extrémité finale doit être le trie vide. La taille d'un trie t, notée |t|, est le nombre de ses arêtes.
On dit qu'un mot c = c_1…c_n ∈ (Σ∖{$})^n appartient à un trie s'il existe un chemin, constitué de n + 1 arêtes, issu de la racine et dont les arêtes successives ont pour étiquettes respectives les symboles c_1, c_2, …, c_n et $. Le symbole $ indique la présence d'un mot et joue le rôle de symbole terminateur.
Dans cette partie, les tries sont utilisés afin de représenter un corpus de mots ciblés.
Figure 1 - Exemple de trie de taille 28 contenant 9 mots.
11 - Donner l'ensemble des mots du trie représenté à la figure 1.
Dans ce sujet, le terme dictionnaire désigne en général un type de données abstrait qui contient des associations entre une clé et une valeur.
12 - Nommer deux structures de données concrètes, qui réalisent le type abstrait dictionnaire. Pour chacune d'entre elles, rappeler sans justifier la complexité en temps de l'opération insertion.
Indication Ocaml : Nous définissons un type polymorphe 'a char_map qui réalise une structure de données persistante de dictionnaire associant des clés de type char à des valeurs de type quelconque 'a. Nous disposons de la constante et de la fonction suivante :
  • CharMap.empty, de type 'a char_map, qui désigne le dictionnaire vide.
  • CharMap.add, de type char -> 'a -> 'a char_map -> 'a char_map, telle que la valeur de retour de CharMap.add xtd est un dictionnaire contenant les associations du dictionnaire d ainsi qu'une association supplémentaire entre la clé x et la valeur t. Si la clé x était déjà associée dans le dictionnaire d, l'ancienne association de x disparaît.
    Pour représenter les tries, nous définissons le type
    type trie = Node of trie char_map ;;
    ◻13 - Définir deux constantes trie_vide et trie_motvide, de type trie, qui réalisent respectivement le trie vide et le trie contenant le mot vide ε.
    ◻14 - Écrire une fonction trie_singleton (x:char) : trie qui construit un trie contenant le mot formé d'un seul symbole x ∈ Σ∖{$}.
Indication Ocaml: Nous utilisons un type polymorphe 'a option défini par
type 'a option =
| None
I Some of 'a;;
qui permet de représenter des valeurs de type 'a parfois non définies. Nous complétons le type 'a char_map par la fonction suivante :
  • CharMap.find, de type char -> 'a char_map -> 'a option, telle que l'appel de CharMap.find x d renvoie, en temps constant, Some t si la clé x est associée à la valeur t dans le dictionnaire d et renvoie None s'il n'existe pas d'association de clé x dans le dictionnaire d.
    ◻15 - Écrire une fonction trie_mem (c:mot) (Node tcm:trie) : bool qui teste si le mot c ∈ (Σ∖{$})^∗ appartient au trie t = Node tcm.
16 - Écrire une fonction trie_add (c:mot) (Node tcm:trie) : trie dont la valeur de retour est un trie contenant les mêmes mots que le trie t = Node tcm ainsi que le mot c ∈ (Σ∖{$})^∗.
17 - Nous construisons le trie représenté à la figure 1 en déclarant d'abord la constante trie_vide (question 13), puis en appliquant neuf fois la fonction trie_add (question 16). Compte tenu du caractère persistant du type 'a char_map, combien d'exemplaires de trie_vide coexiste-t-il une fois la construction terminée? Expliquer.
Définition : Un trie est dit élagué si toute feuille est précédée d'une arête d'étiquette $.
Indication Ocaml : Nous complétons le type 'a char_map par les fonctions suivantes : - CharMap.is_empty, de type 'a char_map -> bool, qui teste si un dictionnaire est le dictionnaire vide. CharMap.filter_map, de type (char -> 'a -> 'a option) -> 'a char_map -> 'a char_map, telle que CharMap.filter_map f d renvoie le dictionnaire $d^{\prime}$ restreint aux associations entre la clé $x$ et la valeur $t^{\prime}$ où, d'une part, il existe dans le dic- tionnaire $d$ une association entre la clé $x$ et la valeur $t$ et, d'autre part, $f(t)$ vaut Some tprime. Si le dictionnaire $d$ contient un couple clé et valeur $(x, t)$ mais que $f(t)$ vaut None, alors le dictionnaire $d^{\prime}$ ne contient pas d'association de clé $x$. En voici une illustration : $\begin{array}{|ccc|}d & x_{1} & \mapsto \\ & x_{2} & t_{1} \\ & x_{3} & \mapsto \\ & \vdots & t_{2} \\ & & t_{3} \\ & x_{1} & \mapsto \\ & & \\ x_{3} & \mapsto & t_{1}^{\prime} \\ \vdots & & \\ & & \end{array} \begin{aligned} & f\left(t_{1}\right)=\text { Some t1prime } \\ & f\left(t_{2}\right)=\text { None } \\ & f\left(t_{3}\right)=\text { Some t3prime }\end{aligned}$
18 - Compléter le code suivant afin que la valeur de retour de trie_trim t soit un trie élagué contenant les mêmes mots que le trie t = Node tcm.
let rec trie_trim (Node tcm:trie) : trie =
    let filtre (x:char) (y:trie) : trie option =
    (* a completer *)
    in
    Node(CharMap.filter_map filtre tcm);;

2.2 Filtrage dans un trie

19 - Soient b ∈ (Σ∖{$})^∗ un mot brouillé, t un trie contenant un ensemble de mots ciblés et k un entier naturel. On suppose avoir engendré la liste ℓ_b des mots de (Σ∖{$})^∗ à distance inférieure ou égale à k du mot b. Montrer que la liste ℓ_b compte O(|b|^k) éléments. En déduire la complexité en temps de l'instruction List.filter (fun bb -> trie_mem bb t) lb;;.
Définition : Nous appelons système de transitions sur l'alphabet Σ la donnée d'un triplet ( Q, q^, Δ ) où
  • Q est un ensemble (fini ou non), dit ensemble des états,
    − q^ ∈ Q est un état, dit état initial,
  • Δ ⊆ Q × Σ × Q est une relation, dite relation de transition.
Un mot c = c_1…c_n ∈ Σ^n est accepté par le système de transitions ( Q, q^, Δ ) s'il existe une suite d'états (q_j)_(0 ⩽ j ⩽ n) telle que l'état q_0 égale l'état initial q^ et, pour tout j compris entre 0 et n − 1, le triplet ( q_j, c_(j + 1), q_(j + 1) ) appartient à la relation de transition Δ.
On peut voir un système de transitions comme un automate éventuellement infini dont tous les états sont finals.
◻20 - Dessiner, sans justifier, un système de transitions fini qui accepte les mots w ∈ Σ^∗ n'ayant pas le mot ccmp comme facteur (c'est-à-dire que le mot w n'est pas accepté si et seulement s'il contient quatre symboles consécutifs valant c, c, m et p ).
Nous disons qu'un système de transitions ( Q, q^, Δ ) est déterministe s'il existe une fonction partiellement définie δ : Q × Σ → Q telle que l'on ait
Δ = {(q, x, δ(q, x)); (q, x) ∈ Q × Σ et δ(q, x) est défini }.
Nous notons alors ( Q, q^, δ ) ce système.
Indication Ocaml : Afin de représenter des systèmes de transitions déterministes, nous convenons de nous appuyer sur un type etat pour représenter l'ensemble des états Q. Ce type sera explicité ultérieurement. Nous déclarons
type syst_trans = etat -> char -> etat option; ;
pour représenter la fonction de transition δ. Pour tout couple (q, x) ∈ Q × Σ, si delta est de type syst_trans, on accède à l'état image q^′ = δ(q, x) par l'expression delta q × qui vaut alors Some qprime si la transition est bien définie ou bien None si la transition n'est pas définie.
21 - Écrire une fonction trie_filter (qchapeau:etat) (delta:syst_trans) (Node tcm:trie) : trie qui renvoie un trie contenant les mots du trie t = Node tcm acceptés par le système de transitions déterministe ( Q, q^, δ ). Il n'est pas demandé de renvoyer un trie élagué.
22 - Un système de transitions déterministe ( Q, q^, δ ) étant fixé, quelle est la complexité en temps du calcul trie_filter qchapeau delta t en fonction du trie t ? On suppose que l'exécution de la fonction de transition δ s'effectue en temps constant.

3 Système de transitions des voisins d'un mot brouillé

Dans toutes les questions restantes, les lettres b et c désignent systématiquement deux mots de longueur m et n de (Σ∖{$})^∗. La lettre k désigne un entier naturel. L'écriture c$ désigne la concaténation du mot c et du symbole $; nous parlons alors de mot prolongé.
L'objectif de cette section est de construire un système de transitions non déterministe qui, à partir d'un entier naturel k et d'un mot brouillé b, accepte n'importe quel préfixe du mot prolongé c^′ = c$ où c est un mot de (Σ∖{$})^∗ tel que dist(b, c) ⩽ k et aucun autre mot n'est accepté.
Définition : Nous appelons transformations élémentaires les ( k + 3 ) appellations suppr, subs et h-ins-puis-id, avec 0 ⩽ h ⩽ k; nous notons T leur ensemble.
Soient c^′ = c_1^′…c_n^′ ∈ Σ^∗ un mot de longueur n et b^′ ∈ Σ^∗ un mot de longueur m. Nous disons qu'une suite τ = (τ_1, τ_2, …, τ_n) de n transformations élémentaires est un script de transformation du mot c^′ en le mot b^′ s'il existe une factorisation β_1 β_2…β_n du mot b^′ telle que pour tout entier j compris entre 1 et n,
(1) β_j est un mot de Σ^∗,
(2) lorsque τ_j = suppr, alors le mot β_j est le mot vide ε,
(3) lorsque τ_j = subs, alors le mot β_j est de longueur 1 et, en l'identifiant à un symbole, il est distinct du symbole c_j^′,
(4) lorsque τ_j = h-ins-puis-id, alors le mot β_j est de longueur h + 1 et le dernier symbole de β_j vaut le symbole c_j^′.
Nous observons que la factorisation du mot b^′ en β_1 β_2…β_n est unique et ne dépend que du script τ.
Voici un exemple de script de transformation entre le mot c^′ = correct $ et le mot b^′ = incorekte $.
(c_j^′)_(1 ⩽ j ⩽ 8) C 0 r r e C t $
(β_j)_(1 ⩽ j ⩽ 8) inc 0 r ε e k 七 e$
(τ_j)_(1 ⩽ j ⩽ 8) 2-ins-puis-id 0-ins-puis-id 0-ins-puis-id suppr 0-ins-puis-id subs 0-ins-puis-id 1-ins-puis-id
Définition : Le coût d'une transformation élémentaire est précisé par le tableau suivant :
Transformation élémentaire suppr subs h-ins-puis-id
Coût 1 1 h
Le coût d'un script de transformation est la somme des coûts des transformations élémentaires constituant le script.
Dans l'exemple ci-dessus, le coût du script vaut 5 (ou encore 2 + 0 + 0 + 1 + 0 + 1 + 0 + 1 ).
Définition : Nous utilisons le terme k-script pour raccourcir l'expression «script de transformation de coût inférieur ou égal à k».
◻23 - Montrer que la distance dist ( b, c ) est inférieure ou égale à k si et seulement s'il existe un k-script du mot prolongé c$ vers le mot prolongé b$.
Dans les questions 24 et 25 , la lettre j désigne un entier avec 0 ⩽ j ⩽ n et τ = (τ_1, τ_2, …, τ_j) ∈ T^j un k-script depuis le préfixe préf _j(c$) du mot prolongé c$ vers un certain préfixe p du mot prolongé b$. On appelle s le suffixe de b$ tel que b$ se factorise en b$ = ps.
◻24 - Si l'on a 0 ⩽ j < n, par quelles appellations τ_(j + 1) ∈ T est-il possible de compléter le k-script τ pour que ( τ_1, τ_2, …, τ_(j + 1) ) soit un k-script depuis le préfixe préf _(j + 1)(c$) vers un certain préfixe du mot prolongé b$ ? On exprimera sa réponse en fonction du (j + 1)^e symbole c_(j + 1) de c$, du suffixe s et du coût κ du script τ.
25 - Si l'on a j = n, par quelles appellations τ_(n + 1) ∈ T et sous quelles conditions est-il possible de compléter le k-script τ pour que ( τ_1, τ_2, …, τ_(n + 1) ) soit un k-script depuis le mot prolongé c$ vers le mot prolongé b$ ?
Indication Ocaml : Nous précisons le type etat en déclarant type etat = mot * int;;
◻26 - Le mot brouillé b ∈ (Σ∖{$})^∗ étant toujours fixé, décrire en OCaml un système de transitions ( Q, q^, Δ ) qui accepte tout préfixe du mot c$, avec c ∈ (Σ∖{$})^∗, tel que dist(b, c) ⩽ k et qui n'accepte aucun autre mot. On définira une fonction etat_initial (b:mot) (k:int) : etat qui construit l'état initial q^ et une fonction delta (k:int) (q:etat) (x:char) : etat list qui renvoie la liste des états q^′ tels que l'on ait (q, x, q^′) ∈ Δ.
◻27 - Comment adapter la fonction trie_filter, écrite à la question 21, pour qu'elle fonctionne avec le système de transitions de la question 26 ? On ne demande pas de code. Préciser la complexité en temps. Pourquoi peut-on souhaiter adapter la fonction trie_filter plutôt que de déterminiser le système de transitions?

Fin de l'épreuve

Questions fréquentes

4 questions
Sur quels chapitres porte l'épreuve d'informatique option MP Mines-Ponts 2022 ?
Afficher ou masquer la section

Sur quels chapitres porte l'épreuve d'informatique option MP Mines-Ponts 2022 ?

Le sujet porte sur la correction orthographique d'un mot : distance d'édition de Levenshtein par programmation dynamique, structure de trie pour stocker un corpus de mots, et automates pour la fouille et le filtrage.

Quelles erreurs le jury a-t-il le plus relevées sur ce sujet d'informatique MP Mines-Ponts 2022 ?

Le jury relève une erreur de typage sur une inégalité, une programmation dynamique souvent non mise en œuvre, une méconnaissance de la complexité d'insertion dans un dictionnaire, et une confusion avec la structure usuelle d'automates.

Quelle partie du sujet d'informatique MP Mines-Ponts 2022 est la moins bien traitée ?

La troisième partie, sur la construction d'un filtre de fouille inspiré des automates, est très peu abordée convenablement selon le rapport.

Ce sujet d'informatique MP Mines-Ponts 2022 est-il un bon entraînement sur la programmation dynamique ?

Oui, la première partie porte spécifiquement sur le calcul de la distance d'édition par mémoïsation, une technique que le rapport signale comme peu maîtrisée par les candidats.

Pas de description pour le moment