Sunteți pe pagina 1din 144

TABELE DE

DISPERSIE
l. Dr. Ing. erban Radu
Departamentul de Calculatoare
Facultatea de Automatic i Calculatoare
Introducere


Tabelele de dispersie

sunt

structuri de
date care ofer posibilitatea inserrii i
cutrii rapide


Indiferent de numrul de elemente,
inserarea i cutarea se efectueaz n
timp aproape constant, adic O(1)
Avantaje


Tabelele de dispersie se utilizeaz n
programe n care este necesar cutarea
ntr-un timp foarte scurt, prin cteva zeci
de mii de elemente


Tabelele de dispersie sunt mai rapide
dect arborii, care opereaz ntr-un timp
O(logN)
Dezavantaje


Tabelele de dispersie se bazeaz pe
tablouri, care sunt greu de extins, dup ce
au fost create


n unele tipuri de tabele de dispersie,
performanele se reduc la completarea
tabelei peste un anumit prag


Programatorul trebuie s aproximeze
nainte numrul elementelor pe care le va
insera
Dezavantaje


Nu exist o modalitate de a vizita
elementele unei tabele de dispersie ntr-o
anumit ordine, de exemplu n ordine
cresctoare


Trebuie utilizat o alt structur pentru
aceast facilitate
Dispersia datelor


Dispersia datelor se refer la
transformarea unui domeniu de valori ale
unei anumite chei ntr-un domeniu de
indici dintr-un tablou


ntr-o tabel de dispersie, aceast operaie
este realizar utiliznd o funcie de
dispersie

(hash function)
Dispersia datelor


Anumite tipuri de chei nu au nevoie de
aplicarea acestei funcii de dispersie


Valorile lor pot fi utilizate direct ca indici n
tablou
Dicionar


Dac se dorete memorarea tuturor
cuvintelor din limba englez ntr-un
dicionar, astfel nct s poat fi accesate
foarte rapid, utilizarea unei tabele de
dispersie este o soluie foarte bun
Compilatoare


O aplicaie a tabelelor de dispersie este n
cadrul compilatoarelor limbajelor de
programare, care pstreaz o tabel de
simboluri implementat printr-o astfel de
structur


Tabela de simboluri conine toate numele
variabilelor si funciilor definite de
programator, precum i adresele la care
acestea se gsesc n memorie
Exemplu


Se dorete stocarea unui dicionar al limbii
engleze, cu 50.000 de cuvinte


Este posibil ca fiecare cuvnt s ocupe
propria celul ntr-un tablou cu 50.000 de
elemente, sau se poate utiliza un index


Care va fi relaia dintre un cuvnt i
numrul de index corespunztor ?
Transformarea cuvintelor n numere


Este necesar o relaie care s permit
transformarea unui cuvnt n numrul de
index corespunztor


Codurile ASCII au valori cuprinse ntre 0 i
255, pentru a putea include literele mici i
mari, semnele de punctuaie i alte
caractere
Observaii


Alfabetul limbii engleze conine 26 de litere


Se presupune c:
a are asociat valoarea 1
b are asociat valoarea 2
z are asociat valoarea 26
spaiul are asociat valoarea 0


Cum se combin cifrele asociate literelor
ntr-un numr caracteristic ntregului
cuvnt ?
Adunarea cifrelor


O metod de transformare a unui cuvnt
ntr-un numr este de a aduna codurile
numerice asociate tuturor caracterelor
care l compun


Pentru cuvntul cast

se obine:


c+a+s+t=3+1+19+20=43


Cuvntul cast

este memorat n celula cu
indicele 43
Observaii


Dac ne restrngem la cuvinte cu cel mult
10 litere, primul cuvnt din dicionar, a,
este reprezentat prin valoarea:


0+0+0+0+0+0+0+0+0+1=1


Ultimul cuvnt potenial din dicionar este
zzzzzzzzzz


Codul obinut prin adunarea literelor este:


26+26+26+26+26+26+26+26+26+26=260
Observaii


Domeniul global al codurilor este de la 1 la
260


Deoarece exist 50.000 de cuvinte n
dicionar, nu dispunem de suficieni indici
pentru a putea asocia fiecrui cuvnt un
indice propriu


Fiecare element al tabloului va conine
aproximativ 192 de cuvinte (50.000/260)
Observaii


Se poate introduce un subtablou sau o
list nlnuit de cuvinte n fiecare din
elementele tabloului


Aceast soluie duce la o reducere a
vitezei de acces


Dei avem acces imediat la orice element
din tablou, cutarea cuvntului dorit prin
lista de 192 de cuvinte este lent
Forma polinomial


Fiecare caracter dintr-un cuvnt trebuie s
contribuie n mod unic la numrul rezultat
n final, pentru ca fiecare cuvnt s ocupe
singur o celul din tablou


