Diferente pentru tabele-hash-scurta-prezentare intre reviziile #1 si #2

Nu exista diferente intre titluri.

Diferente intre continut:

h2. Adresare directa
Elementele sunt puse intr-un tablou alocat static pe pozitiile cheilor lor. Prin adresare directa, un element cu cheia $k$ va fi memorat in locatia {$k$}. Toate cele $3$ operatii sunt extrem de simple(necesita doar o accesare de memorie), dar dezavantajul este ca aceasta tehnica "mananca" foarte multa memorie: {$O(|U|)$}, unde $U$ este universul de chei.
Elementele sunt puse intr-un tablou alocat static pe pozitiile cheilor lor. Prin adresare directa, un element cu cheia $k$ va fi memorat in locatia $k$. Toate cele 3 operatii sunt extrem de simple (necesita doar o accesare de memorie), dar dezavantajul este ca aceasta tehnica "mananca" foarte multa memorie: $O(|U|)$, unde $U$ este universul de chei.
h2. Standard hashing
Primul pas in a rezolva problema memoriei este de a folosi $O(N)$ memorie in loc de {$O(|U|)$}, unde $N$ este numarul de elemente adaugate in hash. Astfel, un element cu cheia $k$ nu va fi memorat in locatia {$k$}, ci {$h(k)$}, unde {@h:U->{0,1,...,N-1}@} - o functie aleasa aleator, dar determinista( $h(x)$ va returna mereu aceeasi valoare in cursul rularii unui program ). Daca functia este aleasa aleator, elementele vor fi "imprastiate" in hash in mod echivalent, egal. Ideal ar fi ca fiecare element sa fie stocat in locatia lui. Acest lucru insa nu este posibil, pentru ca $N < |U|$ si, deci, de multe ori mai multe elemente vor fi repartizate in aceeasi locatie. Aceasta problema se numeste coliziune.
Primul pas in a rezolva problema memoriei este de a folosi $O(N)$ memorie in loc de $O(|U|)$, unde $N$ este numarul de elemente adaugate in hash. Astfel, un element cu cheia $k$ nu va fi memorat in locatia $k$, ci $h(k)$, unde $h: U -> {0, 1, ..., N-1}$ - o functie aleasa aleator, dar determinista ({$h(x)$} va returna mereu aceeasi valoare in cursul rularii unui program). Daca functia este aleasa aleator, elementele vor fi "imprastiate" in hash in mod egal. Ideal ar fi ca fiecare element sa fie stocat in locatia lui. Acest lucru insa nu este posibil, pentru ca $N < |U|$ si, deci, de multe ori mai multe elemente vor fi repartizate in aceeasi locatie. Aceasta problema se numeste coliziune.
Cum rezolvam coliziunile?
h3. Inlantuire
In fiecare locatie din hash tinem o lista inlantuita; astfel, la oricare din cele $3$ operatii se va parcurge toata lista. Pe un caz pur teoretic, toate cele $N$ elemente ar putea fi repartizate in aceeasi locatie, insa pe cazuri practice lungimea medie a celui mai lung lant este de {$lg(N)$}.
In fiecare locatie din hash tinem o lista inlantuita; astfel, la oricare din cele 3 operatii se va parcurge toata lista. Pe un caz pur teoretic, toate cele $N$ elemente ar putea fi repartizate in aceeasi locatie, insa pe cazuri practice lungimea medie a celui mai lung lant este de {$lg(N)$}.
* Memorie: {$O(N)$}, pointeri: da
* Memorie: $O(N)$
* Pointeri: DA
h3. Liste statice
Aceasta metoda este o imbunatatire a punctului anterior: pentru ca lungimea unui lant este cel mult {$lg(N)$}, putem sa folosim, in loc de liste inlantuite, vectori alocati dinamic de lungime $lg(N)$ - sau {$lg(N) + 3$}, ca sa fiti siguri :). Scapam astfel de lucrul cu pointerii.
Aceasta metoda este o imbunatatire a punctului anterior: pentru ca lungimea unui lant este cel mult {$lg(N)$}, putem sa folosim, in loc de liste inlantuite, vectori alocati dinamic de lungime $lg(N)$ - sau {$lg(N) + 3$}, ca sa fim siguri :). Scapam astfel de lucrul cu pointerii.
* Memorie: {$O(N*lg(N))$}, pointeri: nu
* Memorie: $O(N*lg(N))$
* Pointeri: NU
h3. Adresare directa
h3. Adresare deschisa
Prin adresare directa, toate elementele sunt memorate in tabela de hash. Pentru a realiza operatiile cerute, verificam succesiv tabela de hash pana cand fie gasim o locatie libera(in cazul Inserarii), fie gasim elementul cautat (pentru {@Cauta@}, {@Sterge@}). Insa, in loc sa cautam tabela de hash in ordinea {$0,1,....,N-1$}, sirul de pozitii examinate depinde de cheia ce se insereaza. Pentru a determina locatiile corespunzatoare, extindem functia de hash astfel incat sa contina si numarul de verificare ca un al doilea parametru {@h:U*{0,1,....,N-1}->{0,1,...,N-1}@}. Astfel, cand vom insera un element, verificam mai intai locatia {$h(k , 0)$}, apoi {$h(k , 1)$} etc. Cand ajungem sa verificam {$h(k , N)$} putem sa ne oprim pentru ca tabela de hash este plina; pentru cautare aplicam aceeasi metoda; daca ajungem la {$h(k , N)$} sau la o pozitie goala inseamnca ca elementul nu exista. Stergerile se fac insa mai greu, pentru ca nu se poate "sterge" pur si simplu un element deoarece ar strica tot hash-ul; in schimb, se marcheaza
locatia ce trebuie stearsa cu o valoare $STERS$ si se modifica functia Insereaza astfel incat sa vada locatiile cu valoarea $STERS$ ca pozitii goale.
Prin adresare deschisa, toate elementele sunt memorate in tabela de hash. Pentru a realiza operatiile cerute, verificam succesiv tabela de hash pana cand fie gasim o locatie libera (in cazul _Inserarii_), fie gasim elementul cautat (pentru _Cauta_, _Sterge_). Insa, in loc sa cautam tabela de hash in ordinea $0, 1, ..., N-1$, sirul de pozitii examinate depinde de cheia ce se insereaza. Pentru a determina locatiile corespunzatoare, extindem functia de hash astfel incat sa contina si numarul de verificare ca un al doilea parametru $h: U * {0, 1, ..., N-1} -> {0, 1, ..., N-1}$. Astfel, cand vom insera un element, verificam mai intai locatia {$h(k, 0)$}, apoi {$h(k, 1)$} etc. Cand ajungem sa verificam {$h(k, N)$} putem sa ne oprim pentru ca tabela de hash este plina. Pentru cautare aplicam aceeasi metoda; daca ajungem la {$h(k, N)$} sau la o pozitie goala, inseamna ca elementul nu exista. Stergerile se fac insa mai greu, pentru ca nu se poate "sterge" pur si simplu un element deoarece ar strica tot hash-ul. In schimb, se marcheaza locatia ce trebuie stearsa cu o valoare $STERS$ si se modifica functia _Insereaza_ astfel incat sa vada locatiile cu valoarea $STERS$ ca pozitii goale.
* Memorie: {$O(N)$}, pointeri: nu
* Memorie: $O(N)$
* Pointeri: NU
h3. Mihai Patrascu's Double hashing

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.