L'ensemble, dictionnaire sans valeurs
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 17 — Les dictionnaires dévoilés : le hachage
Énoncé
(a) Implémenter un ensemble de clés hachables en proposant les fonctions ens_creer(m), ens_ajouter(ensemble, cle) et ens_contient(ensemble, cle). Écrire à l'aide de cet ensemble la recherche du premier doublon d'une liste premiere_repetition(t). (b) Comparer et chronométrer l'exécution de cette fonction avec une implémentation basée sur une liste de déjà-vus pour éléments. (c) Discuter du lien structurel entre dictionnaire et ensemble.
Corrigé
(a)
def ens_creer(m: int) -> list:
return [[] for _ in range(m)]
def ens_ajouter(ensemble: list, cle) -> None:
alv = ensemble[hash(cle) % len(ensemble)]
if cle not in alv:
alv.append(cle)
def ens_contient(ensemble: list, cle) -> bool:
alv = ensemble[hash(cle) % len(ensemble)]
return cle in alv
def premiere_repetition(t: list):
# On crée un ensemble avec une taille suffisante pour éviter trop de collisions
vus = ens_creer(2 * len(t))
for x in t:
if ens_contient(vus, x):
return x
ens_ajouter(vus, x)
return None
(b) Pour une liste de taille sans doublons (pire cas) :
- La version avec liste de déjà-vus effectue environ comparaisons de clés, prenant plusieurs secondes.
- La version avec table de hachage effectue opérations, chacune s'exécutant dans une alvéole presque vide (longueur en moyenne). Le calcul se termine en quelques millisecondes, offrant un gain de performance d'un facteur 1000. (c) Un ensemble (
set) est équivalent à un dictionnaire (dict) dont on ignore les valeurs pour ne conserver que les clés. Il partage la même structure mémoire et les mêmes règles d'immuabilité pour ses éléments, permettant de réaliser des tests d'appartenance instantanés en échange d'un stockage mémoire supplémentaire.
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.