X ENS Informatique Commune MP PC 2016Sujet, corrigé et rapport du jury
- Programmation Python : listes, boucles, fonctions
- Complexité des algorithmes
- Graphes et partitions (structure union-find)
- Algorithmes randomisés
- Bases de données : requêtes SQL, jointures
Téléchargements
Présentation du sujet
Difficulté moyenneRéseaux sociaux : listes d'amis, partitions union-find, coupe minimum randomisée et requêtes SQLAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneL'épreuve de deux heures porte sur les réseaux sociaux en deux parties indépendantes. La partie Python manipule un réseau représenté par une liste de liens, puis des partitions codées par un tableau parent, et aboutit à un algorithme randomisé de coupe minimum. La partie SQL demande des requêtes sur une table d'individus et une table de liens d'amitié.
- 1Partie I : réseaux sociauxReprésentation d'un réseau par listes, test d'amitié, ajout de lien et liste des amis avec analyse de complexité.
- 2Partie II : partitionsTableau parent, recherche du représentant, fusion de groupes, compression de chemin et liste des groupes.
- 3Partie III : algorithme randomisé pour la coupe minimumFusions aléatoires de groupes jusqu'à obtenir deux groupes, puis calcul du nombre de liens coupés.
- 4Partie B : programmation SQLRequêtes renvoyant les amis d'un individu, leurs noms et prénoms, puis les amis de ses amis.
Difficulté moyenne. Les premières questions sont jugées très simples par le jury, tandis que les questions 13 à 15 ont posé problème à beaucoup de candidats, la question 14 étant la plus complexe.
Ce qu'a observé le jury
6 erreurs relevéesComplexité mal exprimée · Liste de listes mal initialisée · Mauvais usage de appendAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe rapport couvre séparément les filières MP et PC. Le code est évalué sur sa justesse, son efficacité, sa lisibilité et, quand l'énoncé le demande, sur l'analyse de complexité. Les premières questions ont été massivement réussies, alors que la fin de la partie Python et certaines requêtes SQL ont nettement départagé les candidats.
Les erreurs les plus sanctionnées
- 1Complexité mal expriméeQ4 à Q6, Q9
Les deux paramètres n et m sont confondus, et des complexités concrètes comme 2m + 3 sont données au lieu d'un ordre de grandeur justifié.
« il ne faut pas répondre par O(m + 2) »
- 2Liste de listes mal initialiséeQ8, Q13
Créer les groupes avec [[]]*n produit des sous-listes partagées : modifier l'une modifie toutes les autres.
« Une solution pouvait par exemple s'écrire sous la forme [[] for i in range(n)] »
- 3Mauvais usage de append
Affecter le résultat de append à la liste la détruit, car append ne renvoie rien. L'opérateur += ne sert pas à ajouter un élément.
« Il faut en particulier éviter liste=liste.append(valeur) »
- 4Compression de chemin incomplèteQ12
Beaucoup ne modifient que le parent de i ou ne remontent qu'une génération au lieu de rattacher tous les ancêtres au représentant.
- 5Algorithme randomisé mal implémentéQ14
Tirages répétés jusqu'à trouver un lien non traité, appels en boucle de fonctions coûteuses, oubli des dernières fusions et analyse de complexité amortie rarement comprise.
« Très peu de candidats ont compris l'analyse de la complexité amortie que permettait la question 12. »
- 6Requêtes SQL trop compliquéesQ16 à Q18
Les requêtes excessivement complexes, les parenthèses inutiles après SELECT ou l'usage de == ont souvent conduit à des erreurs. La table LIENS suffisait pour les questions 16 et 18.
« le test d'égalité s'écrit = et non == »
Ce qui a été bien réussi
- Les questions 1 et 2 sur la représentation du réseau ont été réussies par presque tous.
- La recherche du représentant (Q9) et la fusion (Q10) ont été globalement bien traitées.
- La plupart des candidats ont correctement écrit la première requête SQL (Q16).
Conseils du jury
- Écrire un code lisible, bien indenté et complet, sans omettre parenthèses ni paramètres.
- Réutiliser les fonctions écrites aux questions précédentes plutôt que tout réécrire.
- Vérifier que les indices ne dépassent pas la taille du tableau, sachant que l'indexation commence à 0.
- Justifier la complexité quand elle est demandée, car elle fait partie de la notation.
- Stocker le résultat d'un appel de fonction au lieu de le rappeler dans une boucle.
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
filières MP hors specialité info
filières
COMPOSITION D'INFORMATIQUE - B - (XELCR)
Le langage de programmation sera obligatoirement Python.
A - Programmation en Python
On rappelle qu'en Python, on dispose des opérations suivantes, qui ont toutes une complexité constante (car en Python, les listes sont en fait des tableaux de taille dynamique) :
- [] crée une liste vide (c.-à-d. ne contenant aucun élément)
-
[x]∗n qui crée une liste (ou un tableau) à n éléments contenant tous la valeur contenue dans x . Par exemple, [1]∗3 renvoie le tableau (ou la liste)[1, 1, 1] à 3 cases contenant toutes la même valeur 1. - len (liste) renvoie la longueur de la liste liste
- liste [i] désigne le (i+1)-ème élément de la liste liste s'il existe et produit une erreur sinon (noter que le premier élément de la liste est liste[0]).
- liste.append( x ) ajoute le contenu de x à la fin de la liste liste qui s'allonge ainsi d'un élément. Par exemple, après l'exécution de la suite d'instructions "liste = []; liste.append(2); liste.append([ 1,3
] );", la variable liste a pour valeur la liste [2, [1, 3]]. Si ensuite on fait l'instruction liste[1].append([7,5]);, la variable liste a pour valeur la liste[2, [1, 3, [7, 5]]] . - liste.pop() renvoie la valeur du dernier élément de la liste liste et l'élimine de la liste. Ainsi, après l'exécution de la suite d'instructions "listeA = [1, [2,3]]; listeB
= listeA.pop();c = listeB.pop() ; ", les trois variables listeA, listeB et c ont pour valeurs respectives [1], [2] et 3. - random.randint(a,b) renvoie un entier tiré (pseudo)aléatoirement et uniformément dans l'ensemble
{a, a + 1, …, b − 1, b} . - True et False sont les deux valeurs booléennes Vrai et Faux.
Partie I. Réseaux sociaux
- reseau
[0] = n contient le nombre d'individus appartenant au réseau - reseau [1] = la liste non-ordonnée (et potentiellement vide) des liens d'amitié déclarés entre les individus
La figure 1 donne l'exemple d'un réseau social et d'une représentation possible sous la forme de liste. Chaque lien d'amitié entre deux personnes est représenté par un trait entre elles.
.jpg)
reseau = [ 8,
[ [0,1], [1,3], [3,2], [2,0], [0,3], [2,1], [4,5],
[5,7], [7,6], [6,4], [7,4], [6,5], [2,4], [5,3] ]
]

