Masă Hash

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Masă Hash
HASHTB08.svg
O mică agendă telefonică, ca exemplu de masă hash.
Clasă Structură de date
Structură de date Masă Hash
Cel mai rău caz spațial Pe)
Optim De multe ori

În informatică, un tabel hash , în tabelul hash italian, este o structură de date utilizată pentru a potrivi o cheie dată cu o valoare dată. Este utilizat pentru implementarea structurilor de date asociative abstracte, cum ar fi Map sau Set .

Este utilizat pe scară largă în metodele de căutare numite hashing, care este o extensie a căutării indexate prin chei care tratează problemele de căutare în care cheile de căutare nu au aceste proprietăți. O căutare bazată pe hashing este complet diferită de una bazată pe comparație: în loc să se deplaseze în structura dată în funcție de rezultatul comparațiilor dintre taste, încearcă să acceseze elementele din tabel direct prin operații aritmetice care transformă cheile în adresele tabelului.

Există diferite tipuri de algoritmi de hash. După cum sa menționat, într-un tabel de hash bine dimensionat, costul mediu de căutare al fiecărui element este independent de numărul de elemente. Hashing-ul este o problemă clasică în informatică; au fost propuși, studiați temeinic și utilizați în practică mulți algoritmi. Două metode foarte populare sunt hash static și hash extensibil și liniar, metode utilizate și de programele DBMS .

Descriere

Funcționare și implementare

Primul pas pentru a crea algoritmi de căutare hash este de a determina funcția hash : datele care trebuie indexate sunt transformate de o funcție hash specifică într-un număr întreg între și care este folosit ca index într-o matrice de lungime m. Asumand atât universul cheilor cât și un tabel hash, o funcție hash h, stabilește o potrivire între și pozițiile din tabelul hash, deci:

În mod ideal, cheile diferite ar trebui transformate în adrese diferite, dar din moment ce nu există o funcție hash perfectă , adică total injectivă , este posibil ca două sau mai multe chei diferite să fie convertite în aceeași adresă. Cazul în care funcția hash aplicată la două taste diferite generează aceeași adresă se numește coliziune și poate fi tratată în diferite moduri. Alegerea unei funcții hash bune este esențială pentru a minimiza coliziunile și pentru a asigura performanțe optime în orice moment. Cel mai bun rezultat se obține cu funcții pseudo-aleatorii care distribuie uniform datele de intrare.

Cu toate acestea, foarte des, o funcție hash bună poate să nu fie suficientă: de fapt, performanța unui tabel hash este, de asemenea, puternic legată de așa-numitul factor de încărcare calculat ca și care arată cât de probabil este un element nou să se ciocnească cu unul deja prezent în tabel. Această probabilitate este de fapt mai mare decât s-ar putea crede, așa cum demonstrează paradoxul zilei de naștere . Prin urmare, este bine să mențineți factorul de încărcare cât mai scăzut posibil (de obicei, o valoare de 0,75 este cea optimă) pentru a minimiza numărul de coliziuni. Acest lucru se poate face, de exemplu, prin redimensionarea tabloului de fiecare dată când este depășit factorul de încărcare dorit.

Managementul coliziunilor

Următoarele sunt cele mai populare metode de gestionare a coliziunilor.

  • Deschide Hash
  • Hash cu concatenare (sau cu listă de depășire) : pentru fiecare celulă a tabelului hash, o Listă (de obicei o listă legată ) este potrivită în locul unui element. În acest fel se adaugă un element în coliziune la lista corespunzătoare indexului obținut.

Deschide Hash

În adresarea deschisă, toate elementele sunt stocate în tabelul hash; adică fiecare celulă a tabelului conține un element al setului dinamic sau al constantei NULL. Când căutăm un element, examinăm sistematic celulele tabelului până când găsim elementul dorit sau până ne dăm seama că elementul nu se află în tabel.

Spre deosebire de înlănțuire, nu există liste sau articole stocate în afara mesei. Deci, în adresarea deschisă, tabelul hash se poate „umple” până la punctul în care nu mai pot fi făcute intrări.

Avantajul adresării deschise constă în faptul că exclude complet indicii, calculăm secvența celulelor care trebuie examinate ( inspecție ).

Un concept important în acest sens este așa-numitul hash uniform. Reprezintă hash ideal - adică fiecare celulă din tabel este la fel de probabil să conțină un element dat.

