Adloun

Corrigé Centrale 2025 Informatique MPI — Partie A, III (Q12 à Q16) : Table de hachage à adressage ouvert

Sujet officiel du concours Centrale, session 2025, épreuve Informatique MPI. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Un ensemble d'états (de type etat *) est rangé dans une table de hachage en adressage ouvert. Pour un état ,

où vaut si la case est libre, si elle porte un véhicule horizontal, un véhicule vertical. On dispose de plateau *p_hash(etat *e), qui renvoie le plateau des .
Q12. int64_t e_hash(etat *e) renvoie .
Q13. Si et sont accessibles depuis un même état initial et , alors .

La table a une capacité et une taille (nombre d'états) ; on range dans la première case vide à partir de , en avançant circulairement. Insertions successives de , de hachés , dans une table vide de capacité :

Trop peuplée, la table double sa capacité et réinsère ses éléments.


struct tableh_s {
    etat **tab;
    int taille;
    int capacite;
};
typedef struct tableh_s tableh;

Les cases vides valent NULL. On dispose de tableh *t_nouveau(void) (table vide de capacité ), de void t_libere(tableh *t) (qui libère aussi les états contenus) et de void t_augmente_capacite(tableh *t) (capacité portée à ).
Q14. bool t_contient(tableh *t, etat *e).
Q15. void t_ajoute(tableh *t, etat *e), en maintenant ( taille, capacité).
Q16. Pourquoi serait-ce une mauvaise idée de remplacer par ?

Corrigé

Le code a été compilé et exécuté avec celui des parties I et II (une implémentation de p_hash, t_nouveau, t_libere et t_augmente_capacite complète le programme de test) ; les propriétés de Q13 et Q16 ont été vérifiées en Python sur les états accessibles depuis la configuration de la figure 1.

Q12. On évalue le polynôme en par la méthode de Horner, en partant du terme de plus haut degré .


int64_t e_hash(etat *e) {
    plateau *p = p_hash(e);
    int64_t h = 0;
    for (int i = M - 1; i >= 0; i--)
        for (int j = M - 1; j >= 0; j--)
            h = 3 * h + p->tab[i][j];
    free(p);
    return h;
}

Invariant : après le traitement de la case d'indice linéaire , ; à la fin (), . Pas de dépassement : , bien en dessous de , et c'est aussi vrai de toutes les valeurs intermédiaires. Le plateau renvoyé par p_hash est alloué sur le tas : il faut le libérer, sinon chaque calcul de haché perd octets. Coût .

Q13. Le haché détermine les . Les sont les chiffres de en base (), et l'écriture en base est unique : entraîne pour toutes les cases.

Ce que les déplacements conservent. Un déplacement valide fait glisser un véhicule le long de sa ligne (horizontal) ou de sa colonne (vertical), à travers des cases libres — c'est la règle du jeu rappelée en tête du sujet, les véhicules « bloquent » ceux qu'ils précèdent, et c'est ce que calcule e_deplacements ; on l'énonce explicitement, car la preuve en dépend : il ne change ni , ni l'indice, la longueur, la direction d'un véhicule, ni la ligne d'un véhicule horizontal, ni la colonne d'un véhicule vertical. Il ne change pas non plus l'ordre de deux véhicules horizontaux d'une même ligne : pour que , à gauche de , passe à sa droite, il devrait glisser à travers les cases de , qui ne sont pas libres. De même pour deux véhicules verticaux d'une même colonne. Par récurrence sur le nombre de coups, tout état accessible depuis a donc, ligne par ligne, les mêmes véhicules horizontaux, dans le même ordre, que , et, colonne par colonne, les mêmes véhicules verticaux dans le même ordre.

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, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Toutes les parties de l'épreuve

Corrigé complet gratuit →