Les cartes de hachage sont des structures de données indexées. Une carte de hachage utilise un fonction de hachage pour calculer un index avec une clé dans un tableau de compartiments ou d'emplacements. Sa valeur est mappée au compartiment avec l'index correspondant. La clé est unique et immuable. Considérez une carte de hachage comme une armoire comportant des tiroirs avec des étiquettes pour les éléments qui y sont stockés. Par exemple, stocker les informations utilisateur - considérez l'e-mail comme clé, et nous pouvons mapper les valeurs correspondant à cet utilisateur, telles que le prénom, le nom, etc., à un compartiment.
La fonction de hachage est au cœur de la mise en œuvre d'une carte de hachage. Il récupère la clé et la traduit en index d'un bucket dans la liste des buckets. Le hachage idéal devrait produire un index différent pour chaque clé. Toutefois, des collisions peuvent survenir. Lorsque le hachage donne un index existant, nous pouvons simplement utiliser un compartiment pour plusieurs valeurs en ajoutant une liste ou en rehachant.
En Python, les dictionnaires sont des exemples de cartes de hachage. Nous verrons l'implémentation de hash map à partir de zéro afin d'apprendre comment créer et personnaliser de telles structures de données pour optimiser la recherche.
La conception de la carte de hachage comprendra les fonctions suivantes :
- set_val(clé, valeur) : Insère une paire clé-valeur dans la carte de hachage. Si la valeur existe déjà dans la carte de hachage, mettez à jour la valeur.
- get_val(clé): Renvoie la valeur à laquelle la clé spécifiée est mappée, ou Aucun enregistrement trouvé si cette carte ne contient aucun mappage pour la clé.
- delete_val(clé): Supprime le mappage pour la clé spécifique si la carte de hachage contient le mappage pour la clé.
Ci-dessous la mise en œuvre.
Python3
dactylographié pour chaque
class> HashTable:> ># Create empty bucket list of given size> >def> __init__(>self>, size):> >self>.size>=> size> >self>.hash_table>=> self>.create_buckets()> >def> create_buckets(>self>):> >return> [[]>for> _>in> range>(>self>.size)]> ># Insert values into hash map> >def> set_val(>self>, key, val):> > ># Get the index from the key> ># using hash function> >hashed_key>=> hash>(key)>%> self>.size> > ># Get the bucket corresponding to index> >bucket>=> self>.hash_table[hashed_key]> >found_key>=> False> >for> index, record>in> enumerate>(bucket):> >record_key, record_val>=> record> > ># check if the bucket has same key as> ># the key to be inserted> >if> record_key>=>=> key:> >found_key>=> True> >break> ># If the bucket has same key as the key to be inserted,> ># Update the key value> ># Otherwise append the new key-value pair to the bucket> >if> found_key:> >bucket[index]>=> (key, val)> >else>:> >bucket.append((key, val))> ># Return searched value with specific key> >def> get_val(>self>, key):> > ># Get the index from the key using> ># hash function> >hashed_key>=> hash>(key)>%> self>.size> > ># Get the bucket corresponding to index> >bucket>=> self>.hash_table[hashed_key]> >found_key>=> False> >for> index, record>in> enumerate>(bucket):> >record_key, record_val>=> record> > ># check if the bucket has same key as> ># the key being searched> >if> record_key>=>=> key:> >found_key>=> True> >break> ># If the bucket has same key as the key being searched,> ># Return the value found> ># Otherwise indicate there was no record found> >if> found_key:> >return> record_val> >else>:> >return> 'No record found'> ># Remove a value with specific key> >def> delete_val(>self>, key):> > ># Get the index from the key using> ># hash function> >hashed_key>=> hash>(key)>%> self>.size> > ># Get the bucket corresponding to index> >bucket>=> self>.hash_table[hashed_key]> >found_key>=> False> >for> index, record>in> enumerate>(bucket):> >record_key, record_val>=> record> > ># check if the bucket has same key as> ># the key to be deleted> >if> record_key>=>=> key:> >found_key>=> True> >break> >if> found_key:> >bucket.pop(index)> >return> ># To print the items of hash map> >def> __str__(>self>):> >return> ''.join(>str>(item)>for> item>in> self>.hash_table)> hash_table>=> HashTable(>50>)> # insert some values> hash_table.set_val(>'[email protected]'>,>'some value'>)> print>(hash_table)> print>()> hash_table.set_val(>'[email protected]'>,>'some other value'>)> print>(hash_table)> print>()> # search/access a record with key> print>(hash_table.get_val(>'[email protected]'>))> print>()> # delete or remove a value> hash_table.delete_val(>'[email protected]'>)> print>(hash_table)> |
>
quel âge a Kylie Jenner
>
Sortir:
tri en tas

Complexité temporelle :
L'accès à l'index mémoire prend un temps constant et le hachage prend un temps constant. Par conséquent, la complexité de recherche d’une carte de hachage est également en temps constant, c’est-à-dire O(1).
Avantages des HashMaps
● Accès rapide à la mémoire aléatoire grâce aux fonctions de hachage
● Peut utiliser des valeurs négatives et non intégrales pour accéder aux valeurs.
● Les clés peuvent être stockées dans un ordre trié et peuvent donc parcourir facilement les cartes.
Inconvénients des HashMaps
● Les collisions peuvent entraîner des pénalités importantes et rendre la complexité temporelle linéaire.
liste de tableaux java
● Lorsque le nombre de clés est important, une seule fonction de hachage provoque souvent des collisions.
Applications des HashMaps
● Ceux-ci ont des applications dans les implémentations de Cache où les emplacements mémoire sont mappés sur de petits ensembles.
● Ils sont utilisés pour indexer les tuples dans les systèmes de gestion de bases de données.
● Ils sont également utilisés dans des algorithmes comme la correspondance de modèles Rabin Karp