Polytechnique Option Informatique MP 2008Sujet, corrigé et rapport du jury
Structure de corde
- Structures de données arborescentes
- Programmation récursive et itérative en Caml ou Pascal
- Complexité algorithmique (constante, linéaire, quadratique, logarithmique)
- Suite de Fibonacci et nombre d'or
- Algorithmes d'équilibrage d'arbres
Téléchargements
Présentation du sujet
Difficulté moyenneStructure de données de corde (rope) pour la représentation efficace de grandes chaînes de caractères : opérations de base et algorithmes d'équilibrage (dont Garsia-Wachs)Afficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet d'informatique de l'École polytechnique MP 2008 étudie la structure de corde, une alternative aux chaînes de caractères usuelles fondée sur un arbre binaire dont les feuilles sont des mots. Après des fonctions préliminaires sur les mots puis les opérations essentielles sur les cordes (longueur, concaténation, extraction de caractère et de sous-corde), le sujet aborde le problème de l'équilibrage d'une corde à travers un premier algorithme fondé sur les nombres de Fibonacci garantissant un coût moyen logarithmique, puis l'algorithme optimal de Garsia-Wachs.
- 1Partie I : préliminaires sur les motsÉcriture de fonctions élémentaires sur des mots représentés par des listes d'entiers : longueur, i-ème caractère, préfixe et suffixe.
- 2Partie II : opérations sur les cordesDéfinition du type corde, arbre binaire dont les feuilles sont des mots, et programmation de ses opérations essentielles : longueur, création, concaténation, accès à un caractère et extraction d'une sous-corde.
- 3Partie III : équilibrageÉtude et programmation d'un algorithme d'équilibrage fondé sur les nombres de Fibonacci, garantissant un coût moyen d'accès aux caractères logarithmique en la longueur de la corde.
- 4Partie IV : équilibrage optimalÉtude de l'algorithme optimal de Garsia-Wachs, procédant en deux étapes : construction d'une corde de coût minimal puis remise en ordre des feuilles à profondeur inchangée.
Difficulté moyenne. Sur 739 copies, la note moyenne est de 10,97/20 avec un écart-type de 3,85 ; les premières questions ont un taux de réussite très élevé mais certaines questions des parties III et IV, notamment la question 18, ont un taux de réussite très faible (12 %), traduisant une difficulté croissante au fil du sujet.
L'épreuve en chiffres
Moyenne 10,97 / 20 · écart-type 3,85 · 739 copies · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 10,97/ 20
- Écart-type
- 3,85
- Copies
- 739
Votre note sur 20 à ce sujet, en conditions de concours.
Source : rapport du jury. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
6 erreurs relevéesConditions d'arrêt mal traitées et solutions quadratiques · Cas du mot vide et complexité non optimale · Trois cas de figure de la sous-corde mal distinguésAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet étudiait la structure de corde, alternative efficace aux chaînes de caractères usuelles. Sur 739 copies, la moyenne est de 10,97/20 avec un écart-type de 3,85. Les questions de la partie I étaient faciles mais demandaient de traiter avec soin les conditions d'arrêt ; presque toutes les fonctions demandées pouvaient s'écrire en moins de dix lignes. Le jury rappelle qu'une réponse longue doit être expliquée en détail et qu'un programme très long contient souvent un grand nombre d'erreurs ; il fallait traiter le problème en entier pour obtenir la note maximale.
Les erreurs les plus sanctionnées
- 1Conditions d'arrêt mal traitées et solutions quadratiquesQuestions 3 et 4
Un nombre significatif de copies a été pénalisé pour ne pas avoir correctement traité la condition d'arrêt, ce phénomène étant amplifié lorsqu'une solution plus compliquée que nécessaire est choisie ; les solutions quadratiques plutôt que linéaires ont également été sanctionnées.
« les sol utions quadratiques plutôt que linéaires ont été sanctionnées »
- 2Cas du mot vide et complexité non optimaleQuestion 6
Cette fonction nécessitait de considérer avec soin le cas du mot vide pour respecter l'invariant sur les cordes ; des solutions linéaires, consistant par exemple à construire un arbre en forme de peigne, ont été sanctionnées alors qu'une complexité constante était attendue.
« des solutions linéaires, consistant par exemple à construire un arbre binaire en form e de peigne avec les lettres du mot, ont été sanctionnées »
- 3Trois cas de figure de la sous-corde mal distinguésQuestion 9
Cette question, apparue plus difficile que les précédentes, demandait de bien considérer les trois cas de figure (sous-corde entièrement dans le sous-arbre gauche, dans le droit, ou chevauchant les deux) et de traiter avec soin les nombreux paramètres des appels récursifs.
« la première diffculté étant de bien considérer les trois cas d e figure »
- 4Propriété de Fibonacci sur la position du résultat mal compriseQuestion 13
Cette question, l'une des plus difficiles, demandait de comprendre que lorsqu'il y a concaténation de deux cordes non vides, le résultat est nécessairement placé plus loin dans la file, en vertu des propriétés des nombres de Fibonacci.
« La difficulté principale de la question était de comprendre que, lorsqu'il y a effectivement concaténation de deux cordes non vides, alors le résultat se ra »
- 5Incompréhension en chaîne de l'algorithme d'équilibrageQuestion 15
De très nombreux candidats ont incorrectement répondu à cette question en raison d'une incompréhension de l'algorithme de la question précédente, la rédaction rigoureuse de la récurrence demandée posant également des difficultés.
« De très nombreux candidats ont incorrectement répondu à cette question en raison d'une incompréhension de l'algori thme à la question 14 »
- 6Reconstruction d'une corde à partir des profondeurs, question la plus difficileQuestion 18
C'était peut-être la question la plus difficile du sujet, avec seulement 12 % des candidats obtenant au moins la moitié des points et 84 % obtenant zéro, bien que plusieurs solutions élégantes existent.
« C'était peut-être la question la plus difficile du sujet »
Ce qui a été bien réussi
- La question 1 a été correctement traitée dans l'immense majorité des cas (99 % de réussite au moins partielle).
- La question 2 a rencontré peu de problèmes (95 % de réussite au moins partielle).
- La question 8 sur l'accès à un caractère d'une corde a été bien traitée dans l'ensemble (91 %).
- La question 11 sur le calcul des nombres de Fibonacci a été bien traitée dans l'ensemble (95 %).
Conseils du jury
- Traiter avec soin les conditions d'arrêt de chaque fonction récursive ou itérative.
- Privilégier systématiquement la complexité optimale demandée (constante ou linéaire) plutôt qu'une solution plus lourde mais fonctionnelle.
- Respecter scrupuleusement l'invariant donné sur la structure de données étudiée.
- Rédiger des réponses concises : une réponse longue doit être expliquée en détail, et un programme très long contient souvent de nombreuses erreurs.
- Essayer de traiter le problème dans son ensemble, la note maximale nécessitant de l'aborder en entier.
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
COMPOSITION D'INFORMATIQUE
Le langage de programmation choisi par le candidat doit être spécifié en tête de la copie.
Structure de corde