Se poate efectua descompunerea unui
cuvnt n litere, dup care se convertesc
literele n cifrele echivalente, se nmulesc
cu puterile corespunztoare ale lui 27 si se
adun rezultatele
Exemplu


Prin transformarea cuvtului cast

ntr-un
numr, se obine:


3*27
3
+1*27
2
+19*27
1
+20*27
0
=60.311


Aceasta metod genereaz un numr unic
pentru fiecare cuvnt


Pentru cuvinte mai lungi, domeniul de
indici devine prea mare
Dezavantaje


Aceast metod asociaz o celul dintr-un
tablou fiecrui ir de caractere, chiar dac
acesta reprezint sau nu un cuvnt


Numai o mic parte din celule sunt
asociate unor cuvinte reale, deci
majoritatea celulelor din tablou vor fi vide
Observaii


Metoda adunrii cifrelor a generat prea
puini indici


Metoda reprezentrii polinomiale a
generat prea muli indici
Dispersie


Este necesar o modalitate de a compacta
domeniul de valori obinut n urma
reprezentrii polinomiale, pentru a obine
un domeniu care s se apropie de
dimensiunile unui tablou rezonabil


Ct de mare va fi tabloul necesar pentru
exemplul dicionarului limbii engleze ?
Dispersie


Este necesar un tablou cu dimensiunea
dubl fa de numrul de cuvinte, adic un
tablou cu 100.000 de elemente


Se poate reduce domeniul obinut n urma
reprezentrii polinomiale ntr-un domeniu
cuprins ntre 0 i 100.000, prin utilizarea
operatorului modulo (%)
Exemplu


Se restrng numerele 0-199 (desemnate
prin variabila largeNumber) n domeniul 0-9
(desemnate prin variabila smallNumber)


Exist 10 valori n domeniul mai mic i se
definete variabila smallRange=10


smallNumber = largeNumber % smallRange
Observaii


Se compacteaz domeniul, cu un raport
de compresie de 20 la 1


Pentru a comprima numerele care
reprezint, n mod unic, fiecare cuvnt din
limba englez, n numere de index
adecvate tabloului, avem:


arrayIndex = hugeNumber % arraySize
Funcie de dispersie


Funcia de dispersie convertete un numr
dintr-un domeniu mai mare ntr-un numr
dintr-un domeniu mai mic


Domeniul mai mic corespunde cu
domeniul indicilor dintr-un tablou


Un tablou n care elementele sunt inserate
utiliznd o funcie de dispersie se numete
tabel de dispersie
Observaii


Utiliznd operatorul %, se comprim
domeniul foarte mare ntr-un domeniu cu
lungimea dubl fa de numrul elementelor
care trebuie memorate


Exemplu de funcie de dispersie:


arraySize = numberWords * 2


arrayIndex = hugeNumber % arraySize
Observaii


n domeniul foarte mare, fiecare numr
reprezint un ir de caractere, dar puine
dintre aceste iruri sunt cuvinte cu sens
din limba englez


Funcia de dispersie transform aceste
valori mari n numere de index dintr-un
domeniu mult mai mic
Observaii


n acest tablou, exist n medie un cuvnt
la fiecare dou celule


Unele celule rmn neocupate, dar exist
i celule cu mai mult de un cuvnt


O implementare direct a acestei metode
duce la depirea de ctre variabila
hugeNumber a dimensiunii maxime a
tipului su
Coliziuni


Restrngerea domeniului mai mare are un
dezavantaj


Nu este sigur c, pentru dou cuvinte
distincte, nu se va asocia aceeai celul
din tablou (funcia de dispersie nu este
injectiv)
Coliziuni


Situaia seamn cu cazul n care se
adunau codurile literelor, dar este mai bun


Pentru cuvinte de pn la 10 litere, existau
numai 260 de rezultate posibile


Numrul rezultatelor este acum de 50.000


Este imposibil s se evite asocierea
multipl a diferitelor cuvinte n aceeai
celul din tablou
Coliziuni


Nu este posibil ca fiecare indice s fie
asociat unui cuvnt unic


Este de dorit s nu existe foarte multe
cuvinte care s fie repartizate n aceeai
celul
Exemplu


Se presupune c se insereaz cuvntul
melioration

n tablou


Se aplic funcia de dispersie, pentru a
obine numrul indicelui, dar se gsete
celula ocupat de cuvntul demystify,
acestuia fiindu-i asociat acelai indice


Aceast situaie se numete coliziune
Observaii


Deoarece tabloul are de dou ori mai
multe celule dect elemente, jumtate din
celulele tabloului sunt neocupate


O soluie este ca, la apariia unei coliziuni,
s se caute n tablou (ntr-un mod stabilit)
o celul liber, dup care se insereaz
elementul nou n acea celul, n locul celei
obinute prin aplicarea funciei de dispersie
Exemplu


