X ENS Option Informatique MP 2012Sujet, corrigé et rapport du jury
Arbres combinatoires
- Structures de données arborescentes (BDD/ZDD)
- Récursivité et preuves par récurrence
- Complexité algorithmique
- Tables d'association et tables de hachage
Téléchargements
Présentation du sujet
DifficileArbres combinatoires (ZDD) : construction, mémoïsation et dénombrement de pavagesAfficher ou masquer la section
Présentation du sujet
DifficileLe problème étudie les arbres combinatoires, une variante des BDD appelée Zero-suppressed Binary Decision Diagram, qui représente un ensemble d'ensembles sous la forme d'un graphe acyclique avec partage maximal. Après avoir introduit la structure et des fonctions élémentaires, le sujet développe un principe de mémoïsation, l'applique au dénombrement des pavages d'un échiquier par des dominos, puis explique comment garantir efficacement le partage maximal à l'aide de tables de hachage.
- 1Partie I : arbres combinatoiresDéfinition de la structure d'arbre combinatoire et des propriétés d'ordre et de suppression.
- 2Partie II : fonctions élémentaires sur les arbres combinatoiresÉcriture de fonctions de base (élément arbitraire, singleton, appartenance, cardinal).
- 3Partie III : mémoïsationIntroduction du principe de mémoïsation à l'aide d'une table d'association.
- 4Partie IV : dénombrement de pavagesApplication des arbres combinatoires au dénombrement des pavages d'un échiquier par des dominos 2x1.
- 5Partie V et VI : tables de hachage et partage maximalIntroduction des tables de hachage puis garantie du partage maximal lors de la construction des arbres combinatoires.
Difficile. La moyenne n'est que de 8,13/20 avec un écart-type de 3,38 sur 732 candidats, et plusieurs questions de fin de sujet n'ont été traitées entièrement correctement que par moins de 5 % des candidats.
L'épreuve en chiffres
Moyenne 8,13 / 20 · écart-type 3,38 · 732 copies · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 8,13/ 20
- Écart-type
- 3,38
- Copies
- 732
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
4 erreurs relevéesErreur de calcul sur le nombre d'arbres combinatoires · Confusion entre élément arbitraire et élément aléatoire · Erreur d'énoncé sur une complexitéAfficher ou masquer la section
Ce qu'a observé le jury
4 erreurs relevéesLe sujet, deuxième édition de cette épreuve commune à Polytechnique et aux ENS, demandait de traiter le problème en entier pour obtenir la note maximale. Le jury rappelle que presque toutes les fonctions demandées pouvaient être écrites en moins de dix lignes, et qu'un programme très long contient souvent un grand nombre d'erreurs.
Les erreurs les plus sanctionnées
- 1Erreur de calcul sur le nombre d'arbres combinatoiresQ4
La réponse correcte de 2^(2n) a été proposée par beaucoup de candidats, mais peu l'ont justifiée par une bijection ; certains candidats pensent à tort que 2^(2n) = 4n.
« Certains candidats pensent qu e 22n = 4 n. »
- 2Confusion entre élément arbitraire et élément aléatoireQ5
Quelques candidats ont été troublés par la consigne de renvoyer un élément arbitraire et l'ont confondu avec un élément aléatoire.
« Ils ont confondu arbitraire et alé atoire. »
- 3Erreur d'énoncé sur une complexitéQ8
L'énoncé demandait une complexité impossible à garantir ; les correcteurs en ont tenu compte et aucun candidat n'a semblé gêné par cette erreur.
« il n’est pas possible de garantir une complexité O(card(S(A))). »
- 4Question la plus difficile du sujetQ14
Quelques candidats ont compris la structure de l'arbre à construire, mais très peu sont parvenus à garantir la complexité linéaire demandée.
« Il s’agissait probablement là de la question la plus difficile du »
Ce qui a été bien réussi
- La question 6, sur une fonction élémentaire, a été dans la plupart des cas très bien traitée.
- La question 9, élémentaire sur la taille d'un arbre combinatoire, a été correctement traitée dans la majorité des copies.
Conseils du jury
- Préférer un programme court et bien expliqué à un programme long, souvent porteur d'erreurs.
- Toujours vérifier les conditions de bord (cas de base, condition de suppression) avant d'appliquer une hypothèse de récurrence.
- Commenter les algorithmes proposés, notamment pour les questions de complexité les plus délicates.
- Utiliser une seule table d'association commune à tous les appels récursifs, plutôt que d'en recréer une à chaque appel.
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 - A - (XULC)
Le langage de programmation choisi par le candidat doit être spécifié en tête de la copie.
Arbres combinatoires
Partie I. Arbres combinatoires
.jpg)
et d'autre part
Ainsi les deux arbres
.jpg)
ne correspondent pas à des arbres combinatoires, car celui de gauche ne vérifie pas la condition (ordre) et celui de droite ne vérifie pas la condition (suppression).

