Corrigé Centrale 2026 Option informatique MP — Partie B, I.3-I.4 (Q16 à Q27) : File à deux piles et bicoloration par parcours
Sujet officiel du concours Centrale, session 2026, épreuve Option informatique MP. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
Les modules Queue et Stack sont interdits. On réalise une file (d'attente) avec deux piles, représentées par des listes :
type 'a pile = 'a list
type 'a file = { entree : 'a pile ; sortie : 'a pile }
On ajoute un élément en l'empilant sur entree. Pour sortir un élément : si sortie est vide, on dépile un à un tous les éléments de entree en les empilant sur sortie ; puis on dépile et renvoie le sommet de sortie. Les types graphe et col sont ceux des questions précédentes.
Q16. En quoi la liste OCaml est-elle une bonne implémentation de pile ?
Q17. Écrire initFile : unit -> 'a file, estVideFile : 'a file -> bool, enfile : 'a * 'a file -> 'a file et defile : 'a file -> 'a * 'a file.
Q18. Montrer que les éléments sortent dans leur ordre d'entrée.
Q19. Complexité dans le pire cas de defile.
Q20. Encadrer le nombre d'opérations empile et dépile subies par un élément qui transite par la file.
Q21. En déduire un encadrement du nombre de ces opérations pour opérations enfile ou defile à partir d'une file vide ; complexité amortie.
Q22. Écrire bicol : graphe -> bool * col, qui décide par un parcours en largeur si un graphe (supposé connexe) est 2-colorable et renvoie le cas échéant une bicoloration valide.
Q23. Terminaison de bicol.
Q24. Complexité temporelle de bicol.
Q25. Correction de bicol.
Q26. Adapter bicol à un graphe non connexe.
Q27. Réaliser bicol par un parcours en profondeur.
Corrigé
Q16. Une pile n'a besoin que de trois opérations : tester si elle est vide, empiler au sommet, dépiler le sommet. Avec une liste dont la tête est le sommet, empiler est x :: p, dépiler est le filtrage x :: r, tester le vide est p = [] : les trois opérations coûtent , car elles n'agissent que sur la première cellule. De plus la liste est persistante : empiler ou dépiler ne détruit pas l'ancienne pile, qui reste utilisable (c'est ce qui permet aux fonctions de Q17 de renvoyer une nouvelle file). La discipline « dernier entré, premier sorti » est exactement celle de l'accès par la tête.
Q17. La fonction auxiliaire transvase dépile un à un les éléments de e et les empile sur s.
let initFile () : 'a file = { entree = [] ; sortie = [] }
let estVideFile (f : 'a file) : bool = f.entree = [] && f.sortie = []
let enfile ((x, f) : 'a * 'a file) : 'a file = { f with entree = x :: f.entree }
let rec transvase (e : 'a pile) (s : 'a pile) : 'a pile =
match e with
| [] -> s
| x :: r -> transvase r (x :: s)
let rec defile (f : 'a file) : 'a * 'a file =
match f.sortie, f.entree with
| x :: r, _ -> (x, { f with sortie = r })
| [], [] -> failwith "defile : file vide"
| [], e -> defile { entree = [] ; sortie = transvase e [] }
transvase termine car la longueur de e décroît ; elle renvoie List.rev e @ s (récurrence sur la longueur de e). Dans defile, l'appel récursif se fait avec une sortie non vide, donc il se termine au cas suivant. Défiler une file vide lève une exception (cas non spécifié par le sujet).
Q18. Pour une file , notons la liste . Montrons l'invariant : est la liste des éléments présents, rangés du plus ancien entré au plus récent. Il est vrai pour initFile () (liste vide) et il est conservé :
enfile (x, f)donne : , le plus récent, est ajouté à la fin ;- le transvasement de en ne change pas (les deux valent ) ;
- si
sortievaut ,defilerenvoie , qui est la tête de , c'est-à-dire l'élément le plus ancien, et la nouvelle file a pour contenu , la queue de .
Chaque defile renvoie donc le plus ancien des éléments présents : les éléments sortent dans l'ordre où ils sont entrés. (Test : opérations aléatoires, puis vidage : la suite des sorties est égale à la suite des entrées.)
Q19. Si sortie est vide et entree contient éléments, defile fait dépilements et empilements (transvasement), plus un dépilement : opérations, soit . Pour une file de éléments, le pire cas est donc linéaire, (par exemple après enfile consécutifs sur une file vide). Dans les autres cas, defile coûte .
100 % gratuit
La suite du corrigé est sur Adloun
Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.
Voir le corrigé complet, gratuitementInscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.