Aceast metod se numete adresare
deschis

(open addressing)


Dac cuvntului cast

i corespunde
celula 5.421 i aceasta este deja ocupat,
se insereaz cuvntul n celula 5.422
Observaii


A doua metod este de a crea un tablou
care conine liste nlnuite n loc de
cuvinte


La apariia unei coliziuni, elementul nou va
fi inserat ntr-o list de cuvinte cu acelai
indice


Metoda se numete nlnuire separat

(separate chaining)
Adresare deschis


n aceast metod, cnd nu se poate
insera un element la valoarea indicelui
calculat de funcia de dispersie, se caut
alt poziie din tablou
Tipuri de adresare deschis


Exist trei metode de adresare deschis,
care difer prin modul de cutare a
urmtoarei celule libere:
sondaj liniar

(linear probing)
sondaj ptratic

(quadratic probing)
dubl dispersie (double hashing)
Sondaj liniar


Metoda caut secvenial o celul liber


Se incrementeaz indexul, pn cnd se
gsete o celul liber


Metoda se numete sondaj liniar,
deoarece parcurge secvenial mulimea
celulelor din tablou
Aplicaia Hash


Cheile sunt cuprinse ntre 0 i 999


Dimensiunea iniial a tabloului este de 60


Funcia de dispersie va comprima
domeniul cheilor, pn la dimensiunea
domeniului indicilor din tablou


arrayIndex = key % 60
Observaii


O secven de celule ocupate dintr-o
tabel de dispersie se numete secven
ocupat (filled sequence)


Pe msur ce se adaug elemente noi,
secvenele ocupate devin din ce n ce mai
lungi


Acest proces se numete creare de
uniti de alocare

(clustering)
Observaii


Umplerea aproape complet a unei tabele
de dispersie este ineficient


Cnd o tabel de dispersie se umple
complet, niciunul dintre algoritmi nu mai
funcioneaz


n aplicaia Hash, toi algoritmii presupun
c n tabel exist cel puin o celul liber
Observaii


La cutarea unei chei, se aplic funcia de
dispersie i se obine un indice din tablou


Dac celula cu indicele respectiv este ocupat
de un element cu o alt cheie, apare o coliziune


Algoritmul va cuta cheia n urmtoarea celul
din tablou


Procesul de cutare a celulei potrivite, n urma
unei coliziuni, se numete sondaj

(probing)
Observaii


Dup detectarea coliziunii, algoritmul va
continua s examineze n ordine celulele
din tablou


Dac se ntlnete o celul liber (nainte
de a gsi cheia cutat), nseamn c
operaia a euat
Observaii


Numrul pailor efectuai pentru gsirea
unei celule libere se numete lungimea
sondajului

(probe length)


n majoritatea cazurilor, lungimea
sondajului este de cteva celule
Fascicule (clustering)


Pe msur ce se umple tabela, fasciculele
de elemente devin mai mari


Crearea de fascicule lungi conduce la
creterea lungimilor de sondaj


Accesul la elementele de la sfritul
secvenei devine lent
Observaii


Cu ct tabela este mai plin, cu att
efectele crerii de fascicule devin mai
neplcute


Nu este nicio problem dac tabela este
plin pe jumtate, pn la o proporie de
dou treimi


Peste aceast valoare, performanele se
reduc, iar fasciculele devin tot mai mari
Observaii


n cazul tabelelor cu adresare deschis,
care utilizeaz metoda sondajului liniar,
pot aprea fascicule de elemente


Dup ce se formeaz, fasciculele tind s
creasc


Elementele noi se vor insera la sfritul
secvenei, care va crete
Observaii


Raportul dintre numrul de elemente dintr-o
tabel i dimensiunea tabelei se numete
coeficient de ncrcare (load factor)


O tabel cu 10.000 de celule i 6.667 de
elemente are un coeficient de ncrcare de 2/3


loadFactor = nItems / arraySize
Observaii


Fasciculele se pot forma chiar atunci cnd
coeficientul de ncrcare are valori sczute


O parte din tabel poate conine fascicule
lungi, cealalt parte rmnnd aproape
neocupat


Prezena fasciculelor conduce la scderea
performanelor tabelei
Exemplu de implementare a adresrii
deschise, folosind sondajul liniar


Se folosete urmtoarea funcie de
dispersie:


hashIndex = key % tableSize


Vezi fiierul HashLinearProbing.cpp
Exemplu de implementare


Pentru a terge un element din tabela de
dispersie, se calculeaz indexul, pornind
de la cheia dat


Dac cheia dat nu exist la indexul
calculat, se face un sondaj, pn se
gsete cheia sau valoarea 0 pentru
variabila marker
Exemplu de implementare


Dac variabila marker este 0 pentru orice
fascicul, atunci cheia nu exist n tabela
de dispersie


