Differences

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

Link to this comparison view

sd-ca:laboratoare:lab-04 [2020/03/19 13:19]
iosif.selea [Exerciţii]
sd-ca:laboratoare:lab-04 [2024/03/24 19:38] (current)
stefan.dascalu0512 [Schelet]
Line 2: Line 2:
  
 Responsabili Responsabili
-  * [[mailto:dinuaadrian@gmail.com|Andrei Dinu]] +  * [[mailto:alinichim49@gmail.com | Alin Ichim]] 
-  * [[mailto:alexcosmin.mihai@gmail.com|Alexandru-Cosmin Mihai]]+  * [[mailto:stef.dascalu@gmail.com | Ștefan-Teodor Dascălu]]
  
 ===== Obiective ===== ===== Obiective =====
Line 10: Line 10:
   * 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 ​ale diverselor implementări de dicționare+  * prezinte avantaje / dezavantaje ​ale diverselor implementări de dicționare
  
 ===== Ce este un dicționar? ===== ===== Ce este un dicționar? =====
Line 19: Line 19:
 Operația de găsire a unei valori asociate unei chei poartă numele de **indexare**,​ aceasta fiind și cea mai importantă operație. Din acest motiv dicționarele se mai numesc și //array-uri asociative//​ - fac asocierea între o cheie și o valoare. Operația de găsire a unei valori asociate unei chei poartă numele de **indexare**,​ aceasta fiind și cea mai importantă operație. Din acest motiv dicționarele se mai numesc și //array-uri asociative//​ - fac asocierea între o cheie și o valoare.
  
-Operația de adăugare a unei perechi (cheie-valoare) în dicționar are **două părți**. Prima parte este transformarea cheii într-un index întreg, printr-o funcție de **hashing**. În mod ideal, chei diferite mapează indexuri diferite în dicționar, însa în realitate nu se întamplă acest lucru. De aceea, partea a doua a operației de adăugare constă în procesul de **rezolvare a coliziunilor**.+Operația de adăugare a unei perechi (cheie-valoare) în dicționar are **două părți**. Prima parte este transformarea cheii într-un index întreg, strict pozitiv, printr-o funcție de **hashing**. În mod ideal, chei diferite mapează indexuri diferite în dicționar, însa în realitate nu se întamplă acest lucru. De aceea, partea a doua a operației de adăugare constă în procesul de **rezolvare a coliziunilor**.
  
 ==== Operații de bază ==== ==== Operații de bază ====
Line 39: Line 39:
 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 //​căutare//​ - î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**. 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 //​căutare//​ - î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) - dupa hash vom avea toate elementele in acelasi bucket, formand astfel o lista inlantuita care va trebui parcursa in intregime. 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.
  
-Funcția hash trebuie aleasă astfel încât să se **minimizeze** numărul coliziunilor (chei diferite care produc aceleași hash-uri). Coliziunile apar în mod inerent, deoarece lungimea hash-ului este fixă, iar obiectele de stocare pot avea lungimi și conținut arbitrare. În cazul apariției unei coliziuni, valorile se stochează pe aceeaşi poziție - în același **bucket**. În acest caz, căutarea se va reduce la compararea valorilor efective în cadrul bucket-ului.+Funcția hash trebuie aleasă astfel încât să se **minimizeze** numărul coliziunilor (chei diferite care produc aceleași hash-uri). Coliziunile apar în mod inerent, deoarece lungimea hash-ului este fixă, iar obiectele de stocare pot avea lungimi și conținut arbitrare. În cazul apariției unei coliziuni, valorile se stochează pe aceeaşi poziție - în același **bucket**. În acest caz, căutarea se va reduce la compararea valorilor efective ​ale cheilor ​în cadrul bucket-ului.
  
 Exemplu de hash pentru șiruri de caractere: Exemplu de hash pentru șiruri de caractere:
Line 155: Line 155:
  
 ===== Schelet ===== ===== Schelet =====
-{{:​sd-ca:​laboratoare:​schelet_laborator04_hashtable.zip|}}+<note important>​Daca folositi **Github Classroom**,​ va rugam sa va actualizati scheletul cu cel de mai jos. Cel din repo-ul clonat initial nu este la cea mai recenta versiune.</​note>​ 
 +{{:​sd-ca:​laboratoare:​lab_4:​skel-lab04-sda.zip|Scheletul de laborator}}
  
-===== Exerciţii =====+===== Exerciții =====
  
 <​note>​ <​note>​
-Fiecare laborator va avea unul sau doua exerciții publice șun pool de subiecte ascunsedin care asistentul poate alege cum se formează celelalte puncte ale laboratorului.+Trebuie să vă creați cont de [[https://​lambdachecker.io | Lambda Checker]]dacă nu v-ați creat deja, pe care îl veți folosi la SD pe toată durata semestrului. Aveti grija sa selectati contestul corect la submit, si anume **[[https://​beta.lambdachecker.io/​contest/​70/​problems?​page=1 |Laborator 4 SDA]]** ​
 </​note>​ </​note>​
  
 +[**5p**] Implementaţi structura de date dicţionar, plecând de la pseudocodul de mai sus şi de la schelet. (problema **Menu Hashtable Implementation** pe LambdaChecker din contestul de Laborator 4 SDA)
  
-1) [**3p**] Implementaţi structura de date dicţionar, plecând de la pseudocodul de mai sus şi de la schelet. +[**2p**] Rezolvati problema desemnata semigrupei voastreO veti gasi pe LambdaChecker sub forma **SD-CA-LAB-04 31XCAy** in contestul Laborator 4 SDA.
-<​hidden>​ +
-  ​[1p] funcţiile //init_ht// şi //put// +
-  ​[1p] funcţiile //get// şi //​has_key//​ +
-  ​[1p] funcţiile //​remove_ht_entry//​ şi //​free_ht//​ +
-</​hidden>​+
  
  
-<​hidden>​ +**(try at home)** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: 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.
-[**311CAa**] +
- +
-2) [**4p**] **Studenţi** +
- +
-Studenții unei universități sunt memorați într-o bază de date ce are forma unui hashtable. Fiecare student este caracterizat prin nume, anul de studiu, materia preferată și nota obținută. +
- +
-[**1p**] **a.** Adăugaţi cel puțin 5 studenți în hashtable. Cel puţin unul dintre ei trebuie să aibă nota mai mare decât 5 şi cel puţin unul dintre ei trebuie să aibă nota mai mică decât 5. +
-Exemplu orientativ:​ +
-HASH = 0: Todd Chavez | Mr. Peanutbutter | +
-HASH = 1: BoJack Horseman | Sarah Lynn | +
-HASH = 2: Diane Nguyen | +
-HASH = 3: Princess Carolyn | +
-HASH = 4: +
- +
-[**1p**] **b.** Căutarea unui student dupa nume. Se va afișa “Studentul <​nume_student>​ are nota <​nota_student>​.” în cazul în care este găsit sau “Studentul <​nume_student>​ nu a fost gasit!.”, în caz contrar. +
- +
-[**1p**] **c.** Afişaţi toţi studenţii care au ales o anumită materie preferată. Nu parcurgeți toate intrările din hashtable! ​ (HINT: Este de ajuns hashtable-ul curent?) +
- +
-[**1p**] **d.** Eliminați din hashtable toţi studenţii care au o notă mai mică decât 5. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: 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>​ +
- +
-[**311CAb**] +
- +
-2) [**4p**] **Movies** +
- +
-Un website are o baza de date in care retine filme si seriale. Un film este caracterizat de nume, regizor, anul aparitiei și rating. +
- +
-[**1p**] **a.** Adăugaţi cel puţin 5 filme în hashtable. Cel puţin un film trebuie să aibă un rating mai mic de 5, iar cel puţin un film trebuie să aibă un rating mai mare de 5. +
-Exemplu orientativ:​ +
-HASH = 0: Being Human - Bill Forsyth, 1994 | Being human -  Toby Whithouse, 2008  |  +
-HASH = 1: Avatar - James Cameron, 2009  | +
-HASH = 2: The edge of seventeen - Kelly Fremon Craig, 2016 | +
-HASH = 3: Twilight - Robert Benton, 1998 | Edge of Fear - Bobby Roth, 2018 | +
-HASH = 4: Twilight - Catherine Hardwicke, 2008  | The edge of love - John Maybury, 2008 | +
- +
-[**1p**] **b.** Sa se afiseze informații despre filmul care are numele <​movie_query>​. Se garantează ca rezultatul contine un singur film. Complexitatea pentru gasirea informatiilor trebuie sa fie O(1).  +
- +
-[**1p**] **c.** La introducerea numelui un regizor, sa se afișeze toate filmele regizate de acesta. În cazul în care acesta nu apare deloc în baza de date, să se afișeze mesajul: “Never heard about him”. Nu parcurgeți toate intrările din hashtable! (Hint: Este de ajuns hashtable-ul de la cerinţa b?) +
- +
-[**1p**] **d.** Eliminarea filmelor cu rating mai mic de 5 stele. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: size / HMAX > 0.75). +
- +
- +
- +
-[**312CAa**] +
- +
-2) [**4p**] **Bibliotecă** +
- +
-Cărțile dintr-o bibliotecă sunt reprezentate în sistem folosindu-se un hashtable. O carte este caracterizată prin titlu, autor, anul în care a fost publicată și statusul (la raft sau împrumutată). +
- +
-[**1p**] **a.** Adăugaţi cel puţin 5 cărţi în hashtable. Cel puţin o carte trebuie să aibă statusul de împrumutată şi cel puţin o carte trebuie să fie disponibilă la raft. +
-Exemplu orientativ:​ +
-HASH = 0: +
-HASH = 1: Brave New World by Aldous Huxley | Animal Farm by George Orwell | +
-HASH = 2: The Catcher in the Rye by J.D. Salinger | I, Robot by Isaac Asimov | +
-HASH = 3: +
-HASH = 4: 1984 by George Orwell | Lord of the Flies by William Golding | +
- +
-[**1p**] **b.** Afișarea statusului unei cărți date, dacă aceasta există în hashtable. Se va afișa statusul dacă există sau “Cartea nu a fost înregistrată”,​ în caz contrar. +
- +
-[**1p**] **c.** Afișarea tuturor cărților scrise de autorul “famous_author” din schelet. Nu parcurgeți toate intrările din hashtable! ​ (HINT: Este de ajuns hashtable-ul curent?) +
- +
-[**1p**] **d.** Eliminarea din hashtable a tuturor cărților împrumutate. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: size / HMAX > 0.75).  +
- +
- +
- +
-[**312CAb**] +
- +
-2) [**4p**] **Adrese** +
- +
-O firma de imobiliare folosește un hashtable pentru a memora imobilele pe care le administrează. Un astfel de imobil este caracterizat de adresă, numele locatarului,​ anul în care a cumpărat casa, numărul de animale de companie. +
- +
-[**1p**] **a.** Adăugaţi cel puţin 5 imobile în hashtable. La cel puţin un imobil trebuie să se găsească mai mult de 5 animale de companie şi la cel puţin un imobil trebuie să se găsească mai puţin de 5 animale de companie. +
-Exemplu orientativ:​ +
-HASH = 0: Bender Bending Rodriguez'​s address is Robot Arms Apts., New York  | Amy Wong's address is Wong Ranch, Western hemisphere of Mars  |  +
-HASH = 1: Hubert J. Farnsworth'​s address is West 57th Street, New York  | Leela Turanga'​s address is Planet Express Starship, New York  | John A. Zoidberg'​s address is Decapod 10, Space  |  +
-HASH = 2:  +
-HASH = 3: Kif Kroker'​s address is Nimbus Starship, Space  |  +
-HASH = 4: Philip J. Fry's address is Applied Cryogenics, New York  | +
- +
-[**1p**] **b.** Verificarea disponibilității casei de la adresa dream_house. Dacă nu locuiește nimeni la această adresă, afișați “Omg! You can move in right now!”, altfel, afișați “Your dream house is no longer available”. +
- +
-[**1p**] **c.** Căutaţi toate locuinţele din oraşul <​city>​ şi afişaţi-le.Nu parcurgeţi toate intrările din hashtable!. ​ (Hint: Este de ajuns hashtable-ul curent?) +
- +
-[**1p**] **d.** Eliminarea persoanelor care dețin mai mult de 5 de animale de casă. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: 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. +
- +
- +
-[**313CAa**] +
- +
-2) [**4p**] **UEFA** +
- +
-Site-ul UEFA se pregăteşte să publice cea mai bună echipă a tuturor timpurilor. +
-Baza de date este ținută sub forma unui hashtable. Un fotbalist este caracterizat +
-prin nume, naţionalitate,​ poziția pe care a jucat, cel mai important trofeu câştigat şi +
-un rating. În cazul atacanţilor şi mijlocaşilor se contorizează numărul de goluri marcate +
-și assist-uri iar în cazul portarilor şi al fundașilor se contorizează +
-numărul de meciuri fără gol primit și tackling-uri reușite. +
- +
-[**1p**] **a.** Adăugați cel puţin 5 jucători în hashtable. Cel puţin unul dintre aceştia trebuie să aibă un rating mai mare de 200 şi cel puţin un jucător trebuie să aibă un rating mai mic de 200. +
- +
-[**1p**] **b.** Afişarea informaţiilor despre un jucător +
- +
-[**1p**] **c.** Eliminați din hashtable fotbaliștii cu rating mai mic de 200. +
- +
-[**1p**] **d.** Afișați cei mai buni jucători din țara <​country_query>​. Nu parcurgeți toate intrările din hashtable! Hint: Este de ajuns hashtable-ul curent? +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: size / HMAX > 0.75). +
- +
-<​hidden>​ +
-[**313CAb**] +
- +
-2) [**4p**] **Recipes** +
- +
-O mini-carte de rețete este memorată într-o bază de date ce are forma unui hashtable. Fiecare rețetă este caracterizată prin nume și o listă de ingrediente. +
- +
-[**1p**] **a.** Adăugaţi cel puţin 5 reţete în hashtable. Cel puţin o reţetă trebuie să folosească mai mult de 5 ingrediente şi cel puţin o reţetă trebuie să folosească mai puţin de 5 ingrediente. +
-Exemplu orientativ:​ +
-HASH = 0: Bomboane cu lapte: apa, zahar, smantana +
- | Chec: oua, faina, zahar, unt, lapte, cacao +
- |  +
-HASH = 1:  +
-HASH = 2: Mamaliga: apa, sare, malai +
- | MBS: apa, sare, malai, branza, smantana +
- | Bruschete: rosii, usturoi, busuioc, ulei de masline, ceapa, sare, bagheta +
- | +
- +
-[**1p**] **b.** Căutarea unei rețete din schelet în hashtable. Se va afișa lista de ingrediente în cazul în care este găsită sau “I don’t know how to cook this”, în caz contrar. +
- +
-[**1p**] **c.** Afișarea tuturor preparatelor care conțin un anumit ingredient. Nu parcurgeți toate intrările din hashtable! (Hint: Este de ajuns hashtable-ul curent)?  +
- +
-[**1p**] **d.** Eliminarea tuturor reţetelor care au mai mult de 5 ingrediente. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: size / HMAX > 0.75).  +
-</​hidden>​ +
- +
- +
-<​hidden>​ +
-[**314CAa**] +
- +
-2) [**4p**] **Bancă** +
- +
-The Trans-Dimensional Bank folosește un hashtable pentru a memora clienții. Contul unui client este caracterizat de nume, cod pin, listă de tranzacții și o sumă de bani. O tranzacție este definită prin locație, data efectuării tranzacției și suma tranzacționată. Pentru o listă de clienți dată, implementați următoarele:​ +
- +
-[**1p**] **a.** Adăugaţi cel puţin 5 clienţi în hashtable, iar pentru fiecare client adăugați cel puţin 2 tranzacţii. Cel puţin unul dintre clienţi trebuie să aibă mai mult de 50 de bani în cont, iar cel puţin un client trebuie să aibă mai puţin de 50 de bani în cont. +
-Exemplu orientativ:​ +
-HASH = 0:  +
-Morty Smith'​s transactions:​  +
-150 spent on 12-1-16 +
-200 spent on 1-12-15 +
-15 spent on 20-1-14 +
- |  +
-Jerry Smith'​s transactions:​  +
-100 spent on 17-1-17 +
-420 spent on 13-1-12 +
- |  +
-HASH = 1:  +
-HASH = 2:  +
-Rick Sanchez'​s transactions:​  +
-500 spent on 21-7-98 +
-100 spent on 8-8-18 +
- |  +
-Summer Smith'​s transactions:​  +
-500 spent on 20-12-15 +
-50 spent on 19-1-14 +
- |  +
-Beth Smith'​s transactions:​  +
-30 spent on 15-6-18 +
-20 spent on 16-6-18 +
- +
-[**1p**] **b.** Afișarea tuturor tranzacţiilor unui client dat. +
-Exmeplu output: +
-Rick Sanchez'​s transactions:​  +
-500 spent on 21-7-98 +
-100 spent on 8-8-18 +
- +
-[**1p**] **c.** Eliminarea din hashtable a clienților care au în cont o sumă de bani mai mică de 50. +
- +
-[**1p**] **d.** Afişarea tuturor tranzacțiilor dintr-o zi (Hint: e suficient un singur hashtable?​) +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: size / HMAX > 0.75).  +
-</​hidden>​ +
- +
- +
-[**314CAb**] +
- +
-2) [**4p**] **Studenţi (varianta 2)** +
- +
-Studenții unei universități sunt memorați într-o bază de date ce are forma unui hashtable. Fiecare student este caracterizat prin nume, facultatea la care este înscris, anul de studiu și media obținută.  +
- +
-[**1p**] **a.** Adăugați cel puțin 5 studenți în hash table. +
-Exemplu orientativ:​ +
-HASH = 0: Todd Chavez | Mr. Peanutbutter | +
-HASH = 1: BoJack Horseman | Sarah Lynn | +
-HASH = 2: Diane Nguyen | +
-HASH = 3: Princess Carolyn | +
-HASH = 4: +
- +
-[**1p**] **b.** Căutarea unui student după nume. Se va afișa “Studentul <​nume_student>​ este înscris la facultatea <​facultate_student>​ și are media <​nota_student>​.” în cazul în care este găsit sau “Studentul <​nume_student>​ nu a fost găsit!”, în caz contrar. +
- +
-[**1p**] **c.** Afişaţi toţi studenţii care sunt înscrişi la o anumită facultate. Nu parcurgeți toate intrările din hashtable! ​ (HINT: Este de ajuns hashtable-ul curent?) +
- +
-[**1p**] **d.** Eliminați din hashtable toţi studenţii care au o medie mai mică decât valoarea medie a mediilor studentilor de la facultatea lor. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: 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>​ +
-[**315CAa**] +
- +
-2) [**4p**] [**Magazin**] +
- +
-Un magazin stochează date despre produsele pe care le vinde într-o bază de date implementată ca hashtable. Fiecare produs este caracterizat prin nume, categorie, pret, număr vânzări.  +
- +
-[**1p**] **a.** Adăugați cel puțin 5 produse în hashtable din cel puţin două categorii diferite. +
- +
-[**1p**] **b.** Căutarea unui produs după nume. Se va afișa “Produs: <​nume_produs>;​ Categorie: <​nume_categorie>;​ Pret: <​pret_produs>;​ Nr vanzari: <​nr_vanzari_produs>​” în cazul în care este găsit sau “Produsul <​nume_produs>​ nu face parte din oferta magazinului.”,​ în caz contrar. +
- +
-[**1p**] **c.** Afişaţi toate produsele dintr-o anumită categorie. Nu parcurgeți toate intrările din hashtable! ​ (HINT: Este de ajuns hashtable-ul curent?) +
- +
-[**1p**] **d.** Eliminați din hashtable toate produsele care au un număr de vânzări mai mic strict decât media vânzărilor produselor din categoria lor. +
- +
-[**2p**] **(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: 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>​ +
- +
-[**315CAb**] +
- +
-2) [**4p**] **Garaj** +
- +
-Un service auto stochează date despre maşinile clienţilor într-o bază de date implementată ca hashtable. Fiecare maşină este caracterizat prin număr de înmatriculare,​ proprietar şi status (maşina e reparată sau aşteaptă ca un mecanic s-o verifice).  +
- +
-[**1p**] **a.** Adăugați cel puțin 5 maşini în hashtable. Cel puţin o maşină trebuie să aibă statusul de “reparată” şi cel puţin una trebuie să aibă statusul de “în aşteptare”. Cel puţin 2 maşini trebuie să aibă acelaşi proprietar. +
- +
-[**1p**] **b.** Căutarea unei maşini după numărul de înmatriculare. Se va afișa “Maşina: <​numar_inmatriculare>;​ Proprietar: <​nume_proprietar>;​ Status: <​status_masina>​” în cazul în care este găsită sau “Masina <​numar_inmatriculare>​ nu se afla in service.”,​ în caz contrar. +
- +
-[**1p**] **c.** Afişaţi toate maşinile din baza de date care sunt deţinute de un acelaşi proprietar specificat. Nu parcurgeți toate intrările din hashtable! ​ (HINT: Este de ajuns hashtable-ul curent?) +
- +
-[**1p**] **d.** Eliminați din hashtable toate maşinile care au fost deja reparate (pe baza statusului). +
- +
-[**2p**] ​**(bonus).** 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 şi numărul de bucket-uri HMAX este mai mare decâti o valoare aleasă (ex: 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.+
  
 ===== Interviu ===== ===== Interviu =====
sd-ca/laboratoare/lab-04.txt · Last modified: 2024/03/24 19:38 by stefan.dascalu0512
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