Adloun

Une mauvaise fonction de hachage, mesurée

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 12 — Tableaux associatifs, hachage et sérialisation

Énoncé

On propose trois fonctions de hachage pour des chaînes :


unsigned long h_somme(const char* s) {         /* somme des codes */
    unsigned long h = 0;
    for (int i = 0; s[i] != '\0'; i = i + 1) { h = h + (unsigned char) s[i]; }
    return h;
}
unsigned long h_poly(const char* s) {          /* polynomiale, base 31 */
    unsigned long h = 0;
    for (int i = 0; s[i] != '\0'; i = i + 1) { h = 31 * h + (unsigned char) s[i]; }
    return h;
}
unsigned long h_premier(const char* s) { return (unsigned char) s[0]; }

Prévoir laquelle est la meilleure, et pourquoi. Puis mesurer sur un vocabulaire réel.

Corrigé

La prévision. Une bonne fonction de hachage doit disperser : deux clés proches doivent donner des hachés éloignés, et l'image doit couvrir tout .

Les mesures, sur mots français distincts extraits de ce livre :

cases videschaîne maxcoût moyen d'une recherche
`h_somme` (18{,}1%)
`h_poly` (1{,}4%)
`h_premier` (97{,}6%)
`h_somme` (88{,}8%)
`h_poly` (58{,}9%)
`h_premier` (99{,}7%)

La dernière colonne est le nombre moyen de comparaisons d'une recherche fructueuse avec chaînage. Le repère est la valeur idéale , qui vaut pour et pour : h_poly l'atteint exactement, aux deux tailles.

Trois observations que la mesure seule donne.

Le programme dit que la construction d'une fonction de hachage « n'est pas exigible ». Ces chiffres disent pourquoi il faut tout de même savoir en juger une : le annoncé n'est pas une propriété de la structure, c'est une propriété de la fonction qu'on y a mise.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.