Dac se gsete cheia, atunci se terge i
se seteaz variabila marker la -1
Exemplu


Se insereaz cheile 21, 32 i 31


Presupunem tableSize = 5


hashIndex pt 21 = 21 % 5 = 1


hashIndex pt 32 = 32 % 5 = 2


hashIndex pt 31 = 31 % 5 = 1


Avem coliziune pentru 31 i 21
Exemplu


Se caut urmtoarea celul liber


hashIndex pt 31 = (31+1) % 5 = 2


hashIndex cu valoarea 2 este deja ocupat
de cheia 32


hashIndex pt 31 = (31+2) % 5 = 3


hashIndex cu valoarea 3 este liber
Exemplu


Dac se terge 32 i apoi 31, se obine
hashIndex = 1 pentru cheia 31


Fasciculul de la indexul 1 conine cheia 21


Se analizeaz fasciculul urmtor


(31 + 1) % 5 = 2, care este vid


Se poate presupune c cheia 32 nu exist
sau a fost tears
Exemplu


Pentru a evita aceast problem, se
seteaz variabila marker la -1, care indic
c cheia cutat poate fi prezent n
fasciculele urmtoare
Sondaj ptratic


O posibilitate de prevenire a formrii
fasciculelor este utilizarea sondajului
ptratic


Ideea este de a sonda celule distribuite
pe o arie ceva mai larg, n locul celor
imediat adiacente locului n care trebuie
efectuat inserarea
Incrementul este ptratul numrului
iteraiei


ntr-un sondaj liniar, dac indicele iniial de
dispersie este x, celule sondate ulterior vor
fi x+1, x+2, x+3, ...


Sondajul ptratic presupune examinarea
celulelor x+1, x+4, x+9, x+16, ...


Distana dintre acestea i celula iniial
este egal cu ptratul numrului iteraiei
curente
Observaii


Metoda sondajului ptratic mrete pasul
de cutare la fiecare iteraie efectuat


n prima iteraie, algoritmul alege celula
adiacent


Dac aceasta este ocupat, algoritmul
presupune c se gsete ntr-un fascicul i
sare la o distan de 4 celule de locul
iniial
Observaii


Dac se gsete o celul ocupat, se
presupune c fasciculul n care se afl
este ceva mai mare i se ncearc la o
distan de 9 celule


Dac i aceast celul este ocupat,
algoritmul se deplaseaz la o distan de
16 celule


Algoritmul caut un loc liber, pentru a
insera elementul
Aplicaia HashDouble


Aplicaia HashDouble permite utilizarea a
dou metode de tratare a coliziunilor:
sondajul ptratic i dubla dispersie


Este bine ca dimensiunea tabelei s fie un
numr prim


Dac dimensiunea tabelei nu este numr
prim, este posibil apariia unei secvene
infinite de iteraii n algoritmul de sondaj
Dezavantajul sondajului ptratic


Sondajul ptratic rezolv problema
fasciculelor, care aprea n cazul
sondajului liniar


Aceast problem se numete acumulare
primar (primary clustering)


Sondajele ptratice produc un tip diferit (i
mult mai greu de detectat) de acumulri
Observaii


Aceste acumulri apar datorit faptului c,
pentru toate cheile asociate unei anumite
celule, se parcurge aceeai secven, n
cutarea unui loc liber


Se presupune c valorile 184, 302, 420 i
544 au toate asociate celula 7 i sunt
inserate n aceast ordine
Exemplu


Elementul 302 va necesita un sondaj cu o
singur iteraie, pentru 420 vor fi necesare
dou iteraii, iar pentru 544, trei iteraii


Fiecare element nou asociat celulei 7 va
determina creterea numrului de iteraii
n sondaj


Acest fenomen se numete acumulare
secundar (secondary clustering)
Dubla dispersie


Pentru a elimina acumularea primar,
precum i cea secundar, se utilizeaz
dubla dispersie


Este necesar o modalitate de a genera
secvene de sondaj, care depind de
fiecare cheie n parte, n locul celor
invariante fa de cheie


Valorile diferite asociate aceluiai indice
vor utiliza secvene de sondaj diferite
Dubla dispersie


Soluia este de a trece cheia prin funcia
de dispersie pentru a doua oar, cu o alt
funcie de dispersie, utiliznd rezultatul
obinut ca pas de deplasare


Pentru o aceeai cheie, pasul va rmne
constant pe parcursul unui sondaj,
modificndu-se ns pentru o alt cheie
Dubla dispersie


Proprietile funciilor secundare de
dispersie sunt:


1. Funcia secundar nu trebuie s
coincid cu cea primar


2. Rezultatul funciei nu trebuie s fie
niciodat 0 (care corespunde unei
deplasri nule

toate sondajele ar
staiona pe aceeai celul, iar algoritmul ar
intra n bucl infinit)
Dubla dispersie


