This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-07 [2015/04/07 22:17] cosmin_ioan.petrisor [Implementarea cu liste înlănțuite] |
sd-ca:laboratoare:laborator-07 [2015/05/09 16:47] (current) cosmin_ioan.petrisor [Exerciţii] |
||
---|---|---|---|
Line 43: | Line 43: | ||
***inserarea** în hashtable presupune găsirea indexului corect și adăugarea elementului la lista corespunzătoare. | ***inserarea** în hashtable presupune găsirea indexului corect și adăugarea elementului la lista corespunzătoare. | ||
- | <note important>**Atenţie:** | + | <note important> |
+ | Hash-ul poate depăşi cu mult dimensiunea array-ului de bucket-uri, ceea ce duce la necesitatea folosirii, cel mai frecvent, a operaţiei //modulo// -> **index = hash % HMAX**, pentru a situa indexul bucket-ului în care va fi inserat elementul, în limitele necesare. | ||
- | Hash-ul poate depăşi cu mult dimensiunea array-ului de bucket-uri ceea ce duce la necesitatea folosirii, cel mai frecvent, a operaţiei //modulo// -> **index = hash % HMAX**, pentru a situa indexul bucket-ului în care va fi inserat elementul în limitele necesare. | + | Dacă dimensiunea array-ului este exprimată în puteri ale lui 2, se mai poate folosi şi formula următoare -> **index = hash & (HMAX - 1)**. |
- | Dacă dimensiunea array-ului este exprimată în puteri ale lui 2, se mai poate folosi şi formula următoare -> **index = hash & (HMAX - 1)**. HMAX reprezintă dimensiunea maximă a array-ului.</note> | + | **HMAX** reprezintă dimensiunea maximă a array-ului.</note> |
***ștergerea** presupune căutarea și scoaterea elementului din lista corespunzătoare. | ***ștergerea** presupune căutarea și scoaterea elementului din lista corespunzătoare. | ||
Line 132: | Line 133: | ||
2) [**1p**] Testați implementarea voastră folosind un cod simplist. | 2) [**1p**] Testați implementarea voastră folosind un cod simplist. | ||
- | |||
<hidden> | <hidden> | ||
Line 191: | Line 191: | ||
* [**0.5p**] TODO 2: definiţi funcţia hash pentru clasa String | * [**0.5p**] TODO 2: definiţi funcţia hash pentru clasa String | ||
* [**1.5p**] TODO 3: rezolvaţi problema folosind un Hashtable cu cheie de tip String. | * [**1.5p**] TODO 3: rezolvaţi problema folosind un Hashtable cu cheie de tip String. | ||
- | |||
- | 4) [**Bonus 1p**] Implementați și testați redimensionarea unui hashtable: funcția **resize()** dublează dimensiunea structurii interne a tabelei de dispersie. Dublarea se va face în momentul în care raportul dintre numărul de elemente introduse în hashtable **size** şi numărul de bucket-uri **HMAX** este mai mare decât o valoare aleasă (**size** / **HMAX** > 0.75). Comportamentul dorit pentru această funcţionalitate este următorul: se redimensionează array-ul de bucket-uri, iar apoi fiecare bucket este parcus în ordine și elementele sunt redistribuite după valoarea noului hash. | ||
- | </hidden> | ||
3) [**3p**] O aplicatie a unui hashtable este reprezentată de stocarea parolelor unor utilizatori în vederea autentificării într-un sistem. Considerăm un fişier text **password.dat** ce conţine pe fiecare linie o pereche de şiruri de caractere reprezentând numele utilizatorului şi parola sa. După citirea şi stocarea parolelor, programul va citi de la tastatură numele utilizatorului ce doreşte să se autentifice, precum şi parola sa. Dacă parola este cea aferentă utilizatorului, se va afişa un mesaj de tipul "Authentication successful", iar în caz contrar, se va afişa "Authentication failure". | 3) [**3p**] O aplicatie a unui hashtable este reprezentată de stocarea parolelor unor utilizatori în vederea autentificării într-un sistem. Considerăm un fişier text **password.dat** ce conţine pe fiecare linie o pereche de şiruri de caractere reprezentând numele utilizatorului şi parola sa. După citirea şi stocarea parolelor, programul va citi de la tastatură numele utilizatorului ce doreşte să se autentifice, precum şi parola sa. Dacă parola este cea aferentă utilizatorului, se va afişa un mesaj de tipul "Authentication successful", iar în caz contrar, se va afişa "Authentication failure". | ||
Line 219: | Line 216: | ||
* [**0.5p**] TODO 2: definiţi funcţia hash pentru clasa String | * [**0.5p**] TODO 2: definiţi funcţia hash pentru clasa String | ||
* [**1.5p**] TODO 3: rezolvaţi problema folosind un Hashtable cu cheie de tip String. | * [**1.5p**] TODO 3: rezolvaţi problema folosind un Hashtable cu cheie de tip String. | ||
+ | |||
+ | 4) [**Bonus 1p**] Implementați și testați redimensionarea unui hashtable: funcția **resize()** dublează dimensiunea structurii interne a tabelei de dispersie. Dublarea se va face în momentul în care raportul dintre numărul de elemente introduse în hashtable **size** şi numărul de bucket-uri **HMAX** este mai mare decât o valoare aleasă (**size** / **HMAX** > 0.75). Comportamentul dorit pentru această funcţionalitate este următorul: se redimensionează array-ul de bucket-uri, iar apoi fiecare bucket este parcus în ordine și elementele sunt redistribuite după valoarea noului hash. | ||
+ | </hidden> | ||
===== Interviu ===== | ===== Interviu ===== | ||
Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship, part-time, full-time, etc.) din materia prezentată în cadrul laboratorului. | Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship, part-time, full-time, etc.) din materia prezentată în cadrul laboratorului. | ||
Line 240: | Line 240: | ||
[6] [[http://www.cs.usfca.edu/~galles/visualization/ClosedHashBucket.html|Closed Hashing (Buckets) Visualization]] | [6] [[http://www.cs.usfca.edu/~galles/visualization/ClosedHashBucket.html|Closed Hashing (Buckets) Visualization]] | ||
+ | |||
+ | [7] [[http://www.cse.yorku.ca/~oz/hash.html|Collection of hash functions]] |