Optimisation au concours V2 : Informatique MPI/MPI*
🎯 Objectif & Analyse des tendances des Concours
Section titled “🎯 Objectif & Analyse des tendances des Concours”En tant que président de jury et concepteur de sujets pour les concours scientifiques (filière MPI/MPI*), je constate une exigence accrue de rigueur formelle, tant dans la maîtrise des structures de données avancées et de la théorie de la complexité que dans la manipulation formelle des langages et des bases de données.
Les épreuves écrites (X-ENS, Mines-Ponts, Centrale-Supélec, CCINP) ne cherchent plus seulement à évaluer une intuition algorithmique ou l’écriture superficielle de code, mais exigent :
- Des preuves de correction rigoureuses (invariants de boucle, récurrence bien fondée, arguments de monotonicité).
- Une maîtrise absolue des complexités temporelles et spatiales (en pire cas, en moyenne, avec ou sans amortissement).
- Une syntaxe et une sémantique irréprochables (qu’il s’agisse de code OCaml, de requêtes SQL ou de raisonnements mathématiques sur les automates et langages).
Ce guide “OPTIMISATION AU CONCOURS - QUESTIONS RECURRENTES V2” a pour but de vous transposer directement dans la tête du correcteur. Pour chaque grande thématique récurrente en informatique MPI, vous trouverez l’intitulé type, la méthode canonique attendue au tableau ou sur copie, une rédaction modèle notée , ainsi que les pièges éliminatoires relevés par les rapports de jury.
📌 Question Type 1 : Algorithme de Bellman-Ford : détection de cycles de poids négatif et preuve de correction
Section titled “📌 Question Type 1 : Algorithme de Bellman-Ford : détection de cycles de poids négatif et preuve de correction”💡 Méthode canonique & Étapes de rédaction
Section titled “💡 Méthode canonique & Étapes de rédaction”L’algorithme de Bellman-Ford permet de calculer les plus courts chemins depuis un sommet source unique dans un graphe orienté dont les poids des arêtes peuvent être négatifs, tout en détectant la présence éventuelle de cycles absorbants (de poids total strictement négatif).
Pour répondre aux attentes d’un jury de concours, la rédaction doit suivre rigoureusement ces étapes :
- Définition de l’invariant : Poser clairement que, à l’étape , les distances stockées représentent le plus court chemin de la source vers chaque sommet en utilisant au plus arêtes.
- Phase de relaxation : Répéter fois la mise à jour des distances pour toutes les arêtes de poids :
- Détection de cycle négatif : Effectuer une -ième relaxation. S’il existe encore une arête telle que , alors il existe un cycle de poids négatif accessible depuis la source.
- Justification de la complexité : Établir clairement que la complexité temporelle est en et la complexité spatiale en .
📋 Exemple de sujet & Rédaction modèle type Concours
Section titled “📋 Exemple de sujet & Rédaction modèle type Concours”Énoncé type : Étant donné un graphe orienté valué par une fonction et un sommet source , proposer une fonction implémentant l’algorithme de Bellman-Ford en OCaml ou en Python, capable de renvoyer le tableau des distances minimales ou de lever une exception en présence d’un cycle de poids négatif.
Rédaction modèle (Barème /20) :
-
Analyse et Initialisation (4/20) : On initialise un tableau de distances
dde taille tel que et pour tout . -
Code source en Python rigoureux (8/20) :
def bellman_ford(vertices, edges, source): # vertices: liste des sommets [0..V-1] # edges: liste de tuples (u, v, w) V = len(vertices) d = {v: float('inf') for v in vertices} d[source] = 0
# Phase 1 : V-1 relaxations for _ in range(V - 1): modified = False for u, v, w in edges: if d[u] + w < d[v]: d[v] = d[u] + w modified = True # Optimisation facultative mais appréciée : arrêt précoce if not modified: break
# Phase 2 : Détection de cycle de poids négatif for u, v, w in edges: if d[u] + w < d[v]: raise ValueError("Presence d'un cycle de poids negatif")
return d- Justification théorique et Preuve de correction (8/20) :
- Invariant de boucle : Après iterations de la boucle principale, pour tout sommet , est inférieur ou égal au poids du plus court chemin de à comportant au plus arêtes.
- Terminaison : La boucle principale tourne au plus fois, chaque itération parcourant l’ensemble des arêtes. La complexité temporelle est donc de .
- Détection : S’il existe une modification possible à la -ième étape, cela contredit le fait que tout plus court chemin simple comporte au plus arêtes, prouvant l’existence d’un cycle absorbant.
⚠️ Les pièges majeurs soulignés dans les rapports de jury
Section titled “⚠️ Les pièges majeurs soulignés dans les rapports de jury”- Oublier de propager l’infini : Écrire
d[u] + w < d[v]sans vérifier sid[u]est égal à peut générer des erreurs de dépassement ou des incohérences logiques (ex: ). Il faut s’assurer qued[u] != float('inf'). - Confondre Dijkstra et Bellman-Ford : Appliquer une approche gloutonne de type file de priorité sur des poids négatifs mène à une catastrophe algorithmique. Le jury sanctionne lourdement cette confusion.
- Négliger la structure des données : Fournir une complexité en sur un graphe implicite ou mal représenté au lieu de parcourir explicitement la liste des arêtes.
📌 Question Type 2 : Application du Lemme de l’étoile (Pumping Lemma) pour prouver qu’un langage n’est pas rationnel
Section titled “📌 Question Type 2 : Application du Lemme de l’étoile (Pumping Lemma) pour prouver qu’un langage n’est pas rationnel”💡 Méthode canonique & Étapes de rédaction
Section titled “💡 Méthode canonique & Étapes de rédaction”Le lemme de l’étoile est l’outil fondamental par l’absurde pour démontrer qu’un langage n’est pas reconnaissable par un automate fini (donc non rationnel). La structure de la preuve suit toujours un raisonnement par l’absurde basé sur un jeu de rôles contre un adversaire (le démon).
Les étapes canoniques de rédaction sont :
- Supposons par l’absurde que le langage est rationnel.
- D’après le lemme de l’étoile, il existe une constante de pumping associée à .
- Choisir un mot astucieusement tel que (ce choix dépend généralement de et doit être paramétré par ce dernier).
- Décomposer le mot en respectant les contraintes du lemme : et .
- Exhiber une contradiction en montrant qu’il existe un entier (souvent ou ) tel que le mot pompé .
- Conclure que n’est pas rationnel.
📋 Exemple de sujet & Rédaction modèle type Concours
Section titled “📋 Exemple de sujet & Rédaction modèle type Concours”Énoncé type : Soit l’alphabet . Démontrer que le langage n’est pas rationnel.
Rédaction modèle (Barème /20) :
-
Hypothèse par l’absurde et invocation du lemme (4/20) : Supposons par l’absurde que le langage soit rationnel. D’après le lemme de l’étoile (Pumping Lemma), il existe un entier (la constante de pumping) tel que tout mot de longueur w = xyz$ avec les trois conditions suivantes :
- Pour tout entier , le mot .
-
Choix judicieux du mot (6/20) : Considérons le mot . Il est évident que et que sa longueur . Les conditions d’application du lemme sont donc vérifiées.
-
Exploitation de la contrainte (5/20) : Puisque la condition est impérative et que le préfixe de est constitué exclusivement de de la lettre , le sous-mot (de longueur ) ne contient que des lettres . Posons donc avec . Par conséquent, et sont tels que .
-
Mise en évidence de la contradiction (5/20) : Appliquons le lemme pour . Le mot pompé devient : Puisque , on a . Le nombre de lettres est donc strictement inférieur au nombre de lettres (). Par conséquent, le mot , ce qui contredit directement le lemme de l’étoile.
Conclusion: Le langage n’est donc pas rationnel.
⚠️ Les pièges majeurs soulignés dans les rapports de jury
Section titled “⚠️ Les pièges majeurs soulignés dans les rapports de jury”- Inversion des quantificateurs dans le choix de : Laisser l’adversaire (le jury ou le lemme) choisir , et c’est vous qui devez construire en fonction de . Choisir un fixe (ex: ) rend la démonstration fausse car le lemme doit valoir pour tout .
- Oublier la contrainte : C’est l’erreur la plus fréquente. Les étudiants choisissent mais oublient que doit se trouver entièrement dans la première moitié (les ). Si était à cheval sur les et les , le pompage pourrait préserver l’égalité par compensation, ce qui bloquerait la contradiction.
- Absence de rigueur sur l’appartenance : Ne pas expliciter clairement pourquoi le mot pompé ne respecte plus la condition d’appartenance au langage.
📌 Question Type 3 : Requêtes SQL avancées : sous-requêtes corrélées, auto-jointures et expressions de table communes (CTE avec WITH)
Section titled “📌 Question Type 3 : Requêtes SQL avancées : sous-requêtes corrélées, auto-jointures et expressions de table communes (CTE avec WITH)”💡 Méthode canonique & Étapes de rédaction
Section titled “💡 Méthode canonique & Étapes de rédaction”Les bases de données relationnelles et le langage SQL font l’objet d’attentes rigoureuses aux concours, notamment pour manipuler des données complexes sans redondance excessive. Face à une question de requêtage avancé :
- Analyser le schéma relationnel : Identifier les clés primaires (PK) et les clés étrangères (FK), ainsi que les types de cardinalités (1-N, N-N).
- Choisir la bonne stratégie :
- Auto-jointure (Self-Join) : Pour comparer des lignes d’une même table entre elles (ex: hiérarchies, comparaisons temporelles).
- Sous-requête corrélée : Lorsque le calcul d’une ligne dépend des valeurs d’autres lignes de la même table (souvent évaluée ligne par ligne).
- CTE (
WITH ... AS) : Indispensable pour la lisibilité, la modularité et pour éviter l’imbrication excessive de sous-requêtes (notamment lors de calculs d’agrégats successifs ou de fenêtrage).
- Traiter les cas limites (valeurs NULL, doublons) : Utiliser
DISTINCT,GROUP BYavecHAVING, ou des clauses de gestion des valeurs nulles si nécessaire.
📋 Exemple de sujet & Rédaction modèle type Concours
Section titled “📋 Exemple de sujet & Rédaction modèle type Concours”Énoncé type : On considère le schéma relationnel suivant :
Employe (id_emp, nom, salaire, id_dept, id_manager)Departement (id_dept, nom_dept, budget)- Écrire une requête SQL optimisée utilisant une expression de table commune (CTE) pour afficher les noms des employés dont le salaire est strictement supérieur au salaire moyen de leur propre département.
Rédaction modèle (Barème /20) :
-
Analyse de la structure et choix de la CTE (5/20) : Pour comparer le salaire d’un employé à la moyenne de son département, nous devons d’abord calculer, pour chaque département, son salaire moyen. Une Expression de Table Commune (
WITH) est idéale pour isoler cette vue agrégée intermédiaire. -
Rédaction de la requête SQL (10/20) :
WITH SalaireMoyenDept AS ( SELECT id_dept, AVG(salaire) AS moyenne_dept FROM Employe GROUP BY id_dept)SELECT e.nomFROM Employe eJOIN SalaireMoyenDept s ON e.id_dept = s.id_deptWHERE e.salaire > s.moyenne_dept;- Justification de l’optimisation et robustesse (5/20) :
- Performance : L’utilisation d’une CTE évite d’évaluer une sous-requête corrélée à chaque itération pour chaque ligne de la table
Employe, ce qui réduirait les performances en . Ici, l’agrégation est calculée en une seule passe (), puis jointe efficacement via l’index implicite surid_dept. - Gestion des NULL : La jointure interne (
JOIN) exclut automatiquement les employés n’ayant pas de département (id_dept IS NULL), ce qui est cohérent puisque le salaire moyen d’un département inexistant n’est pas définissable dans ce contexte.
- Performance : L’utilisation d’une CTE évite d’évaluer une sous-requête corrélée à chaque itération pour chaque ligne de la table
⚠️ Les pièges majeurs soulignés dans les rapports de jury
Section titled “⚠️ Les pièges majeurs soulignés dans les rapports de jury”- Utilisation abusive de sous-requêtes corrélées non optimisées : Écrire des requêtes avec des
INou des comparaisons scalaires répétées qui s’avèrent désastreuses en termes de complexité pour de grands volumes de données. - Mauvaise maîtrise de la clause
GROUP BY: Oublier d’inclure dans leGROUP BYtoutes les colonnes non agrégées sélectionnées dans leSELECT(erreur de syntaxe directe sanctionnée par les moteurs SQL et les jurys). - Confusion entre
WHEREetHAVING: Filtrer des fonctions d’agrégation (commeAVG()ouSUM()) dans la clauseWHEREau lieu de la clauseHAVING.