Sunteți pe pagina 1din 7

Algoritmi fundamentali - Curs 6

Conf. dr. Aurelian Nicola


2 martie 2018

1 Tabele de dispersie
2 Tabele cu adresare directă
Fie U = {0, 1, .., m−1} o mulţime din universul cheilor. Cheia identifică unic
o entitate. Pentru a reprezenta o multime dinamică de tip dicţionar folosim

Figura 1: Multimea universala

un tablou cu adresare directă. T [0..m − 1], K=mulţimea cheilor efective


K = 2, 3, 58. Locaţia k ofera elementul cu cheia k din mulţime. Operatii
asupra dictionarelor

• insereaza

1
• cauta

• sterge

cauta(T,k)
return T[k]

insereaza(T,x)
T[cheie[x]] = x

sterge(T,x)
T[cheie[x]] = nil

Fiecare din aceste operaţii este rapidă deoarece se efectuează ı̂n O(1). Dez-
avantaje: U este foarte mare şi K este mult mai micad̆ecât U . Operaţiile
depind de numărul de elemente al multimii K, adică de |K|. În adresarea
directă un element cu cheia k este memorat in locaţia k. În cazul tabelei
de dispersie elementul cu cheia k este memorat in locaţia h(k), unde h este
funcţia de dispersie h : U → {0, ..., m − 1}, mai exact transformă U ı̂n locaţii
ale unei tabele de dispersii T [0..m − 1]. O functie de dispersie h trebuie sa fie

Figura 2: Multimea universala.

deterministă (o intrare data k trebuie să producă ı̂ntotdeauna aceeasi ieşire

2
h(k)). Pot aparea coliziuni. Rezolvarea coliziunii prin inlăntuire
Prin inlănţuire punem toate elementele ce se dispersează ı̂n aceeaşi locaţie
ı̂ntr-o listă inlanţuită. Locatia j conţine un pointer către capul listei a tuturor
elementelor care dispersează ı̂n aceeaşi locaţie j.
insereaza(T,x)
insereaza x in capul listei T[h(cheie[x])]
cauta(T,x)
cauta un element cu cheia k in lista T[h(k)]
sterge(T,x)
sterge x din lista T[h(cheie[x])]

Figura 3: Rezolvarea coliziunilor ı̂ntr-o tabelă de dispersie folosind liste.

În această figură k1 , k4 dispersează in aceeaşi locaţie. În general funcţia de


dispersie este convenabil să fie aleasă aleator. Ce ı̂nseamnă să alegem o
funcţie de dispersie bună ? Cât de mult durează căutarea unui element având
o cheie dată. Să presupunem că Considerăm T este tabela de dispersie, m
numărul de locatii ,n numărul de elemente. Putem defini factorul de incărcare

α = m/n

ca fiind numărul mediu de elemente ce pot fi memorate ı̂ntr-o ı̂nlănţuire.


Dacă m şi n tind către infinit atunci α se duce către o valoare fixă. Cel mai
defavorabil caz este acela in care toate cheile se dispersează ı̂n aceeaşi locaţie.
Performanţa dispersiei ı̂n cazul mediu depinde de cât de bine distribuite (ı̂n

3
medie) funcţia de dispersie h mulţimea cheilor ce trebuie memorate ı̂n cele m
locaţii. Vom presupune că orice element se poate dispersa ı̂n oricare din cele
m locaţii cu aceeaşi probabilitate independent de locul unde s-au dispersat
celelalte elemente.

3 Funcţii de dispersie
În cele prezentate de aici ı̂n continuare are loc ipoteza dispersiei uniforme
simple. Fiecare cheie se poate dispersa cu aceeaşi probabilitate ı̂n fiecare
din cele m locaţii. O funcţie de dispersie bună satisface ipoteza dispersiei
uniforme simple. Fie P (k) = probabilitatea de a alege cheia k. Atunci avem
că
X 1
P (k) = , j = 0, ..., m − 1
h(k)=j
m
Daca s-ar cunoaşte valoarea lui P (k) atunci am putea verifica aceasta relaţie.
Exemplu: unde m = 10 si k = 0.5.
Metoda diviziunii
Metoda diviziunii este o metodă ı̂n care funcţia de dispersie este aleasă ca
fiind
h(k) = k mod n.
De exemplu dacă considerăm m = 12, atunci avem că k = 100 de unde prin
ultima evaluare avem că h(k) = 4. Valori potrivit de bune pentru m sunt
acele numere prime care sunt nu prea apropiate de puterile exacte ale lui 2.
Un exemplu de acest fel ar fi m = 701 Metoda inmultirii