Funciile de forma urmtoare dau rezultate
bune:


stepSize = constant (key % constant)


unde valoarea constant este prim i mai
mic dect dimensiunea tabloului


De exemplu:


stepSize = 5 (key % 5)
Observaii


Pentru o cheie dat, toate iteraiile vor
determina o deplasare cu un pas constant,
dar o alt cheie va modifica acest pas


n cazul funciei prezentate, paii de
deplasare sunt cuprini ntre 1 i 5
Aplicaia HashDouble


Chiar la valori mari ale coeficientului de
ncrcare, majoritatea elementelor vor fi
gsite n poziiile iniiale, utiliznd numai
prima funcie de dispersie


Puine elemente vor necesita secvene
mari de sondaj
Dimensiunea tabelei trebuie s fie
un numr prim


Metoda dublei dispersii cere ca
dimensiunea tabelei s fie un numr prim


Pentru a justifica alegerea, s considerm
o situaie n care aceast condiie nu este
ndeplinit


S presupunem c dimensiunea tabelei
este 15 (cu indici de la 0 la 14)
Exemplu


S presupunem c unei anumite chei i
corespunde indicele iniial 0 i pasul de
deplasare 5


Secvena de sondaj va fi:


0, 5, 10, 0, 5, 10, ..., repetndu-se la infinit


Singurele celule examinate sunt cele cu
indicii 0, 5 i 10
Exemplu


Algoritmul nu va detecta niciodat
eventualele celule libere, cu indicii 1, 2, 3, ...


Algoritmul intr ntr-o bucl infinit


Dac dimensiunea tabelei este 13, care este
un numr prim, secvena de sondaj va vizita
toate celulele, aceasta fiind:


0, 5, 10, 2, 7, 12, 4, 9, 1, 6, 11, 3, 8, 0, 5, ...
Exemplu


Chiar dac exist o singur celul liber,
sondajul o va detecta


Utiliznd un numr prim ca dimensiune a
tabelei, ne asigurm c aceasta nu este
un multiplu al pasului de deplasare, deci
secvena de sondaj va vizita toate celulele
din tabel
Observaii


Un efect similar are loc i n cazul
sondajului ptratic


n acest caz, mrimea pasului crete la
fiecare iteraie, depind, dup un numr
de iteraii, valoarea maxim care poate fi
memorat ntr-o variabil de tipul int i
prevenind astfel apariia unei bucle infinite
Exemplu de implementare a adresrii
deschise, folosind dubla dispersie


Vezi fiierul HashDoubleHashing.cpp
nlnuire separat (separate
chaining)


n schema adresrii deschise, coliziunile sunt
rezolvate prin cutarea unei celule libere n
tabela de dispersie


O abordare diferit este ca fiecare celul din
tabel s conin o list nlnuit


Cheia unui anumit element este transformat
ntr-un indice, prin aplicarea funciei de
dispersie, elementul fiind apoi inserat n lista
nlnuit din celula cu indicele calculat anterior
nlnuire separat


Celalalte elemente, crora le va
corespunde acelai indice, vor fi inserate
n aceeai list


Nu va fi nevoie de cutarea unei celule
libere n tabel


nlnuirea separat este mai simpl, din
punct de vedere conceptual, dect
adresarea deschis
Aplicaia HashChain


Se pot crea tabele de dispersie cu maxim
100 de liste, cu coeficieni de ncrcare de
cel mult 2


n cazul unei cutri reuite, se
examineaz, n medie, jumtate din
elementele listei


n cazul unei cutri nereuite, se
examineaz toate elementele din list
Exemplu de implementare a
nlnuirii separate


Vezi fiierul HashSeparateChaining.cpp
Coeficient de ncrcare


Coeficientul de ncrcare (raportul dintre
numrul de elemente dintr-o tabel de
dispersie i dimensiunea maxim a
tabelei) are valori diferite fa de cazul
adresrii deschise


n metoda nlnuirii separate, este normal
ca o tabel cu N celule s conin cel puin
N elemente
Coeficient de ncrcare


Coeficientul de ncrcare va avea valori
supraunitare


Aceast ncrcare nu reprezint o
problem


Vor exista anumite celule cu cel puin
dou elemente n listele corespunztoare
Observaii


n cazul n care listele conin multe
elemente, timpul de acces crete, din
cauz c accesul la un anumit element
presupune parcurgerea, n medie, a
jumtate din elementele listei
Observaii


Gsirea celulei iniiale se efectueaz ntr-un
timp scurt O(1), dar cutarea ntr-o list
necesit un timp proporional cu numrul de
elemente din list, O(M)


Este bine ca listele s nu fie foarte
ncrcate
Observaii


n schema adresrii deschise,
performanele se reduc cnd coeficientul
de ncrcare depete valoarea 2/3


