Tables de hachage
Progression
#Tables de hachage
Fonctions de hachage, collisions, sondage/chaînage, et complexités moyennes/pires cas.
Objectifs d’apprentissage
- Comprendre clé → hash → bucket, facteur de charge et redimensionnement.
- Comparer chaînage (separate chaining) vs adressage ouvert (linear/quadratic probing, double hashing).
- Identifier les cas pathologiques et choisir de bons hachages.
#Animation interactive
Voici une animation qui illustre le fonctionnement d'une table de hachage avec gestion des collisions par adressage ouvert :
#Exemple (Python — dictionnaires)
#Exercice : Implémentation d'une table de hachage
Implémentez une table de hachage simple en Python avec gestion des collisions par chaînage.
#Instructions
- Créez une classe
HashTable
avec une taille fixe. - Implémentez une fonction de hachage simple (par exemple, modulo la taille de la table).
- Utilisez des listes pour gérer les collisions (chaînage).
- Implémentez les méthodes
put(key, value)
,get(key)
etremove(key)
.
#Exemple de code
1class HashTable:2 def __init__(self, size=10):3 self.size = size4 self.table = [[] for _ in range(size)]5 6 def _hash(self, key):7 return hash(key) % self.size8 9 def put(self, key, value):10 index = self._hash(key)11 bucket = self.table[index]12 13 # Vérifier si la clé existe déjà14 for i, (k, v) in enumerate(bucket):
Inévitables quand l’espace de clés est plus grand que la table; gérées par chaînage (listes) ou sondage (open addressing).
α = n / m (éléments / buckets). Maintenir α dans une plage (ex: ≤ 0.75) et redimensionner ×2 pour conserver O(1) amorti.
Une mauvaise fonction de hachage peut concentrer les clés et dégrader les performances, voire exposer à des attaques par collisions. Utilisez des fonctions solides et, côté serveur, défendez‑vous contre des données hostiles.
#Filtres de Bloom (approximation)
Un filtre de Bloom répond « possiblement présent » ou « certainement absent ». Paramètres: m bits, n éléments, k fonctions de hachage. Le taux de faux positifs ≈ (1 - e^{-kn/m})^k
; pour un α donné, on choisit k ≈ (m/n) ln 2
.
Fronts de cache, pré‑filtrage d’URL/spam, joints à large échelle. Complétez par un store exact pour les hits.
#Pièges fréquents
Une mauvaise fonction de hachage concentre les clés et dégrade les performances vers O(n). En adressage ouvert, les suppressions nécessitent un marqueur « tombstone » pour conserver la propriété de recherche; sans lui, des éléments deviennent inaccessibles. Des clés mutables modifiées après insertion provoquent des incohérences; préférez des clés immuables. En contexte hostile (serveur), la résistance aux attaques par collisions compte autant que la vitesse moyenne; l’aléa dans le hachage ou des choix de fonctions plus robustes rendent le comportement moins prédictible pour un attaquant.