.jpg)
Partie II. Partitions

|
|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| parent
|
6 | 9 | 3 | 3 | 3 | 5 | 5 | 5 | 1 | 9 | 10 | 1 | 4 | 9 | 11 | 9 |

.jpg)
- Déterminer si deux éléments appartiennent au même groupe dans la partition.
- Fusionner deux groupes pour n'en faire plus qu'un. Par exemple, la fusion des groupes
A_1 = {1, 3} etA_3 = {2} dans la partition de[ [6] ] donnée en exemple au tout début de cette partie donnera la partition en deux groupesA_2 = {0, 4, 5} etA_4 oùA_4 = A_1 ∪ A_3 = {1, 2, 3} .
Question 9. Écrire une fonction representant (parent,i) qui utilise le tableau parent pour trouver et renvoyer l'indice du représentant du groupe auquel appartient i dans la partition encodée par le tableau parent.
- Calculer les représentants
p etq des deux groupes contenanti etj respectivement. - Faire parent [p] = q.
.jpg)

[ [ 15, 8, 1, 9, 11, 13, 14 ],
[ 4, 3, 2, 12],
[ 7, 5, 6, 0],
[ 10 ] ]
Partie III. Algorithme randomisé pour la coupe minimum
Entrée : un réseau social à
- Créer une partition
P enn singletons de[ [n] ] - Initialement aucun lien d'amitié n'est marqué
- Tant que la partition
P contient au moins trois groupes et qu'il reste des liens d'amitié non-marqués dans le réseau faire :
(a) Choisir un lien uniformément au hasard parmi les liens non-marqués du réseau, notons-le[i, j] .
(b) Si i et j n'appartiennent pas au même groupe dans la partitionP , fusionner les deux groupes correspondants
(c) Marquer le lien[i, j] . - Si
P contientk ⩾ 3 groupes, fairek − 1 fusions pour obtenir deux groupes. - Renvoyer la partition
P .

B - Programmation SQL
| id | nom | prenom |
| 1 | Potter | Harry |
| 2 | Granger | Hermione |
|
|
|
|
| id1 | id2 |
| 1 | 2 |
| 2 | 1 |
|
|
|
- id (clé primaire), un entier identifiant chaque individu;
- nom, une chaîne de caractères donnant le nom de famille de l'individu;
- prenom, une chaîne de caractères donnant le prénom de l'individu.
- id1, entier identifiant le premier individu du lien d'amitié;
- id2, entier identifiant le second individu du lien d'amitié.
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune X-ENS MP PC 2016 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune X-ENS MP PC 2016 ?
Sur les réseaux sociaux : manipulation d'un réseau en Python, partitions avec tableau parent, algorithme randomisé de coupe minimum, puis requêtes SQL sur des tables d'individus et de liens.
Quelles erreurs le jury a-t-il le plus relevées en informatique X-ENS 2016 ?
Des complexités mal exprimées, l'initialisation fautive d'une liste de listes avec [[]]*n, un mauvais usage de append, une compression de chemin incomplète et des requêtes SQL trop compliquées.
Quelles notions réviser pour l'informatique commune Polytechnique MP PC 2016 ?
Les listes Python, l'analyse de complexité, les structures de partition de type union-find et les requêtes SQL avec jointure.
Comment le code est-il noté à l'épreuve d'informatique X-ENS ?
Selon le rapport, le jury évalue la justesse du code, son efficacité, sa lisibilité et la précision de l'implémentation. Les commentaires aident sans être indispensables.
Pas de description pour le moment