nlnuirea separat permite o cretere a
acestui factor la valori supraunitare, fr a
afecta prea mult performanele tabelei de
dispersie
Valori multiple


Valorile multiple sunt permise i pot fi
generate n procesul de umplere a tabelei


Toate elementele cu o aceeai cheie vor fi
inserate n aceeai list


Pentru a le gsi, este necesar s
parcurgem toat lista i n cazul n care
operaia reuete


Aceasta conduce la o scdere a
performanelor
tergerea


tergerea nu mai ridic problemele care
apreau la adresarea deschis


Algoritmul gsete mai nti lista potrivit,
dup care terge elementul din list


Datorit faptului c sondajele nu mai sunt
necesare, nu conteaz dac lista dintr-o
anumit celul devine vid
Dimensiunea tabelei


Dimensiunea tabelei nu mai trebuie s fie
n acest caz un numr prim, cum era n
cazul sondajului ptratic i dublei dispersii


Nemaiexistnd sondaje, a disprut
pericolul ca un sondaj s intre ntr-o bucl
infinit, din cauz c dimensiunea tabelei
este divizibil cu pasul de deplasare
Dimensiunea tabelei


Pe de alt parte, anumite distribuii ale
cheilor pot determina apariia fasciculelor
de elemente, cnd dimensiunea tabelei nu
este un numr prim
Glei


O alt posibilitate, similar nlnuirii
separate, este ca fiecare celul din tabela de
dispersie s conin un tablou, n locul listei
nlnuite


Aceste tablouri se numesc glei (buckets)


Aceast soluie este mai ineficient fa de
cea care utilizeaz liste, din cauza necesitii
de a stabili dimensiunea tablourilor
Observaii


Dac tabloul este prea mic, capacitatea lui
poate fi depit, iar dac este prea mare,
determin un consum inutil de memorie


Listele nlnuite, care aloc memoria n
mod dinamic, evit acest dezavantaj
Funcii de dispersie


O funcie de dispersie trebuie s fie
simpl, pentru a fi calculat rapid


Avantajul tabelelor de dispersie l
reprezint viteza de acces


Dac funcia de dispersie este lent,
perfomanele se reduc
Funcii de dispersie


Scopul unei funcii de dispersie este de a
transforma valorile unor chei dintr-un
domeniu precizat n valori ale unor indici
dintr-o tabel, distribuite aleator i ct mai
uniform


Cheile pot fi, la rndul lor, mai mult sau
mai puin aleatoare
Chei aleatoare


O funcie perfect de distribuie asociaz
fiecrei chei un indice diferit n tabel


Acest lucru este posibil numai pentru
secvene de chei cuprinse ntr-un domeniu
suficient de mic, pentru a putea fi utilizate
direct ca indici ntr-un tablou


n majoritatea cazurilor, aceste condiii nu
sunt ndeplinite, funciile de dispersie avnd
rolul de a comprima un domeniu mai mare
de chei ntr-unul mai mic de indici
Chei aleatoare


Distribuia cheilor determin sarcinile pe
care funcia de dispersie trebuie s le
ndeplineasc


Se presupune c datele sunt aleator
distribuite n ntreg domeniul


n aceast situaie, funcia:


index = key % arraySize


este suficient de bun
Observaii


Funcia presupune efectuarea unei
singure operaii aritmetice, iar pentru chei
aleatoare, indicii rezultai vor fi aleatori
Eficiena tabelelor de dispersie


Inserarea i cutarea ntr-o tabel de
dispersie se pot efectua ntr-un timp
apropiat de cel constant, O(1)


Dac nu apar coliziuni, inserarea unui
element nou sau cutarea unuia existent
se reduc la un apel al funciei de dispersie
i la un acces n tabel


Acesta este timpul de acces minim
Eficiena tabelelor de dispersie


n cazul apariiei coliziunilor, timpul de
acces depinde de lungimea secvenelor de
sondaj rezultate


Fiecare acces la o celul, n procesul de
sondaj, crete timpul de cutare pentru o
celul liber (n cazul inserrii) sau pentru
o celul existent n tabel
Eficiena tabelelor de dispersie


Un acces presupune detectarea celulelor
libere, iar n cazul cutrii sau tergerii,
comparaia dintre valoarea din celula
curent i valoarea dorit


Timpul operaiei de cutare sau de
inserare este direct proporional cu
lungimea sondajului efectuat


Acesta se adun la timpul constant,
necesar calculului funciei de dispersie
Eficiena tabelelor de dispersie


Lungimea medie a sondajului (timpul
mediu de acces) depinde de coeficientul
de ncrcare (raportul dintre numrul de
elemente din tabel i dimensiunea
tabelei)


Pe msur ce coeficientul de ncrcare
crete, secvenele de sondaj devin din ce
n ce mai lungi
Adresarea deschis


