You are on page 1of 7

Aplicatii.

Tabele de dispersie
M asurarea performant ei: funct ii pentru timp si numere aleatoare Tabele de dispersie Aplicat ie: tabele de simboluri

10 ianuarie 2005

Programarea calculatoarelor 2. Curs 12

Marius Minea

Aplicatii. Tabele de dispersie

Analiza timpului de rulare al algoritmilor


Metode teoretice relat ii matematice pentru cazul cel mai defavorabil (uneori si mediu, mai rar: cel mai favorabil) de regul a, nu timpul zic, ci num arul de operat ii de un anumit tip (ex. pt. sortare: num arul de comparat ii, num arul de interschimb ari) Evaluare practic a prin rularea programelor pe diverse seturi de date (aleatoare sau cu anumite propriet a ti), si m asurarea timpilor de execut ie Discut am: funct ii pentru generarea de numere (pseudo)aleatoare funct ii legate de m asurarea timpului

Programarea calculatoarelor 2. Curs 12

Marius Minea

Aplicatii. Tabele de dispersie

Funct ii pentru manipularea timpului (time.h)

Tipuri denite pentru reprezentarea timpului: clock_t si time_t (sunt de fapt tipuri aritmetice, de ex. unsigned sau unsigned long) clock_t clock(void); returneaz a timpul scurs de la lansarea programului, n unit a ti de ceas date de constanta CLOCKS_PER_SEC ( n standardul POSIX, 1 milion) e o aproximat ie dependent a de granularitatea ceasului de timp real poate interveni dep a sire (pe sistem de 32 de bit i, dup a cca 72 min.) time_t time(time_t *timer); returneaz a o valoare aritmetic a reprezent and data/ora curent a ( n UNIX, num arul de secunde trecute de la 1 ian. 1970 UTC) dac a argumentul pointer e nenul, valoarea e stocat a si la acea adres a double difftime(time_t time1, time_t time0); returneaz a diferent a exprimat a n secunde, ca double Pentru reprezent ari descompuse (zi/or a/min./etc.): tipul struct tm (vezi detalii n standard)
Programarea calculatoarelor 2. Curs 12 Marius Minea

Aplicatii. Tabele de dispersie

Funct ii pentru numere pseudoaleatoare (stdlib.h)


Numerele generate sunt pseudo aleatoare (de fapt deterministe, bazate pe un algoritm, dar cu distribut ie c at mai uniform a) (numere cu adev arat aleatoare ar trebui s a e bazate pe fenomene zice, ex. aruncarea unei monede sau descompunerea unor particule) int rand(void); returneaz a un num ar pseudoaleator ntre 0 si RAND_MAX (min. 32767) pt. un num ar aleator ntre 1 si N putem folosi 1 + rand() % N void srand(unsigned int seed); reinit ializeaz a generatorul de numere pseudoaleatoare cu valoarea dat a urm atorul num ar va generat de rand() pornind de la aceast a valoare f ar a apelarea ei, dou a rul ari genereaz a acela si sir de valori cu rand() se poate folosi de ex. cu srand(unsigned)time(NULL));
Programarea calculatoarelor 2. Curs 12 Marius Minea

Aplicatii. Tabele de dispersie

Tabele de dispersie (hashtables)


pentru reg asirea ecient a a unui obiect c and acesta nu are o valoare numeric a de identicare utilizabil a direct ca indice ntr-un tablou ideea: g asirea unei funct ii h cu o valoare numeric a unic a pentru ecare obiect considerat, ntr-un domeniu restr ans (utilizabil ca indice) ecare obiect x e memorat ntr-un tablou la indicele h(x) matematic: o funct ie part ial a h : D V , unde D e domeniul tuturor obiectelor posibile, iar domeniul de valori V e 0, 1, . . . , N 1. ex. pt. compilator: D e mult imea tuturor identicatorilor practic, |D| >> |V |, deci h nu poate injectiv a pe D, dar avem nevoie de valori distincte doar pt. submult imea Du D a obiectelor efectiv utilizate (ex. identicatorii dintr-un anumit program C) se caut a funct ii de dispersie (hash functions) cu propriet a ti c at mai bune (distribut ie uniform a probabilitate mic a de valori egale)
Programarea calculatoarelor 2. Curs 12 Marius Minea

Aplicatii. Tabele de dispersie

Exemple de funct ii de dispersie


funct ii simple, calculate rapid, folosind (aproape) toate caracterele adesea cu deplas ari pe bit i ( n loc de nmult iri, si pt. uniformizare) Exemple pentru siruri (char *s; len=strlen(s); parcurs secvent ial) for (h=len; len--;) h = ((h<<7) ^ (h<<27)) ^ *s++; /* Knuth */ for (h=5381; c=*s++; ) h += (h << 5) + c; /* Bernstein */ for (h=0; c=*s++; ) h = (h<<6) + (h<<16) - h + c; /* SDBM */ Pentru alte obiecte: calcule cu ntregii obt inut i grup and octet ii c ate 4 In toate cazurile: valoarea nal a luat a modulo dimensiunea tabloului inser am elementul la indicele respectiv, si l c aut am tot acolo S i funct iile bune au coliziuni (valori egale pt. obiecte diferite) trebuie rezolvate (dezambiguate) pentru a permite reg asirea corect a la ce indice inser am/c aut am elementul daca la h(x) se g ase ste altul?
Programarea calculatoarelor 2. Curs 12 Marius Minea

Aplicatii. Tabele de dispersie

Tabele de dispersie deschise si nchise


Tabele de dispersie nchise (closed hashing) dac a la indicele idx=h(x) se g ase ste alt obiect y, se caut a succesiv dup a o anumit a regul a: secvent ial (idx++), liniar (idx+=i), cu a doua funct ie (idx+=h2(x)), p an a se g ase ste obiectul sau o intrare vid a nu pot cont ine mai multe obiecte dec at dimensiunea tabloului la dep a sire, obiectele trebuie redistribuite ntr-un tablou mai mare la stergere, intrarea n tablou trebuie marcat a sters, nu vid, pentru a permite c autarea corect a (p an a la g asire sau vid) Tabele de dispersie deschise (open hashing) o intrare n tablou: list a de obiecte cu aceea si valoare pentru h hashing + c autare liniar a n list a (scurt a pentru funct ii bune) necesit a alocare dinamic a pentru elementele listei (v. exemplu) si aici, tablou cu dimensiune cel put in comparabil a cu nr. de obiecte
Programarea calculatoarelor 2. Curs 12 Marius Minea