représente le mot GATTACCATAGATTAC, obtenu par concaténation des cinq mots GATTAC, CAT, AG, ATT et AC. L'intérêt des cordes est d'offrir une concaténation immédiate et un partage possible de caractères entre plusieurs chaînes, au prix d'un accès aux caractères un peu plus coûteux.
Partie I. Préliminaires sur les mots
(* Caml *)
type mot == int list;;
{ Pascal }
type mot = `cellule; cellule = record
lettre : integer; suite : mot; end;
function nouveauMot(a:integer; x:mot) : mot;
var r : mot;
begin new(r); r^.lettre := a; r^.suite := x; nouveauMot := r; end;
(* Caml *) longueurMot : mot -> int
{ Pascal } function longueurMot(x : mot) : integer
(* Caml *) iemeCar : int -> mot -> int
{ Pascal } function iemeCar(i : integer ; x : mot) : integer
(* Caml *) prefixe : int -> mot -> mot
{ Pascal } function prefixe(k : integer ; x : mot) : mot
(* Caml *) suffixe : int -> mot -> mot
{ Pascal } function suffixe(k : integer ; x : mot) : mot
Partie II. Opérations sur les cordes
(* Caml *)
type corde =
| Vide
| Feuille of int*mot
| Noeud of int*corde*corde;;
{ Pascal }
type corde = `arbre; nature = (Feuille, Noeud);
arbre = record case indicateur : nature of
Feuille : (n :integer; x :mot);
Noeud : (n :integer ; g, d :corde) ; end;
Dans la suite, on garantira l'invariant suivant sur les cordes :
- dans une corde de la forme
Feuille(n, x) , on an = longueurMot(x) etn > 0 ; - dans une corde de la forme
Noeud(n, c_1, c_2) , on ac_1 ≠ Vide,c_2 ≠ Vide etn est la longueur totale de la corde, c'est-à-dire la somme des longueurs dec_1 etc_2 .
(* Caml *) longueur : corde -> int
{ Pascal } function longueur(c : corde) : integer
(* Caml *) nouvelleCorde : mot -> corde
{ Pascal } function nouvelleCorde(m : mot) : corde
(* Caml *) concat : corde -> corde -> corde
{ Pascal } function concat(c1 : corde; c2 : corde) : corde
(* Caml *) caractere : int -> corde -> int
{ Pascal } function caractere(i : integer ; c : corde) : integer
(* Caml *) sousCorde : int -> int -> corde -> corde
{ Pascal } function sousCorde(i : integer ; m : integer ; c : corde) : corde
Partie III. Équilibrage
le mot