Pierderea de eficien, la valori mari ale
coeficienilor de ncrcare, este mult mai
mare pentru diferitele scheme de adresare
deschis, dect n cazul nlnuirii
separate


n adresarea deschis, cutrile nereuite
dureaz mai mult dect cele reuite
Adresarea deschis


Pe parcursul unei secvene de sondaj,
algoritmul se oprete, imediat ce gsete
elementul dorit, ceea ce se ntmpl, n
medie, la jumtate din lungimea total a
secvenei


ntr-o cutare nereuit, algoritmul trebuie
s parcurg toat secvena, nefiind sigur
dac va gsi sau nu elementul
Sondajul liniar


Relaia dintre lungimea sondajului (P) i
coeficientul de ncrcare (L), n cazul
sondajului liniar, este:


P = (1 + 1 / (1 L)) / 2


Pentru o operaie nereuit, avem:


P = (1 + 1 / (1 L)
2
) / 2
Observaii


La un coeficient de ncrcare de 1/2, o
cutare reuit presupune efectuarea a
1,5 comparaii, n timp ce una nereuit
necesit 2,5 comparaii


La un coeficient de ncrcare de 2/3, o
cutare reuit presupune efectuarea a 2
comparaii, n timp ce una nereuit
necesit 5 comparaii
Observaii


Coeficientul de ncrcare nu trebuie s
depeasc 2/3 sau, dac este posibil, 1/2


Cu ct coeficientul de ncrcare este mai mic,
cu att se consum mai mult memorie,
pentru a stoca un anumit volum de date


Valoarea optim a coeficientului de ncrcare
depinde de compromisul dintre eficiena
utilizrii memoriei, care scade la valori mici
ale coeficientului, i viteza, care crete
Sondajul ptratic i dubla
dispersie


Performanele pentru metodele de sondaj
ptratic i dubla dispersie sunt descrise
prin ecuaii comune


Acestea indic o superioritate uoar fa
de sondajul liniar
Sondajul ptratic i dubla
dispersie


n cazul unei cutri reuite, avem:


P =

log
2

(1

L) / L


n cazul unei cutri nereuite, avem:


P = 1 / (1

L)
Observaii


La un coeficient de ncrcare de 1/2, att o
cutare reuit, ct i una nereuit,
necesit, n medie, dou sondaje


La un coeficient de ncrcare de 2/3,
valorile sunt 2,37 i 3


La un coeficient de ncrcare de 4/5,
valorile sunt 2,9 i 5
Observaii


Sondajul ptratic i dubla dispersie permit
valori ceva mai mari ale coeficientului de
ncrcare, fr o scdere a performanelor
Inlnuirea separat


Vrem s aflm ct dureaz inserarea unui
element ntr-o tabel de dispersie cu
nlnuire separat


Presupunem c operaia cea mai
consumatoare de timp este comparaia
cheii elementului cu celelalte chei din list
Inlnuirea separat


Presupunem c timpul necesar pentru
determinarea listei potrivite i pentru
detectarea sfritului unei liste este egal
cu timpul necesar unei comparaii


Durata total a operaiei este:


1 + nComps


unde nComps reprezint numrul
comparaiilor de chei
Observaii


Presupunem c tabela are arraySize
elemente, fiecare dintre acestea coninnd
o list, iar numrul elementelor inserate n
tabel este N


Lungime medie a listei = N / arraySize


L = N / arraySize


Lungimea medie a unei liste este egal cu
coeficientul de ncrcare
Cutarea


ntr-o operaie de cutare reuit,
algoritmul determin lista potrivit i apoi
caut elementul dorit n aceasta


n medie, trebuie examinate jumtate din
elemente, nainte de a-l gsi pe cel corect


Timpul de cutare mediu este:


1 + L / 2
Observaii


Aceast relaie este valabil, indiferent
dac listele sunt sau nu sortate


ntr-o cutare nereuit, dac listele sunt
neordonate, trebuie parcurse toate
elementele, deci timpul este:


1 + L
Observaii


n cazul listelor ordonate, o cutare
nereuit va examina, n medie, jumtate
dintre elemente, timpul fiind acelai ca i
pentru o operaie reuit


n metoda nlnuirii separate se utilizeaz
un coeficient de ncrcare de aproximativ
1 (numrul de elemente egaleaz
dimensiunea tabelei)
Observaii


Valorile mai mici ale factorului de
ncrcare nu determin mbuntiri
semnificative ale performanelor


Timpul necesar tuturor operaiilor crete
liniar, n raport cu coeficientul de
ncrcare, deci depirea valorii 2 nu este
recomandat
Inserarea


Dac listele nu sunt ordonate, inserarea
este ntotdeauna imediat, adic nu
necesit efectuarea de comparaii


Funcia de dispersie trebuie calculat, deci
timpul de inserare este de ordinul O(1)
Inserarea


