TABELE DE DISPERSIE I. CONSIDERAŢII TEORETICE

Σχετικά έγγραφα
Metode iterative pentru probleme neliniare - contractii

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

Curs 1 Şiruri de numere reale

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

Subiecte Clasa a VIII-a

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

Metode de interpolare bazate pe diferenţe divizate

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

B={0,1,...,MAX-1} : K

Criptosisteme cu cheie publică III

Curs 4 Serii de numere reale

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

riptografie şi Securitate

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

Asupra unei inegalităţi date la barajul OBMJ 2006

MARCAREA REZISTOARELOR

5.4. MULTIPLEXOARE A 0 A 1 A 2

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

Integrala nedefinită (primitive)

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

V O. = v I v stabilizator

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

Esalonul Redus pe Linii (ERL). Subspatii.

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Lucrare. Varianta aprilie I 1 Definiţi noţiunile de număr prim şi număr ireductibil. Soluţie. Vezi Curs 6 Definiţiile 1 şi 2. sau p b.

Laborator 11. Mulţimi Julia. Temă

III. Reprezentarea informaţiei în sistemele de calcul

Sisteme diferenţiale liniare de ordinul 1

8 Intervale de încredere

Examen AG. Student:... Grupa:... ianuarie 2011

Seminar 5 Analiza stabilității sistemelor liniare

riptografie şi Securitate

Subiecte Clasa a VII-a

Curs 2 Şiruri de numere reale


Ovidiu Gabriel Avădănei, Florin Mihai Tufescu,

a. 11 % b. 12 % c. 13 % d. 14 %

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

prin egalizarea histogramei

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

EDITURA PARALELA 45 MATEMATICĂ DE EXCELENŢĂ. Clasa a X-a Ediţia a II-a, revizuită. pentru concursuri, olimpiade şi centre de excelenţă

Principiul incluziunii si excluziunii. Generarea şi ordonarea permutărilor. Principiul porumbeilor. Pri

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

Spatii liniare. Exemple Subspaţiu liniar Acoperire (înfăşurătoare) liniară. Mulţime infinită liniar independentă

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1)


Examen AG. Student:... Grupa: ianuarie 2016

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

Laborator 6. Integrarea ecuaţiilor diferenţiale

Stabilizator cu diodă Zener

Valori limită privind SO2, NOx şi emisiile de praf rezultate din operarea LPC în funcţie de diferite tipuri de combustibili

7 Distribuţia normală

Metode de sortare. Se dau n numere întregi, elemente ale unui vector a. Se cere să se aranjeze elementele vectorului a în ordine crescătoare.

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

2 Transformări liniare între spaţii finit dimensionale

Subiecte Clasa a V-a

După cum se observă, tabela din figură, ca şi marea majoritate a tabelelor, este alcătuită din articole.

Să se arate că n este număr par. Dan Nedeianu

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Erori si incertitudini de măsurare. Modele matematice Instrument: proiectare, fabricaţie, Interacţiune măsurand instrument:

Sisteme liniare - metode directe

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

Curs 2 DIODE. CIRCUITE DR

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

Statisticǎ - curs 3. 1 Seria de distribuţie a statisticilor de eşantioane 2. 2 Teorema limitǎ centralǎ 5. 3 O aplicaţie a teoremei limitǎ centralǎ 7

VII.2. PROBLEME REZOLVATE

Geometrie computationala 2. Preliminarii geometrice

Functii Breviar teoretic 8 ianuarie ianuarie 2011

Cursul Măsuri reale. D.Rusu, Teoria măsurii şi integrala Lebesgue 15

9 Testarea ipotezelor statistice

Toate subiectele sunt obligatorii. Timpul de lucru efectiv este de 3 ore. Se acordă din oficiu 10 puncte. SUBIECTUL I.

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

Proiectarea algoritmilor: Programare dinamică

Teme de implementare in Matlab pentru Laboratorul de Metode Numerice

Proiectarea Algoritmilor 2. Scheme de algoritmi Divide & Impera

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

Exemple de probleme rezolvate pentru cursurile DEEA Tranzistoare bipolare cu joncţiuni

1.3 Baza a unui spaţiu vectorial. Dimensiune

