Corrigé Centrale 2025 Informatique MPI — Partie A, II (Q7 à Q11) : File circulaire et complexité amortie par la méthode du potentiel
Sujet officiel du concours Centrale, session 2025, épreuve Informatique MPI. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
Une file est rangée dans un tableau circulaire de capacité ; prochain est l'indice du prochain élément à sortir et la taille est le nombre d'éléments. Exemple de capacité et de taille , représentant la file ( sort le premier, est le dernier entré) :
struct file_s {
etat **tab;
int prochain;
int taille;
int capacite;
};
typedef struct file_s file;
Q7. file *f_nouveau(void) (taille et capacité nulles) et void f_libere(file *f), qui ne libère pas les états contenus.
Q8. void f_change_capacite(file *f, int c), pour une file de taille : la capacité devient .
Q9. void f_enfile(file *f, etat *e) et etat *f_defile(file *f) ; quand la taille égale la capacité, on double la capacité avant d'enfiler ( devient ).
Pour Q10 et Q11 seulement, le coût d'une opération est son nombre d'accès (lectures ou écritures) aux cases de tab. Potentiel : . Partant de la file vide de capacité nulle, opérations (enfiler ou défiler) donnent ; est le coût de .
Q10. Trouver un entier tel que pour tout .
Q11. En déduire , et conclure : coût amorti .
Corrigé
Le code a été compilé avec celui de la partie I et exécuté : vingt enfilages entrecoupés de défilages ressortent dans l'ordre d'entrée (y compris quand la file « fait le tour » du tableau pendant un redimensionnement), et un compteur d'accès à tab a été placé dans chaque fonction pour Q10 et Q11.
Q7. Une file de capacité nulle n'a pas de tableau : on met tab à NULL.
file *f_nouveau(void) {
file *f = malloc(sizeof(file));
assert(f != NULL);
f->tab = NULL;
f->prochain = 0;
f->taille = 0;
f->capacite = 0;
return f;
}
void f_libere(file *f) {
free(f->tab);
free(f);
}
f_libere rend le tableau de pointeurs puis la structure, dans cet ordre (après free(f), f->tab ne serait plus lisible) ; les états pointés ne sont pas touchés, comme demandé. free(NULL) ne fait rien, donc le cas de la capacité nulle est couvert. Coût .
Q8. Les éléments, du prochain à sortir au dernier entré, occupent les indices pour . On les recopie dans cet ordre au début du nouveau tableau, et prochain revient à .
void f_change_capacite(file *f, int c) {
assert(c >= f->taille);
etat **t = NULL;
if (c > 0) {
t = malloc(c * sizeof(etat *));
assert(t != NULL);
}
for (int k = 0; k < f->taille; k++)
t[k] = f->tab[(f->prochain + k) % f->capacite];
free(f->tab);
f->tab = t;
f->prochain = 0;
f->capacite = c;
}
Après l'appel, le -ième élément à sortir est en t[k], ce qui est la représentation d'une file de prochain ; la file représentée est inchangée. Le modulo n'est évalué que si , donc jamais avec une capacité nulle. La recopie fait lectures et écritures dans les tableaux : accès, coût hors allocation.
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é.