Documente Academic
Documente Profesional
Documente Cultură
(17.1)
MEMORIE=max(nrMatricol)*dimensiune(Student)=55630*48=2,54 MB
(17.2)
MEM
elemente
MEM
*100 = 1450 * 48
55630 * 48
54130,55630
(17.4)
hash(S) = s[0]*31n-1+s[1]*31n-2++s[n-2]*31+s[n-1]
(17.5)
unde:
s[i] codul ASCII al caracterului i din
ir; n dimensiunea irului de caractere.
Pentru cheia alfanumeric cu valoarea salut aplicarea funciei hash
conduce la obinerea valorii
hash(salut)=115*314+97*313+108*312+117*31+116=109202173 (17.6)
valoarea obinut este introdus din nou ntr-o funcie hash care s
identifice poziia corespondent din mulime pentru aceast valoare
numeric foarte mare.
Dezavantajul tabelelor de dispersie n cadrul proceselor de cutare
este descris de:
- efortul suplimentar de prelucrare dat de funcia hash care poate
Cheie de cutare
Funcie hash
Valoarealfanumeric
Valoarenumeric
Valoare[Elem1, Elemn]
EVITARE COLIZIUNI
Elem1
Elemn
(17.7)
unde:
nregistrare;
val_baza valoarea numeric stabilit la definirea modelului; Valoarea
utilizat ca baz n modelul funciei hash este dat de dimensiunea
tabelei de dispersie; obiectivul definirii funciei hash este de a obine un
model care s minimizeze mulimea de chei diferite ce conduc la aceeai
valoare pozitie_tabela; n acest sens se utilizeaz numere prime
apropiate de numrul total de nregistrri; astfel, dac cheile
nregistrrilor definesc o mulime continu de valori unice, valorile hash
determinate vor acoperi toat mulimea [0..val_baza-1]; pentru a stabili
dimensiunea iniial a tabelei de dispersii sunt alese numere prime
particulare; de exemplu limbajul Java definete o clas HashTable ce
descrie o tabel de dispersie cu dimensiunea iniial egal cu 101;
valoarea nu este aleas la ntmplare deoarece permite redimensionarea
tabelei la o nou valoare prim; pentru cazuri generale, este indicat s
se foloseasc un numr prim determinat prin relaia:
dimensiune_hash = (4*i+3) cu i=0, 1, 2, 3,
(17.8)
val_hash=((val_cheie*random[0;1))[(val_cheie*random[0;1))])*nth
(17.9)
unde:
val_hash valoarea hash calculat;
val_cheie valoarea cheii de cutare;
random[0;1) numr aleatoriu din mulimea [0;1);
nth
dimensiunea tabelei de dispersie.
-
unde:
(17.10)
(17.11)
unde:
val_hashs2
valoarea hash calculat;
string_cheie valoarea cheii de cutare;
lungimestring_cheie dimensiunea irului de caractere;
dim_hash
dimensiunea tabelei de dispersie;
ce ia n calcul primul i ultimul caracter; de asemenea, pentru a
nu reduce dimensiunea tabelei la maxim 255 elemente, se
utilizeaz un numr prim, dim_hash suficient de mare; alte funcii
hash de prelucrare a cheilor alfanumerice analizeaz toate
caracterele din ir; de exemplu relaia
lungime _ cheie
val_hashs3 =
unde:
val_hashs3
valoarea hash calculat;
string_cheie valoarea cheii de cutare;
lungime_cheie dimensiunea irului de caractere;
dim_hash dimensiunea tabelei de dispersie;
determin valoarea hash pe baza sumei codurilor ASCII asociate
tuturor caracterelor din cheie;
5 1 sau a expresiei
2
m 1
5 1
2
f(val_cheie) = [val_cheie * m]
(17.14)
3. Evitarea coliziunilor
Funciile de evitare a coliziunilor definesc metode de regsire a
elementelor ce sunt descrise de chei cu valori diferite dar care conduc la
valori hash identice ceea ce implic poziii identice n cadrul structurii:
- chaining implementreaz lucrul cu liste fiecare poziiei din
cadrul tabelei de dispersie conine captul unei liste de elemente
cu valori hash egale; regsirea unui element presupune
determinarea poziiei n cadrul tabelei prin calcularea valorii hash
i parcurgerea secvenial a listei ataate poziiei respective dup
valoarea cheii de cutare, figura 17.2;
Tabel de dispersie
valoare cheie
hash(x) = k
hash(y) = k
hash(z) = k
NULL
k+1
hash1(x) = k
hash1(y) = k
k+n
hash1(z) = k+n
hash2(y) = k+n
hash3(y) = k+m
k+m
Tabel de dispersie
hash(y) = k
hash(x) = k
verificare poziii
k+1
hash(z) = k+1
adiacente
k+2
(17.15)
unde:
poziie noua poziie din tabela de dispersie n care se insereaz sau se
caut un element;
X valoarea cheii asociate elementului;
hash(X) poziia indicat de valoarea hash a elementului care se adaug
sau se cut;
c
valoare constant definit n mulimea {1, 2, 4};
i numrul operaiei de rehash sau numrul de poziii verificate. Prin
utilizarea de repoziionri pe poziii neadiacente se evit gruparea
coliziunilor n aceeai zon din tabela de dispersie, figura 17.5;
Tabel de dispersie
hash(y) = k
hash(y)+2*12
hash(x) = k
k+2
hash(y)+2*22
hash(z) = k+2
k+8
hash(x) = k
zon principal
hash(y) = k
zon overflow
y
GU
hash
NPO *100
NTP
unde:
NPO numrul de poziii ocupate;
NTP numrul total de poziii.
(17.16)
care este meninut la o valoarea mai mic de 50%. n ciuda faptului c are
loc o gestiune ineficient a spaiului, eficiena abordrii se bazeaz pe o
vitez de regsire mare. Pentru a menine valoarea indicatorului GUhash sub
limit impus, tabela se redimensioneaz prin dublarea numrului de poziii.
n cazul n care modelul funciei hash este bazat pe mprirea n modul la
dimensiunea acesteia, redimensionarea trebuie s conduc la o nou
dimensiune care s reprezinte tot un numr prim. Avnd n vedere
importana acestor tipuri de numere, lucru evideniat la descrierea tipurilor
de funcii hash, redimensionarea se face prin intermediul relaiei
dimensiune_noua = dimensiune_curenta*2 + 1
(17.17)
(17.18)