est interprété comme l'ensemble
Question 2 Donner les trois arbres combinatoires correspondant aux trois ensembles
Partie II. Fonctions élémentaires sur les arbres combinatoires
(* Caml *)
type ac = Zero | Un
| Comb of int * ac * ac;;
{ Pascal }
type ac = `noeud;
noeud = record element : integer;
gauche : ac; droit : ac; end;
(* Caml *) cons: int -> ac -> ac -> ac
{ Pascal } function cons(i: integer; a1: ac; a2: ac) : ac;
(* Caml *)
type ensemble == int list;;
{ Pascal }
type ensemble =
record tete: integer; queue: `ensemble; end;
(* Caml *) un_elt: ac -> ensemble
{ Pascal } procedure un_elt(a: ac; var v: ensemble);
(* Caml *) singleton: ensemble -> ac
{ Pascal } function singleton(s: ensemble) : ac;
(* Caml *) appartient: ensemble -> ac -> bool
{ Pascal } function appartient(s: ensemble; a: ac) : boolean;
(* Caml *) cardinal: ac -> int
{ Pascal } function cardinal(a: ac) : integer;
Partie III. Principe de mémorisation
- cree1() renvoie une nouvelle table, initialement vide;
- ajoute1
(t, a, v) ajoute l'association de la valeurv à l'arbrea dans la tablet ; - present1(
t, a ) renvoie un booléen indiquant si l'arbrea est associé à une valeur dans la tablet ; - trouve1
(t, a) renvoie la valeur associée à l'arbrea dans la tablet , en supposant qu'elle existe.
On suppose que les trois fonctions ajoute1, present1 et trouve1 ont toutes un coût constantO(1) . On suppose de même l'existence d'un type table2 représentant des tables d'association indexées par des couples d'arbres combinatoires et quatre fonctions similaires cree2, ajoute2, present2 et trouve2, également de coût constant. (Les parties V et VI expliqueront comment de telles tables peuvent être construites.)
(* Caml *) cardinal: ac -> int
{ Pascal } function cardinal(a: ac) : integer;
(* Caml *) inter: ac -> ac -> ac
{ Pascal } function inter(a1: ac; a2: ac) : ac;
Partie IV. Application au dénombrement

(* Caml *) colonne: int -> ac
{ Pascal } function colonne(j: integer) : ac;
(* Caml *) pavage: unit -> ac
{ Pascal } function pavage : ac;
Partie V. Tables de hachage
(* Caml *)
type table == (clé * valeur) list
vect;;
{ Pascal }
type table = array[0..H-1] of `seau;
type seau = record k: clé; v: valeur;
suivant: `seau; end;
(* Caml *) ajoute: table -> clé -> valeur -> unit
{ Pascal } procedure ajoute(t: table; k: clé; v: valeur);
(* Caml *) present: table -> clé -> bool
{ Pascal } function present(t: table; k: clé) : boolean;
(* Caml *) trouve: table -> clé -> valeur
{ Pascal } function trouve(t: table; k: clé) : valeur;
Partie VI. Construction des arbres combinatoires
(* Caml *)
type unique == int;;
type ac = Zero | Un
| Comb of unique * int * ac *
ac;;
{ Pascal }
type ac = ^noeud;
noeud = record unique: integer;
element: integer; gauche: ac; droit: ac;
end;
Question 21 Proposer un code pour la fonction cons qui garantisse la propriété (3), en supposant que les arbres combinatoires sont exclusivement construits à partir de Zero, Un et de la fonction cons. On garantira un coût
(* Caml *) cons: int -> ac -> ac -> ac
{ Pascal } function cons(i: integer; a1: ac; a2: ac) : ac;
| longueur du seau | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
|
6450 | 7340 | 4080 | 1617 | 400 | 96 | 11 | 3 |
- dans le cas où l'arbre doit être construit pour la première fois;
- dans le cas où l'arbre apparaissait déjà dans la table?
Questions fréquentes
4 questionsSur quels chapitres porte la composition d'informatique MP X-ENS 2012 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte la composition d'informatique MP X-ENS 2012 ?
Le sujet porte sur les arbres combinatoires (une variante des BDD), la récursivité, la mémoïsation, les tables de hachage et une application au dénombrement des pavages d'un échiquier par des dominos.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet d'informatique MP X-ENS 2012 ?
Le jury relève une erreur de calcul sur le nombre d'arbres combinatoires, une confusion entre élément arbitraire et élément aléatoire, et une difficulté généralisée à garantir les complexités demandées, notamment à la question 14.
Ce sujet d'informatique MP X-ENS 2012 est-il difficile ?
Oui, la moyenne n'est que de 8,13/20 sur 732 candidats, et plusieurs questions de fin de sujet n'ont été résolues entièrement que par une très faible proportion des candidats.
Ce sujet de X-ENS MP 2012 nécessite-t-il de bien maîtriser la récursivité ?
Oui, la plupart des fonctions demandées sont récursives et le rapport souligne l'importance de vérifier les cas de base et les conditions de bord, sources fréquentes d'erreurs dans les copies.
Pas de description pour le moment
