logo

Harta hash în Python

Hărțile hash sunt structuri de date indexate. O hartă hash folosește a funcția hash pentru a calcula un index cu o cheie într-o matrice de găleți sau sloturi. Valoarea sa este mapată la găleată cu indexul corespunzător. Cheia este unică și imuabilă. Gândiți-vă la o hartă hash ca la un dulap cu sertare cu etichete pentru lucrurile depozitate în ele. De exemplu, stocarea informațiilor despre utilizator - luați în considerare e-mailul ca cheie și putem mapa valorile corespunzătoare acelui utilizator, cum ar fi numele, numele etc., într-o găleată.

Java șir înlocuiește toate

Funcția hash este nucleul implementării unei hărți hash. Preia cheia și o traduce în indexul unei găleți din lista de găleți. Hashingul ideal ar trebui să producă un index diferit pentru fiecare cheie. Cu toate acestea, pot apărea coliziuni. Când hashingul oferă un index existent, putem folosi pur și simplu o găleată pentru mai multe valori, adăugând o listă sau rehashing.

În Python, dicționarele sunt exemple de hărți hash. Vom vedea implementarea hărții hash de la zero pentru a învăța cum să construim și să personalizam astfel de structuri de date pentru optimizarea căutării.



Designul hărții hash va include următoarele funcții:

  • set_val(cheie, valoare): Inserează o pereche cheie-valoare în harta hash. Dacă valoarea există deja în harta hash, actualizați valoarea.
  • get_val(cheie): Returnează valoarea la care este mapată cheia specificată sau Nu a fost găsită nicio înregistrare dacă această hartă nu conține nicio mapare pentru cheie.
  • delete_val(cheie): Elimină maparea pentru cheia specifică dacă harta hash conține maparea pentru cheie.

Mai jos este implementarea.

Python3


hibernare dialect



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)>

>

>

Ieșire:

Complexitatea timpului:

Accesul la indexul memoriei durează constant, iar hashingul durează constant. Prin urmare, complexitatea căutării unei hărți hash este, de asemenea, timp constant, adică O(1).

convertiți șirul în enumerare

Avantajele HashMaps

● Acces rapid la memorie aleatoare prin funcții hash

● Poate folosi valori negative și non-integrale pentru a accesa valorile.

● Cheile pot fi stocate în ordine sortată, prin urmare se pot itera cu ușurință peste hărți.

Dezavantajele HashMaps

● Coliziunile pot cauza penalizări mari și pot duce la liniară complexitatea timpului.

localdatetime java

● Când numărul de taste este mare, o singură funcție hash provoacă adesea coliziuni.

Aplicații HashMaps

● Acestea au aplicații în implementările Cache în care locațiile de memorie sunt mapate la seturi mici.

● Sunt folosite pentru indexarea tuplurilor în sistemele de management al bazelor de date.

● Sunt utilizați și în algoritmi precum potrivirea modelului Rabin Karp