Pentru liste sortate, ca i n cazul
cutrilor nereuite, trebuie examinate, n
medie, jumtate din elementele din list


Timpul de inserare este:


1 + L / 2
Adresarea deschis sau
nlnuirea separat


Dac se opteaz pentru adresarea
deschis, dubla dispersie are performane
ceva mai bune fa de sondajul ptratic


Excepia o constituie cazul n care
dispunem de un volum mare de memorie
i datele nu se mai expandeaz dup
crearea tabelei
Adresarea deschis sau
nlnuirea separat


Sondajul liniar este ceva mai uor de
implementat i, dac coeficientul de
ncrcare nu depete 1/2, funcioneaz
cu performane destul de bune


Dac numrul de elemente inserate nu
este cunoscut dinainte, este de preferat s
utilizm nlnuirea separat
Adresarea deschis sau
nlnuirea separat


Creterea coeficientului de ncrcare
determin scderi al performanelor n
metoda adresrii deschise


Pentru nlnuirea separat, scderea
performanelor este un proces liniar
Concluzii


Tabelele de dispersie au ca structuri de
baz tablourile


Domeniul de valori ale cheilor, este, de
regul, mai mare dect dimensiunea
tabelei


Valoarea unei chei este asociat unui
indice dintr-un tablou, utiliznd o funcie de
dispersie
Concluzii


Un dicionar poate fi implementat eficient
printr-o tabel de dispersie


Dispersia unei chei ntr-o celul deja
ocupat se numete coliziune


Coliziunile pot fi tratate n dou moduri:
Prin adresare deschis
Prin nlnuire separat
Concluzii


n adresarea deschis, elementele
asociate unei celule deja ocupate sunt
plasate n alte celule din tabel


n metoda nlnuirii separate, fiecare
celul din tabel este o list nlnuit


Toate elementele asociate acelei celule
sunt inserate n acea list
Concluzii


Exist trei metode distincte de adresare
deschis:
Sondajul liniar
Sondajul ptratic
Dubla dispersie
Concluzii


n metoda sondajului liniar, pasul de
deplasare este 1, deci, dac x este
indicele calculat de funcia de dispersie,
secvena de sondaj este:


x, x+1, x+2, x+3, ...


Numrul pailor necesari pentru a gsi un
anumit element se numete lungimea
sondajului
Concluzii


Sondajul liniar determin apariia
secvenelor continue de celule ocupate


Acestea se numesc fascicule primare i
determin o scdere a performanelor


n sondajul ptratic, deplasarea fa de
celula iniial x este ptratul numrului
iteraiei, deci secvena de sondaj este:


x, x+1, x+4, x+9, x+16, ...
Concluzii


Sondajul ptratic elimin fasciculele
primare, dar determin apariia problemei,
mai puin importante, a fasciculelor
secundare


Fasciculele secundare apar datorit
faptului c toate cheile care au asociat
aceeai valoare vor utiliza aceeai
secven de sondaj
Concluzii


Toate cheile asociate aceleiai valori
utilizeaz aceeai secven de sondaj, din
cauz c pasul de deplasare nu depinde
de cheie, ci numai de numrul iteraiei


n metoda dublei dispersii, pasul de
deplasare depinde de cheie, fiind obinut
prin utilizarea unei funcii secundare de
dispersie
Concluzii


Dac funcia secundar de dispersie
ntoarce valoarea s, secvena de sondaj
este:


x, x+s, x+2s, x+3s, x+4s, ...


unde valoarea s depinde de cheie, dar
rmne constant pe parcursul sondajului
Concluzii


Coeficientul de ncrcare este raportul
dintre numrul de elemente dintr-o tabel
de dispersie i dimensiunea maxim a
tabelei


Valoarea maxim a coeficientului de
ncrcare, n cazul adresrii deschise,
trebuie s fie 0,5
Concluzii


n metoda dublei dispersii, la un coeficient
de ncrcare de 0,5, lungimea medie a
unei secvene de sondaj este 2


n cazul adresrii deschise, timpii de
cutare tind spre infinit, pe msur ce
coeficientul de ncrcare se apropie de
valoarea 1
Concluzii


Este important ca tabelele cu adresare
deschis s nu fie foarte pline


nlnuirea separat permite utilizarea unui
coeficient de ncrcare de 1


La aceast valoare, secvena de sondaj
pentru o cutare reuit are lungimea
medie de 1,5, iar pentru o operaie
nereuit, de 2
Concluzii


Lungimea de sondaj crete liniar, n raport
cu coeficientul de ncrcare, n cazul
nlnuirii separate


Dimensiunea tabelei de dispersie trebuie
s fie, n general, un numr prim


Aceast condiie trebuie respectat n
special n cazul sondajului ptratic i al
dublei dispersii

S-ar putea să vă placă și