4. Măsurarea tensiunilor şi a curenţilor electrici. Voltmetre electronice analogice

Problema a II - a (10 puncte) Diferite circuite electrice

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Tablouri unidimensionale

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

Sortare. 29 martie Utilizarea şi programarea calculatoarelor. Curs 16

Noţiuni introductive

* K. toate K. circuitului. portile. Considerând această sumă pentru toate rezistoarele 2. = sl I K I K. toate rez. Pentru o bobină: U * toate I K K 1

5.1. Noţiuni introductive

Analiza funcționării și proiectarea unui stabilizator de tensiune continuă realizat cu o diodă Zener

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

Transcript:

TABELE DE DISPERSIE I. CONSIDERAŢII TEORETICE Termenul de "dispersie" evocă imaginea unei fărâmiţări şi amestecări aleatoare. Definiţie: o structură eficientă de date pentru implementarea dicţionarelor 1. În cazul cel mai defavorabil căutarea unui element într-o tabelă de dispersie poate necesita la fel de mult timp ca şi căutarea unui element într-o listă înlănţuită - O(n). În anumite ipoteze rezonabile, timpul necesar căutării unui element într-o tabelă de dispersie este O(1). Reprezintă o generalizare a noţiunii de tablou. Adresarea directă într-un tablou foloseşte abilitatea de a examina o poziţie arbitrară în tablou într-un timp O(1). Adresarea directă este aplicabilă în cazul în care este posibilă alocarea în tablou a câte unei poziţii pentru fiecare cheie posibilă. Tabela de dispersie reprezintă o alternativă eficientă la adresarea directă într-un tablou când numărul cheilor memorate efectiv este relativ mic faţă de numărul total de chei posibile (foloseşte în mod normal un tablou de mărime proporţională cu numărul de chei memorate efectiv). Cheia nu este folosită ca indice în tablou ci indicele este calcudat pe baza cheii. Dispersia reprezintă o tehnică extrem de eficientă şi practică; operaţiile de bază pentru dicţionare necesită, în medie, doar un timp O(1). Tabele cu adresare directă Adresarea directă este o tehnică simplă care funcţionează bine atunci când universul U al cheilor este rezonabil de mic. Pentru a reprezenta o mulţime dinamică este folosit fie un tablou fie o tabelă cu adresare directă T[0..m-1], în care fiecare poziţie sau locaţie corespunde unei chei din universul U. Prin adresare directă, un element având cheia k este memorat în locaţia k. ADRESARE-DIRECTĂ-CAUTĂ(T, k) returnează T[k] ADRESARE-DIRECTĂ-INSEREAZĂ(T, x) T[cheie[x]] x ADRESARE-DIRECTĂ-ŞTERGE(T, x) T[cheie[x]] NIL Elementele din mulţimea dinamică sunt stocate în tabela cu adresare directă nu prin memorarea cheii elementului şi a datelor adiţionale într-un obiect extern tabelei ci printr-un pointer dintr-o poziţie din tabelă către obiect în locaţia respectivă, economisind spaţiu. Mai mult, deseori nu este necesar să memorăm câmpul cheie al obiectului, deoarece dacă avem indicele unui obiect în tabelă avem şi cheia sa. Dacă cheile nu sunt memorate, trebuie să existe o modalitate de a afirma că locaţia este goală. 1 Structură de date care permite executarea efficientă a operațiilor Insert, Delete și Search.

Tabele de dispersie Dificultatea în adresarea directă, dacă universul U este mare, constă în memorarea tabelului T, dată fiind limitarea resurselor a unui calculator uzual. Mai mult mulţimea K a cheilor efectiv memorate poate fi atăt de mică relativ la U, încât majoritatea spaţiului alocat pentru T ar fi irosit. Cerinţele de memorare pot fi reduse la O( K ), chiar şi atunci când căutarea unui element în tabela de dispersie necesită tot un timp O(1) (margine stabilită pentru timpul mediu, în timp ce pentru adresarea directă ea era valabilă pentru cazul cel mai defavorabil). Prin dispersie, un element având cheia k este memorat în locaţia h(k) - o funcţie de dispersie h folosită pentru a calcula locaţia pe baza cheii k; h transformă universul U al cheilor în locaţii ale unei tabele de dispersie T[0.. m - 1] (elementul cu cheia k se dispersează în locaţia h(k)). Scopul funcţiilor de dispersie este de a reduce domeniul indicilor tabloului care trebuie manipulaţi. În loc de U valori, vor trebui manipulate doar m valori. Cerinţele de memorare sunt reduse corespunzător. Evitarea totală a coliziunilor este imposibilă; întrucât U > m, există cu siguranţă două chei care să aibe aceeaşi valoare de dispersie. Dezavantajul tabelelor de dispersie constă în faptul că două chei se pot dispersa în aceeaşi locaţie (coliziune). Există însă tehnici eficiente pentru rezolvarea conflictelor - evitarea sau minimizarea lor - prin alegerea potrivită a funcţiei de dispersie h. Funcţia de dispersie h trebuie să fie deterministă (intrare dată k trebuie să producă întotdeauna aceeaşi ieşire h(k)). REZOLVAREA COLIZIUNII PRIN ÎNLĂNŢUIRE Toate elementele ce se dispersează în aceeaşi locaţie sunt stocate într-o listă înlănţuită (locaţia j conţine un pointer către capul listei tuturor elementelor care se dispersează în locaţia j; dacă nu există astfel de elemente locaţia j conţine NIL). DISPERSIE-CU-ÎNLĂNŢUIRE-INSEREAZĂ(T, x) Inserează x în capul listei T[h[cheie[x]] DISPERSIE-CU-ÎNLĂNŢUIRE-CAUTĂ(T, k) Caută un element cu cheia k în lista T[h[k]] DISPERSIE-CU-ÎNLĂNŢUIRE-ŞTERGE(T, x) Şterge x din lista T[h[cheie[x]] Timpul de execuţie pentru inserare fn cazul cel mai defavorabil este O(1). Pentru căutare, timpul de execuţie, în cazul cel mai defavorabil este proporţional cu lungimea listei. Ştergerea unui element x poate fi realizată într-un timp O(1) dacă listele sunt dublu înlănţuite. Dacă listele sunt simplu înlănţuite, ştergerea şi căutarea au acelaşi timp de execuţie. Analiza dispersiei cu înlănţuire

Definiţie: factorul de încărcare al unei tabele de dispersie T cu m locaţii ce memorează n elemente este egal cu α = n/m, raport ce reprezintă numărul mediu de elemente memorate într-o înlănţuire. Comportamentul, în cazul cel mai defavorabil, al dispersiei prin înlănţuire este slab: toate cele n chei se dispersează în aceeaşi locaţie, creând o listă de lungime n. Timpul de căutare pentru cazul cel mai defavorabil este astfel O(n) plus timpul pentru calculul funcţiei de dispersie. Tabelele de dispersie nu sunt folosite pentru performanţa lor în cazul cel mai defavorabil. Definiţie: dispersie uniformă simplă - dispersarea elementelor în oricare din cele m locaţii cu aceeaşi probabilitate, independent de locul în care s-au dispersat celelalte elemente. Performanţa dispersiei în cazul mediu depinde de funcţia de dispersie h. Într-o tabelă de dispersie în care coliziunile sunt rezolvate prin înlănţuire, o căutare cu şi fără succes necesită, în medie, un timp O(1 + α), în ipoteza dispersiei uniforme simple. Valoarea de dispersie h(k) poate fi calculată fntr-un timp O(1). Timpul necesar pentru căutarea unui element având cheia k depinde liniar de lungimea listei T[h[k]]. Funcţii de dispersie O funcţie de dispersie bună satisface (aproximativ) ipoteza dispersiei uniforme simple. Pentru crearea lor, în practică, se pot folosi tehnici euristice. Se disting trei tipuri: Dispersia prin diviziune. Dispersia prin înmulţire. Dispersia universală. Informaţia calitativă despre P(distribuţia de probabilitate) este uneori utilă în procesul de construcţie al funcţilor de dispersie. Exemplu: Se consideră o tabelă de simboluri a unui compilator, în care cheile sunt şiruri de caractere arbitrare, reprezentând identificatori dintr-un program. O situaţie des întâlnită este aceea în care simboluri foarte asemănătoare, ca pt şi pts, apar în acelaşi program. O funcţie de dispersie bună va minimiza posibilitatea ca asemenea variaţii să se disperseze în aceeaşi locaţie. Tendinţa este de a obţine valoarea de dispersie într-un mod independent de orice model sau şablon ce poate exista între date. Interpretarea cheilor ca numere naturale Majoritatea funcţiilor de dispersie presupun universul cheilor din mulţimea N a numerelor naturale. Dacă cheile nu sunt numere naturale, trebuie găsită o modalitate pentru a le interpreta ca numere naturale. Exemplu: o cheie care este un şir de caractere poate fi interpretată ca un întreg într-o bază de numeraţie aleasă convenabil. Identificatorul pt poate fi interpretat ca o pereche de numere zecimale (112,116), p = 112 şi t = 116 în mulţimea codurilor ASCII; pt exprimat ca un întreg în baza 128 devine (112 128)+116=14452. Metoda diviziunii

Calculează valoarea de dispersie ca fiind restul împărţirii cheii k la un număr prim specificat. În afara cazului în care numărul este într-un fel dependent de şabloanele din distribuţia de probabilitate P, această metodă dă rezultate bune. Funcţia de dispersie este: h(k) = k mod m. Este foarte rapidă (necesită doar o singură operaţie de împărţire). În acest caz este utilă evitarea anumitor valori ale lui m (puteri ale lui 2, puteri ale lui 10). Este bine ca funcţia de dispersie să fie construită eventual dependentă de toţi biţii cheii. Valori bune pentru m sunt numerele prime nu prea apropiate de puterile exacte ale lui 2. Metoda înmulţirii Operează în doi paşi: în primul pas, se înmulţeşte cheia k cu o constantă A din intervalul 0 < A < 1 şi extragem partea fracţionară a lui ka. Apoi, această valoare este înmulţită cu m şi se preia partea întreagă inferioară a rezultatului. Funcţia de dispersie este: h(k) = [m (k A mod 1)] unde "k A mod 1" reprezintă partea fracţionară a lui k A, adică k A - [k A]. Avantaj: valoarea lui m nu este critică. Uzual se alege m ca fiind o putere a lui 2. Pentru ca dispersia obţinută să fie optimă este necesară o alegere atentă a constantei A. Knuth sugerează ca A = ( 5-1) / 2 0.6180339887... Dispersia universală În cazul cel mai defavorabil, orice funcţie de dispersie fixată poate determina ca n chei să fie dispersate în aceeaşi locaţie, rezultând un timp mediu de acces O(n). Produce în medie o performanţă bună, indiferent de ce chei sunt alese de către adversar. Se bazează pe selectarea funcţiei de dispersie în mod aleator în momentul execuţiei, dintr-o clasă de funcţii construită cu atenţie, alegere care să fie independentă de cheile care se vor memora. Randomizarea asigură că nici o intrare nu va produce comportamentul în cazul cel mai defavorabil. Datorită randomizării, algoritmul se poate comporta diferit la fiecare execuţie, chiar pentru o aceeaşi intrare. Această abordare asigură o performanţă bună pentru cazul mediu, indiferent de cheile care sunt date ca intrare. O clasă universală de funcţii de dispersie dă un comportament bun în cazul mediu. Dacă h este aleasă dintr-o colecţie universală de funcţii de dispersie şi este folosită pentru a dispersa n chei într-o tabelă de dimensiune m, unde n m, numărul mediu de coliziuni în care este implicată o cheie particulară k, este mai mic decât 1. REZOLVAREA COLIZIUNII PRIN ADRESARE DESCHISĂ Prin adresare deschisă, toate elementele sunt memorate în interiorul tabelei de dispersie (fiecare intrare în tabelă conţine fie un element al mulţimii dinamice, fie NIL). Nu există liste sau elemente memorate în afara tabelei, aşa cum se întâmplă în cazul înlănţuirii. Avantaj: adresarea deschisă evită total folosirea pointerilor. Spaţiul de memorie suplimentar, eliberat prin faptul că nu memorăm pointerii, oferă tabelei de dispersie un

număr mai mare de locaţii pentru acelaşi spaţiu de memorie, putând rezulta coliziuni mai puţine şi acces mai rapid. Prin adresare deschisă, tabela de dispersie se poate "umple" astfel încât nici o inserare nu mai este posibilă; factorul de încărcare a nu poate depăşi niciodată valoarea 1. Secvenţa de locaţii care se examinează nu se determină folosind pointerii, ci se calculează. Inserarea într-o tabela de dispersie cu adresare deschisă, se face verificând tabela până când se găseşte o locaţie liberă în care se poate memora cheia. În loc să fie fixat în ordinea 0, 1,..., m - 1 (care necesită un timp de căutare O(n)), şirul de poziţii examinate depinde de cheia ce se inserează. Pentru determinarea locaţiilor care vor fi verificate, funcţia de dispersie este extinsă astfel încât ea să includă şi numărul de verificare (începând de la 0) ca un al doilea argument. Funcţia de dispersie este: h: U x {0, l,...,m-1} {0, l,...,m-1}. DISPERSIE-INSEREAZĂ(T, k) 1: i 0 2: repetă 3: j h(k, i) 4: dacă T[j] = NIL atunci 5: T[j] k 6: returnează j 7: altfel 8: i i+1 9: până când i = m 10: eroare "depăşire tabela de dispersie" DISPERSIE-CAUTĂ(T, k) 1. i 0 2: repetă 3: j h(k, i) 4: dacă T[j] = NIL atunci 5. returnează j 6: i i+1 7: până când T[j] = NIL sau i = m 8: returnează NIL Ştergerea dintr-o tabelă de dispersie cu adresare deschisă este dificilă. Ştergerea unei chei dintr-o locaţie i, nu poate fi făcută prin marcarea acelei locaţii drept liberă memorând în ea valoarea NIL. O soluţie este de a marca locaţia, memorând în ea valoarea specială ŞTERS în loc de NIL. Apoi procedura DISPERSIE-INSEREAZĂ este modificată astfel încât să trateze astfel de locaţii ca şi când ar fi libere, astfel încât o nouă cheie să poată fi inserată. DISPERSIE-CAUTĂ nu necesită nici o modificare întrucât va trece peste valorile ŞTERS în timpul căutării. Timpul de căutare nu mai depinde de factorul de încărcare α şi astfel, în cazul în care cheile trebuie şterse, este preferabilă înlănţuirea ca tehnică de rezolvare a coliziunilor.

Este folosită ipoteza dispersiei uniforme: fiecare cheie considerată poate avea, cu aceeaşi probabilitate, oricare dintre cele m! permutări ale mulţimii {0, 1,..., m-1} ca secvenţă de verificare. Funcţia de dispersie produce nu doar un singur număr, ci o întreagă secvenţă de verificare; dispersia uniformă reală este dificil de implementat şi în practică sunt folosite aproximări convenabile (dispersia dublă). Se disting trei tehnici pentru calcularea secvenţelor de verificare necesare adresării deschise: Verificarea liniară. Verificarea pătratică. Dispersia dublă. Nici una dintre aceste tehnici nu satisface condiţia dispersiei uniforme, deoarece nici una dintre ele nu e capabilă să genereze mai mult de m 2 secvenţe de verificare diferite (în loc de m! cât cere dispersia uniformă). Dispersia dublă are cel mai mare număr de secvenţe de verificare şi dă cele mai bune rezultate. Verificarea liniară Funcţia de dispersie este: h(k,i) = [h'(k) + i] mod m, unde h' : U {0, 1,..., m-1} este o funcţie de dispersie ordinară, pentru i = 0, 1,..., m-1. Este uşor de implementat singura problemă constituind-o aşa numita grupare primară (şiruri lungi de locaţii ocupate, crescând timpul mediu de căutare). Grupările au probabilitate mare de apariţie, pentru că dacă o locaţie liberă este precedată de i locaţii ocupate, atunci probabilitatea ca locaţia liberă să fie următoarea completată este (i+1)/m, comparativ cu probabilitatea de 1/m pentru cazul în care locaţia precedentă ar fi fost liberă. Rezultă că şirurile de locaţii ocupate tind să se lungească mai mult, verificarea liniară nefiind o aproximare foarte bună a dispersiei uniforme. Verificarea pătratică Funcţia de dispersie este: h(k,i) = [h'(k) + c 1 i + c 2 i 2 ] mod m, unde h' : U {0, 1,, m- 1} este o funcţie de dispersie ordinară, c l şi c 2 0 sunt constante auxiliare şi i = 0, 1,..., m-1. Metoda lucrează mult mai bine decât verificarea liniară, dar pentru utilizarea integrală a tabelei de dispersie valorile lui c l şi c 2 şi m trebuie determinate corespunzător. Există o formă mai uşoară de grupare, numită grupare secundară. Verificarea iniţială determină întreaga secvenţă, fiind folosite astfel doar m secvenţe de verificare distincte. Dispersia dublă Funcţia de dispersie este: h(k, i) = [h 1 (k) + i h 2 (k)] mod m, unde h 1 şi h 2 sunt funcţii de dispersie auxiliare. Dispersia dublă este una dintre cele mai bune metode disponibile pentru adresarea deschisă. Reprezintă o îmbunătăţire faţă de verificarea liniară sau pătratică în sensul că sunt folosite θ(m 2 ) secvenţe de verificare, faţă de θ(m), pentru că fiecare pereche posibilă [h l (k), h 2 (k)] produce o secvenţă de verificare distinctă şi când cheia variază, poziţia iniţială a verificării h l (k) şi decalajul h 2 (k) pot varia independent.

Valoarea h 2 (k) şi dimensiunea tabelei de dispersie m trebuie să fie prime între ele pentru a fi parcursă întreaga tabelă de dispersie. În caz contrar, dacă m şi h 2 (k) au un cel mai mare divizor comun d > 1 pentru o cheie k, atunci o căutare pentru cheia k va examina doar a (1/d)-a parte din tabela de dispersie. Pentru asigurarea acestei condiţii este suficient a alege m ca o putere a lui 2 şi de a construi h 2 astfel încât să producă întotdeauna un număr impar. O altă modalitate este de a avea m prim şi de a construi h 2 astfel încât să returneze întotdeauna un întreg pozitiv mai mic decât m. Ca rezultat performanţa dispersiei duble apare ca fiind foarte apropiată de performanţa schemei "ideale" a dispersiei uniforme. Analiza dispersiei cu adresare deschisă Este exprimată în termenii factorului de încărcare a al tabelei de dispersie (α = n/m), când n şi m tind spre infinit. Întrucât prin adresare deschisă, există cel mult un element într-o locaţie n m, ceea ce implică α 1. O cheie dată are o secvenţă de verificare unică, fixă, asociată ei; presupunând o dispersie uniformă, secventa de verificare pentru orice cheie k poate să apară sub forma oricărei permutări a mulţimii (0, 1,..., m - 1). Considerând distribuţia de probabilitate pe spaţiul cheilor şi operaţia funcţiei de dispersie pe chei, fiecare secvenţă de verificare posibilă are aceeaşi probabilitate de apariţie. Într-o tabelă de dispersie cu adresare deschisă cu factorul de încărcare α = n/m < 1, în ipoteza dispersiei uniforme, numărul mediu de verificări dintr-o căutare fără succes este cel mult 1/(1 - α). Interpretare intuitivă: prima verificare se face întotdeauna, a doua verificare este necesară cu o probabilitate aproximativ egală cu α, a treia verificare este necesară cu o probabilitate aproximativ egală cu α 2, ş.a.m.d. Inserarea unui element într-o tabelă de dispersie cu adresare deschisă, cu factorul de încărcare α necesită, în cazul mediu, cel mult 1/(1 - α) verificări, în ipoteza dispersiei uniforme. Într-o tabelă de dispersie cu adresare deschisă cu factorul de încărcare α < 1, în ipoteza dispersiei uniforme şi presupunând că fiecare cheie din tabelă este căutată cu aceeaşi probabilitate, numărul mediu de verificări într-o căutare cu succes este cel mult: 1 1 ln α 1- α II. APLICAŢII II.1. Scrieţi un program care implementează o tabelă de dispersie și operaţiile aferente pentru determinarea frecvenței de apariție a cuvintelor dintr-un text folosind funcţiile descrise mai jos. Se consideră cuvinte de maxim 50 de caractere și o tabelă de dispersie de M=127 de intrări. Se consideră structura de date şi prototipurile următoarelor funcţii: typedef struct tnod{ char *cuvant;

int frecventa; struct tnod *next; }TNOD; TNOD *prad; int i; TNOD *thash[m]; // tabela de dispersie int hf(char *s) /* Calculeaza dispersia cuvantului spre care pointeaza s */ TNOD *hcaut(char *s,int h) /* Cauta inregistrarea spre a carei cheie pointeaza s si de dispersie h; returneaza pointerul spre inregistrarea gasita sau NULL daca nu exista */ int incnod(tnod *p); /* Citeste de la tastatura un sir de caractere si incarca nodul spre care pointeaza p */ /****************************************main()**************************************/ /* Initializare tabela de dispersie - tabloul thash */ for(i=0;i<m;i++) thash[i]=null;... if(((p=(tnod *)malloc(sizeof(tnod)))!=null) && (incnod(p)==1)) {/* s-a rezervat zona pentru nodul curent si s-au incarcat datele nodului in zona rezervata */ h=hf(p->cuvant); /* codul determinat de functia de dispersie */... if(thash[h]!=null) { if((q=hcaut(p->cuvant,h))!=null) /* se incrementeaza frecventa lui fara a se mai insera in tabela */... else { /* se adauga nodul in tabela hash la codul determinat de functia de dispersie daca cuvantul continut de nod nu exista deja in lista; */ p->next=thash[h]; thash[h]=p; return p; } } else { // prima inserare in tabela de dispersie thash[h]=p; p->next=null; return p; } /* Se listeaza cuvintele citite si frecventa lor */ for(i=0;i<m;i++) for(prad=thash[i];prad!=null;prad=prad->next) printf(" %50s are frecventa %5d\n",prad->cuvant,prad->frecventa); II.2. În fișierul hash_table.in se găsesc numere întregi care se încadrează în tipul int. Scrieți o structură de tip tabelă de dispersie care să memoreze aceste numere în liste, fiecare listă conținând numere

diferite în ordine crescătoare care au același semn și aceeași ultimă cifră. Scrieți funcții care crează o astfel de structură și o afișează. Tipurile de date folosite sunt: typedef struct nod{ int info; struct nod *leg; }TLista; typedef struct nodhash{ TLista *lista; struct nod Hash*leg; }THashTable; TLista *nodlista(int info, TLista *urm); /* Returnează un element de tip TLista* cu informația și succesorul date ca parametrii. Va fi utilizată în cadrul funcției de creare a unei liste. */ THashTable *nodhashtable(tlista *lista, THashTable *urm); /* Returnează un element de tip THashTable* fiind folosită la crearea void insereazainlista(tlista **cap, int nr); tabelei de dispersie. */ /* Se inserează un nod nou având ca informație numărul nr primit ca parametru păstrându-se relația de ordine. Se testează dacă lista este inițial vidă. Dacă nr este mai mic decât primul din listă se inserează nr în față. Dacă nu, atunci se parcurge lista și se inserează în poziția corespunzătoare. */ void insereazainhashtable(thashtable **t, int nr); /* Va insera un număr nr în tabela de dispersie, în lista coresunzătoare, care are proprietatea că elementele sale au aceeași ultimă cifră și același semn. Se tratează cazurile: Dacă nr % 10 este mai mic decât cheia primei liste deja introduse, se va genera o nouă listă și se inserează nr în față. În caz de egalitate se introduce în lista existentă. Dacă nu, atunci se parcurge tabela de dispersie și se inserează în lista de pe poziția corespunzătoare folosindu-se de insereazainlista(, ). */ II.3. Modificați programul de mai sus astfel încât să fie introduse în aceeași listă toate numerele care au ultima cifră identică. De exemplu, -563 va fi introds în aceeași listă cu -43. BIBLIOGRAFIE [Log06] Logofătu D. Bazele programării în C. Aplicații, Editura Polirom, 2006. [Cor90] Cormen, T. H., Leiserson, C. E., Rivest, R. L. Introduction to Algorithms. McGraw-Hill, New York, 1990. [Cer06] Cerchez E., Șerban M. Programarea în limbajul C/C++ pentru liceu, Editura Polirom, 2006.