• Pas 1. Inmultim cheia k cu o constanta si extragem partea fractionara


a lui kA.

• Pas 2. Inmultim aceasta valoare cu m si consideram partea intreaga


inferioara

Metoda ı̂nmulţirii descrisă mai sus poate fi observată uşor prin acest exemplu

h(k) = bm(kA mod 1)c = bm(kA − bkAc)c

k = 123456, m = 10000, h(k) = 41

4
Pe scurt dacă considerăm funcţia de dispersie

h(k) = bm(kA mod 1)c

unde kA mod 1 ı̂nseamnă partea fracţionară a lui kA, adică kA−bkAc√atunci


avem următorul exemplu dacă luăm m = 10000, k = 123456 şi A = 5−1 2
=
0.618033, atunci
h(k) = b10000 × (123456 × 0.61803...mod1)c
= b10000 × (76300.0041151...mod1)c
= b10000 × 0.0041151...c
= b41.151...c
= 41

Avantajul acestei metode este că valoarea lui m poate fi schimbată.

4 Adresare dechisa
Prin adresare deschisă toate elementele sunt memorate ı̂n interiorul tabelei
de dispersie. Astfel, tabela de dispersie se poate umple astfel ı̂ncât nici o
inserare nu mai este posibilă. Factorul de ı̂ncărcare nu poate depăşi valoarea
1. Secvenţa de locaţii care se examinează nu se determină folosind pointeri
ci se calculează. Pentru a analiza inserarea examinăm succesiv sau verificăm
tabela de dispersie până găsim o locaţie liberă.
inserarea(T,k)
i=0
repeat
j=h(k,i)
if T[j]=nil
then T[j]=k
else i=i+1
endif
until (i=n)
cauta(T,k)
i=0
repeat
j=h(k,i)
if T[j]=k

5
then return j
else i=i+1
endif
until (T[j]=nil) or (i=m)
return nil

Verificarea liniară
Fiind dată o alta funcţie h0 de dispersie putem construi

h(k, i) = (h0 (k) + i)mod m

pentru fiecare
i = 0, ..., m − 1.
Dacă se dă cheia k prima intrare verificată este T [h0 (k)] pâna la ultima
T [m − 1] . Avem doar m secvenţe de căutari posibile. Probleme pen-
tru temă

1. Se consideră o mulţime dinamică S care este reprezentată printr-o ta-


belă T cu adresare directă cărei lungime este dată ca fiind m. Descrieţi
o procedură sau funcţie folosind limbajul pseudocod care găseşte ele-
mentul maxim din S. Care este perfomana̧ procedurii ı̂n cazul cel mai
defavorabil ?

2. Un vector de biţi este un tablou simplu care con ţine numai valorile
0 si 1. Este evident faptul că un vector de biţi de lungime m ocupă
mult mai puţin spai̧u decât un tablou de m pointeri. Descrieţi cum se
poate folosi un vector de biţi pentru a reprezenta o mulţime dinamică
având elemente distincte, fără avea date adiţionale. Operaţiile pentru
dicţionare ar trebui să funcţioneze ı̂ntr-un timp O(1).

3. Ilustraţi inserarea cheilor 5,28,19,15,20,33,12,17,10 ı̂ntr-o tabelă de dis-


persie cu coliziunile rezolvate prin ı̂nlănţuire. Tabela are lungimea de
9 locaţii iar funcţia de dispersie este h(k) = k mod 9.

4. Se consideră o tabela de dispersie de dimensiune m=1000√si functia


de dispersie h(k)=[m(kA mod 1)]pentru valoarea A = ( 5 − 1)/2.
Calculaţi locatiile ı̂n care se pun cheile 61,62,63,64 si 65.

6
Bibliografie
[1] Peter Braess, Advanced Data Structures, 2008.

[2] http://www.infoarena.ro/

[3] http://cs.anu.edu.au/ Alistair.Rendell/Teaching/

[4] ADVANCED DATA STRUCTURE and Algorithms for industry, Silicon


Institute of Technology.

[5] Thomas Cormen, Charles Lerseison, Ronald Rivest, Clifford Stein, In-
troduction to algorithms, Third edition, MIT Press 2009.

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