Există diferite tehnici de inspecție, cele mai frecvent utilizate trei tehnici sunt: ​​inspecția liniară, inspecția pătratică și hashing dublu. Cu toate acestea, niciuna dintre aceste tehnici nu îndeplinește ipoteza uniformă de hash, deoarece niciuna dintre ele nu este capabilă să genereze mai mult de diferite secvențe de inspecție (în loc de , așa cum este necesară uniformizarea hașului).

Tehnici de inspecție utilizate în mod obișnuit

Inspecție liniară

Când se întâlnește o coliziune, tot ce faci este să folosești indexul următor celui care se ciocnește, până când se găsește un spațiu liber.

Inspecție quadratică

Când se întâlnește o coliziune, tot ce se face este să folosiți indicele de coliziune pătrat cu normalizare în raport cu dimensiunea tabelului indexului obținut, până când se găsește o casetă liberă.

Hashing dublu

unde, de exemplu, putem plasa Și .

Dacă se întâlnește o coliziune la hashing o cheie, atunci rezultatul unei noi funcții hash este adăugat la indexul obținut (în general diferit de primul și care are indexul obținut anterior ca parametru) și se încearcă inserarea în noul index astfel obținut, reaplicând a doua funcție până când se găsește o celulă liberă.

Hashing static

Hash-ul static folosește conceptul de cupă, care este setul de pagini care conțin etichete de înregistrare a datelor. Dacă o pagină principală de bucket este plină, se creează o pagină de depășire. Pentru a căuta eticheta corespunzătoare cheii ( numărul cupei) se folosește următoarea formulă hash căreia îi aparține eticheta. Funcția hash acționează asupra câmpului cheie căutare înregistrare și trebuie să distribuie valorile peste ( găleată). Performanța căutării depinde în mare măsură de funcție .

Paginile de bucket primare, în hash static, sunt alocate consecutiv. Acest lucru poate duce la problema lanțurilor lungi de deversare care degradează performanța, deoarece nu avem pagini adiacente.

Exemplu de funcție Hash

(cu Și constante)

Hash extensibil

Practic este o îmbunătățire a hashului static, deoarece, pe lângă introducerea găleților de preaplin, permite dublarea numărului de găleți și reorganizarea etichetelor. Singura problemă constă în reorganizarea etichetelor, deoarece aceasta necesită mult timp. Există două soluții. Primul (hash extensibil) gestionează un director de pointeri către gălețile primare, al doilea (hash liniar) vă permite să rezolvați problema fără a utiliza directoare, dar cu o familie de funcții hash. În hash extensibil vorbim despre adâncimea directorului și ne referim la numărul minim de biți care permite reprezentarea numărului de elemente conținute în director.

Hash liniar

Hash liniar, așa cum sa menționat în paragraful anterior, vă permite să rezolvați problema lanțurilor lungi de revărsare fără a utiliza directoare. Ideea de bază este de a utiliza o familie de funcții hash unde este are o gamă care este jumătate din cea a . Aceasta înseamnă că gama de Și

Exemplu

De sine atunci numărul minim de biți pentru reprezentarea numărului este 5. Prin urmare acesta este Următoarea caracteristică va avea autonomie și poate reprezenta găleți de la 0 la 63. Funcția hash va fi după cum urmează

Bilanț spațiu / timp

Pe baza dimensiunii matricei în care are loc căutarea și stocarea informațiilor, există un tabel al complexității de calcul a timpului necesar pentru căutarea în sine. Cu cât este mai mult spațiu disponibil, cu atât este nevoie de mai puțin timp în cel mai rău caz.

Spaţiu Vreme

La corespunde numărului de elemente prezente în matrice, de ex numărul de locuri disponibile în timp ce este factorul de încărcare.

Analiza costurilor scanării

Numărul de pași care trebuie efectuați pentru o scanare completă a tabelului este dat în cazul mediu de:

Rezultatul căutării Scanare liniară Hashing dublu / scanare quadratică
Cheie găsită
Cheia nu a fost găsită

unde α este factorul de sarcină.

Bibliografie

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Introducere în algoritmi . Jackson Books, 2003, ISBN 88-256-1421-7 .

Elemente conexe

Alte proiecte

linkuri externe

Controlul autorității GND ( DE ) 1046573225
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT