Menu
Coddy logo textTech

Hash Map

Dernière mise à jour

Une hash map stocke des paires clé-valeur et permet de rechercher une valeur par sa clé en O(1) en moyenne. Elle fonctionne exactement comme une table de hachage, mais chaque entrée de seau porte à la fois une clé et sa valeur associée. Pour stocker ou récupérer une paire, la clé est hachée vers un indice de seau, puis la chaîne de ce seau est parcourue à la recherche de la clé correspondante. Appuyez sur lecture ci-dessus pour voir les paires placées par seau haché et une valeur récupérée par sa clé.

C'est la structure derrière le dict de Python, le HashMap de Java et le Map/objets de JavaScript. Les collisions sont gérées de la même manière que dans une table de hachage - ici, par chaînage séparé - donc les performances dépendent d'une bonne fonction de hachage et d'un faible facteur de charge.

Complexité temporelle

OpérationMoyennePire cas
Insérer/mettre à jour (put)O(1)O(n)
Rechercher (get)O(1)O(n)
SupprimerO(1)O(n)
EspaceO(n)O(n)

La hash map dans les langages courants

LangageType
Pythondict
JavaHashMap
JavaScriptMap / objet
C++std::unordered_map
Gomap

Exemple résolu

Insertion des paires ("cat", 3), ("dog", 5), ("cat", 9), ("emu", 7) dans une map de 8 seaux, en utilisant hash(key) % 8. On suppose hash("cat") % 8 = 2, hash("dog") % 8 = 5, hash("emu") % 8 = 2 :

ÉtapeStructureAction
Put ("cat", 3)seau 2 : [("cat", 3)]Hachée vers le seau 2 ; chaîne vide, donc la paire est ajoutée.
Put ("dog", 5)seau 2 : [("cat", 3)], seau 5 : [("dog", 5)]Hachée vers le seau 5 ; chaîne vide, donc la paire est ajoutée.
Put ("cat", 9)seau 2 : [("cat", 9)], seau 5 : [("dog", 5)]Hachée vers le seau 2 ; la clé "cat" est déjà dans la chaîne, donc sa valeur est mise à jour à 9.
Put ("emu", 7)seau 2 : [("cat", 9), ("emu", 7)], seau 5 : [("dog", 5)]Hachée vers le seau 2 ; entre en collision avec "cat", la clé est introuvable, donc la paire est ajoutée.
Get "emu"seau 2 : [("cat", 9), ("emu", 7)]Hachée vers le seau 2 ; la chaîne est parcourue, "cat" est ignorée, "emu" correspond, 7 est renvoyé.

Quand utiliser une hash map

À utiliser quandÀ éviter quand
Vous avez besoin d'une recherche, insertion et suppression en O(1) moyen par clé exacte.Vous devez garder les clés triées ou faire des requêtes par plage - utilisez un BST équilibré ou une map triée.
Les clés sont hachables et l'égalité est bien définie (chaînes, entiers, tuples).Les clés sont mutables et peuvent changer après insertion, ce qui corrompt leur seau.
Vous comptez, dédupliquez, mettez en cache ou indexez par un identifiant.Vous avez besoin de garanties de pire cas O(log n) plutôt que de bornes moyennes amorties.
L'ordre d'itération n'a pas d'importance, ou une map ordonnée par insertion suffit.La mémoire est très limitée - les seaux, la marge du facteur de charge et les pointeurs ajoutent du surcoût.

Code de Hash Map

Une implémentation propre et exécutable de Hash Map en Python, JavaScript, Java, C++, C. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Hash Map en Python

Python
1# Python's built-in dict is a hash map: O(1) average2# insert, lookup, and delete.3inventory = {"apple": 3, "banana": 7}4
5# Insert and update6inventory["cherry"] = 57inventory["apple"] += 28
9# Lookup, with .get for a safe default on missing keys10print("apple: ", inventory["apple"])11print("mango: ", inventory.get("mango", 0))12
13# Membership test and delete14print("banana in stock:", "banana" in inventory)15del inventory["banana"]16print("banana in stock:", "banana" in inventory)17
18# Iterate over key-value pairs19for fruit, count in sorted(inventory.items()):20    print(f"{fruit}: {count}")21
22# Classic hash map use case: counting frequencies23words = "the quick brown fox jumps over the lazy dog the end".split()24freq = {}25for word in words:26    freq[word] = freq.get(word, 0) + 127
28print("Occurrences of the:", freq["the"])29print("Most common word:  ", max(freq, key=freq.get))
Exécutez ce code dans le Playground Python

FAQ sur la hash map

Quelle est la différence entre une hash map et une table de hachage ?
Ce sont essentiellement la même structure - un tableau de seaux adressés par un hachage de la clé. Dans l'usage courant, "table de hachage" désigne souvent un ensemble de clés ou la technique générale, tandis que "hash map" met l'accent sur le stockage de paires clé-valeur. Certains langages font aussi une distinction de sécurité des threads (par exemple Hashtable vs HashMap en Java), mais l'algorithme de base est identique.
Quelle est la complexité temporelle d'une hash map ?
Put, get et delete sont en O(1) en moyenne avec une bonne fonction de hachage et un faible facteur de charge. Dans le cas pathologique où toutes les clés entrent en collision dans un seul seau, ils dégénèrent en O(n), c'est pourquoi le redimensionnement et un bon hachage sont importants.
Comment une hash map gère-t-elle deux clés qui se hachent vers le même seau ?
Elle résout la collision. Cette visualisation utilise le chaînage séparé : chaque seau contient une petite liste, et une nouvelle paire dont la clé s'y hache est ajoutée à cette liste. Lors de la recherche, la map parcourt la courte chaîne à la recherche de la clé correspondante. La technique alternative est l'adressage ouvert, qui sonde un autre emplacement du tableau.
Hash map ou arbre binaire de recherche : lequel choisir ?
Utilisez une hash map lorsque vous n'avez besoin que d'une recherche par clé exacte et que vous voulez des opérations en O(1) moyen. Utilisez un arbre binaire de recherche équilibré (comme TreeMap ou std::map) lorsque vous avez besoin de clés triées, de requêtes par plage ou de recherches de prédécesseur/successeur, qui coûtent O(log n). Le BST échange un peu de vitesse contre des garanties d'ordre qu'une hash map ne peut pas offrir.
Qu'est-ce que le facteur de charge et pourquoi déclenche-t-il le redimensionnement ?
Le facteur de charge est le rapport entre les entrées stockées et les seaux. À mesure qu'il augmente, les chaînes s'allongent et les recherches moyennes ralentissent, donc la plupart des implémentations se redimensionnent (typiquement en doublant les seaux et en re-hachant tout) une fois qu'il dépasse un seuil comme 0.75. Le redimensionnement est en O(n) mais rare, donc il est amorti et maintient les opérations moyennes en O(1).
Puis-je utiliser un objet mutable comme une liste comme clé de hash map ?
Généralement non. Les clés doivent être hachables et leur hachage doit rester constant tant qu'elles sont dans la map - Python lève TypeError: unhashable type pour une list, par exemple. Si vous mutez une clé après l'avoir insérée, son hachage change et la map ne peut plus la trouver dans le bon seau, perdant silencieusement l'entrée. Utilisez des clés immuables comme des chaînes, des nombres ou des tuples.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER