Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:laboratoare:laborator-07 [2015/04/06 15:51]
mihai.neacsu2901 [Exerciţii] Add bonus exercise
sd-ca:laboratoare:laborator-07 [2015/05/09 16:47] (current)
cosmin_ioan.petrisor [Exerciţii]
Line 8: Line 8:
   *definească tipul de date dicționar   *definească tipul de date dicționar
   *implementeze un dicționar folosind tabele de dispersie   *implementeze un dicționar folosind tabele de dispersie
-  *prezinte avantaje/​dezavataje diverselor implementări de dicționare+  *prezinte avantaje / dezavataje ​ale diverselor implementări de dicționare
  
 ===== Ce e un dicționar? ===== ===== Ce e un dicționar? =====
Line 31: Line 31:
  
 O implementare frecvent întâlnită a unui dicționar este cea folosind o tabelă de dispersie (hashtable). ​ O implementare frecvent întâlnită a unui dicționar este cea folosind o tabelă de dispersie (hashtable). ​
-Un **hashtable** este o structură de date optimizată pentru funcția de //lookup// (în medie, timpul de căutare este constant: O(1)). Acest lucru se realizează transformând cheia într-un hash (folosind o **funcție hash**).+Un **hashtable** este o structură de date optimizată pentru funcția de //lookup// (în medie, timpul de căutare este constant: O(1)). Acest lucru se realizează transformând cheia într-un hash - un număr întreg fără semn pe 16 / 32 / 64 de biţi, etc. - folosind o **funcție hash**.
 În cel mai defavorabil caz, timpul de căutare al unui element poate fi O(n). Totuși, tabelele de dispersie sunt foarte utile în cazul în care se stochează cantități mari de date, a căror dimensiune (mărime a volumului de date) poate fi anticipat. În cel mai defavorabil caz, timpul de căutare al unui element poate fi O(n). Totuși, tabelele de dispersie sunt foarte utile în cazul în care se stochează cantități mari de date, a căror dimensiune (mărime a volumului de date) poate fi anticipat.
  
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>​
 +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)**.
 +
 +**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 127: 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 187: Line 192:
    * [**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 resizeDouble() dublează dimensiunea structurii de hashtable (bucket-urile sunt parcuse în ordine și elementele sunt redistribuite). 
-</​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 213: 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 221: Line 227:
   * Descrie cum ai implementa DEX cu ajutorul unui hashtable.   * Descrie cum ai implementa DEX cu ajutorul unui hashtable.
   * În ce condiții căutarea într-un hashtable ar putea să nu fie constantă?   * În ce condiții căutarea într-un hashtable ar putea să nu fie constantă?
- 
-Și multe altele... 
- 
 ===== Bibliografie ===== ===== Bibliografie =====
  
Line 237: 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]]
sd-ca/laboratoare/laborator-07.1428324661.txt.gz · Last modified: 2015/04/06 15:51 by mihai.neacsu2901
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0