- On insère successivement chaque feuille
x_j dans le tableau file à partir de la case 2. L'insertion d'une feuille, et plus généralement d'une corde, à partir de la case d'indicei se fait ainsi :
(a) La corde à insérer est concaténée à droite de la corde se trouvant dans la casei ; soitc^′ le résultat. Si la longueur dec^′ est comprise dans l'intervalle[F_i, F_(i + 1)[ , on affectec^′ à la casei et on a terminé l'insertion de cette corde.
(b) Sinon, on affecte Vide à la casei et on retourne à l'étape (a) pour effectuer l'insertion dec^′ à partir de la case d'indicei + 1 .
On garantit l'invariant suivant : après l'insertion de la feuillex_j , la concaténation successive de toutes les cordes contenues dans les cases de file, considérées dans le sens des indices décroissants, est égale à une corde représentant le motx_0 x_1…x_j . - Le résultat est alors la corde résultant de la concaténation successive de toutes les cordes de file, considérées dans le sens des indices décroissants.
(* Caml *)
let tailleMax = 44;; const tailleMax = 44;
let fib = make_vect (tailleMax+1) 0 ; ; var fib :array[0..tailleMax] of integer;
(* Caml *) { Pascal }
let file = make_vect tailleMax Vide; ; var file :array[0..tailleMax-1] of corde;
(* Caml *) inserer : corde -> int -> unit
{ Pascal } procedure inserer(c : corde ; i : integer)
(* Caml *) equilibrer : corde -> corde
{ Pascal } function equilibrer(c : corde) : corde
Partie IV. Équilibrage optimal
- Initialement, la liste
q est la liste⟨x_0, x_1, …x_k⟩ desk + 1 feuilles dec . - Tant que la liste
q contient au moins deux éléments, on effectue l'opération suivante:
(a) Déterminer le plus petit indicei tel que
(b) Ôter
(c) Déterminer le plus grand indice
(d) Insérer
3. Le résultat est l'unique élément restant dans la liste
(* Caml *) { Pascal }
let maxf = 1000; ; const maxf :integer = 1000;
let q = make_vect maxf Vide; ; var q :array[0..maxf-1] of corde;
(* Caml *) initialiserQ : corde -> int
{ Pascal } function initialiserQ(c : corde) : integer
(* Caml *) phase1 : corde -> corde
{ Pascal } function phase1(c : corde) : corde
(* Caml *) { Pascal }
let prof = make_vect maxf 0; ; | var prof :array [0..maxf-1] of
(* Caml *) initialiserProf : corde -> corde -> unit
{ Pascal } procedure initialiserProf(c : corde ; c1 : corde)
(* Caml *) reconstruire : unit -> corde
{ Pascal } function reconstruire : corde
(* Caml *) equilibrerOpt : corde -> corde
{ Pascal } function equilibrerOpt(c : corde) : corde

Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique Polytechnique MP 2008 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique Polytechnique MP 2008 ?
Le sujet porte sur la structure de corde (rope) pour représenter efficacement de grandes chaînes de caractères : opérations de base, complexité algorithmique, et algorithmes d'équilibrage d'arbres dont l'algorithme optimal de Garsia-Wachs.
Quelle est la moyenne à l'épreuve d'informatique Polytechnique MP 2008 ?
La note moyenne est de 10,97/20 avec un écart-type de 3,85, sur 739 copies. Les candidats ayant composé en Pascal (7,58 %) ont obtenu une moyenne de 8,99, inférieure à la moyenne générale.
Quelles erreurs le jury a-t-il le plus relevées à cette épreuve d'informatique Polytechnique MP 2008 ?
Le jury relève des conditions d'arrêt mal traitées, des solutions de complexité non optimale (quadratique au lieu de linéaire, ou linéaire au lieu de constante), une mauvaise gestion des trois cas de figure d'extraction d'une sous-corde, et une incompréhension de la propriété de Fibonacci garantissant l'équilibrage.
Cette épreuve d'informatique Polytechnique MP 2008 est-elle difficile ?
Le sujet est de difficulté progressive : les premières questions affichent des taux de réussite très élevés (plus de 90 %), mais certaines questions des parties III et IV sont parmi les plus difficiles, la question 18 n'étant réussie, même partiellement, que par 12 % des candidats.
Pas de description pour le moment
