Documente Academic
Documente Profesional
Documente Cultură
1 --
-- Tabele de dispersie .2 --
....
.
.
.
'i'
....
'j'
.
.
.
.
'z'
-- Tabele de dispersie .3 --
Tabele de dispersie
Problem: durata cutrii este dependent
de lungimea listei n care se caut, iar n
majoritatea cazurilor lungimile listelor sunt foarte
diferite unele liste pot fi foarte lungi, n timp ce
altele pot fi vide.
Soluie: utilizarea unei funcii de dispersie
(hash function).
Funcia de dispersie genereaz, pentru orice
ir de caractere, un cod de dispersie dintr-un
domeniu fixat [0,M-1].
-- Tabele de dispersie .4 --
-- Tabele de dispersie .5 --
Tabele de dispersie
Caz extrem:
M este chiar numrul de total de elemente.
In acest caz funcia de dispersie genereaz un cod
distinct pentru fiecare element. Intr-un astfel de caz
elementele pot fi memorate direct ntr-un vector numit
tabela de dispersie cu adresare direct, indicele unui
element fiind reprezentat de codul de dispersie
corespunztor.
[0]
[k]
........
[M -1]
.....................
-- Tabele de dispersie .6 --
Tabele de dispersie
In cazul general numrul de
[0]
valori distincte ale codului de
dispersie este mult mai mic dect
numrul total de elemente.
In acest caz ntre dou elemente
[k]
cu acelai cod de dispersie k se
produce o coliziune.
Cea mai simpl metod de
rezolvare a coliziunilor const n
combinarea celor dou variante
[M-1]
prezentate anterior.
...
.
.
.
...
.
.
.
.
.
.
...
-- Tabele de dispersie .7 --
Tabele de dispersie
Elementele tabelei de dispersie sunt adrese de liste, n
fiecare list fiind memorate adresele elementelor cu
acelai cod de dispersie k [0,M-1].
Pentru eficiena cutrii oricruia dintre cele N
elemente este de dorit ca lungimile celor M liste s fie
ct mai apropiate de valoarea N/M = factor de ncrcare
(load factor) al tabelei de dispersie.
[0 ]
. . .
.
.
.
[k ]
. . .
.
.
-- Tabele de dispersie .8 --
M
fd
functie de
disp ersie
v
.
.
.
.
[0]
.
.
.
[M-1]
-- Tabele de dispersie .9 --
M
fd
functie de
dispersie
[0]
....
ft
efect: calculeaz codul
.
.
.
de dispersie k i caut
.
.
.
elementul n lista [k]
[k]
...
. .
(utiliznd funcia de test
.
.
functie test
din descriptor sau o
relatie elem
element cautat
funcie parametru)
rezultat: adres element / NULL
Prototipuri posibile:
void* ExistaTD(TabDisp* a, void* e);
void* CautaTD(TabDisp* a, void* e, TF2 f);
Prototip:
void AfiTD(TabDisp* a, TF1 afiEl);
.
.
...
[k]
....
.
.
element cautat
rezultat
fd
functie de
dispersie
v
.
.
.
.
[0]
..
.
.
.
[M-1]
..
DistrTD(&a,ElibElem);
Prototip:
void DistrTD(TabDisp**aa, TF1 fe);