Differences

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

Link to this comparison view

sd-ca:teme:tema2-2020 [2020/03/29 18:42]
gabriel_danut.matei
sd-ca:teme:tema2-2020 [2020/04/11 12:07] (current)
gabriel_danut.matei
Line 7: Line 7:
 ** Data publicării : 26 martie, ora: 21:00 ** ** Data publicării : 26 martie, ora: 21:00 **
  
-** Deadline: ​16 aprilie, ora 23:55 **+** Deadline: ​17 aprilie, ora 23:55 **
  
 == Modificări şi actualizări ==  == Modificări şi actualizări == 
Line 13: Line 13:
   * **27 martie, ora 21:05** - adăugat **checker** in **enunt** si pe **vmchecker**   * **27 martie, ora 21:05** - adăugat **checker** in **enunt** si pe **vmchecker**
   * **27 martie, ora 23:40** - modificat fisier **Makefile** din **checker**   * **27 martie, ora 23:40** - modificat fisier **Makefile** din **checker**
-  * **28 martie, ora 18:00** - modificat fisier **check.sh** din **checker**;​ acum partea de **valgrind** are comportamentul corect pentru toate cerintele 
   * **29 martie, ora 16:00** - adăugat precizari in **cerinta II** legate de **dimensiunea Hashtable-ului**   * **29 martie, ora 16:00** - adăugat precizari in **cerinta II** legate de **dimensiunea Hashtable-ului**
   * **29 martie, ora 18:40** - adăugat corectare in **cerinta III** legata de **definitia lui m**   * **29 martie, ora 18:40** - adăugat corectare in **cerinta III** legata de **definitia lui m**
 +  * **29 martie, ora 19:30** - modificat fisier **check.sh** din **checker**;​ acum partea de **valgrind** are comportamentul corect pentru toate cerintele
 +  * **3 aprilie, ora 19:10** - reformulat **cerinta III** pentru a o face mai usor de inteles
 +  * **11 aprilie, ora 12:05** - actualizat **deadline**
 +
  
 <​hidden>​ <​hidden>​
Line 108: Line 111:
  
 In ilustrarea functionarii algoritmului **HyperLogLog**,​ vom incepe de la o serie de principii simple pe care le vom pune cap la cap, ajungand la descrierea algoritmului final. In ilustrarea functionarii algoritmului **HyperLogLog**,​ vom incepe de la o serie de principii simple pe care le vom pune cap la cap, ajungand la descrierea algoritmului final.
 +
 +<note important>​Sectiunile 1 si 2 sunt prezentate pentru a intelege de ce functioneaza HyperLogLog. Pentru a rezolva tema, trebuie sa implementati **doar algoritmul final (descris in sectiunea 3)**.</​note>​
  
 ==== 1. Probabilistic counting ==== ==== 1. Probabilistic counting ====
Line 121: Line 126:
 {{:​sd-ca:​teme:​probcount1.png|}} {{:​sd-ca:​teme:​probcount1.png|}}
  
-Privind aceasta observatie in sens invers, daca am generat numere aleatoare si secventa cea mai lunga de **0** de la inceputul oricarui numar a fost de lungime **3**, atunci avem urmatoarele ​posibilitati:​ - am generat //cel putin **8** numere// - am avut noroc si a trebuit sa generam //mai putin de 8 numere//+Privind aceasta observatie in sens invers, daca am generat numere aleatoare si secventa cea mai lunga de **0** de la inceputul oricarui numar a fost de lungime **3**, atunci avem doua posibilitati:​ 
 + 
 +- am generat //cel putin **8** numere// 
 + 
 +- am avut noroc si a trebuit sa generam //mai putin de 8 numere//
  
 Evident, pentru valori mici precum **2** sau **3** biti consecutivi,​ exista o sansa semnificativa sa generam numarul mai rapid (chiar din prima incercare), dar cu cat valorile devin mai mari, cu atat scade aceasta sansa. Evident, pentru valori mici precum **2** sau **3** biti consecutivi,​ exista o sansa semnificativa sa generam numarul mai rapid (chiar din prima incercare), dar cu cat valorile devin mai mari, cu atat scade aceasta sansa.
Line 131: Line 140:
 ==== 2. LogLog ==== ==== 2. LogLog ====
  
-Daca vrem sa imbunatatim performanta algoritmului nostru va trebui sa: - Atenuam efectul negativ al generarii rapide unui numar cu multi biti de **0** initiali - Oferim estimari //mai granulare// decat **puterile lui 2**+Daca vrem sa imbunatatim performanta algoritmului nostru va trebui sa: 
 + 
 +- Atenuam efectul negativ al generarii rapide unui numar cu multi biti de **0** initiali 
 + 
 +- Oferim estimari //mai granulare// decat **puterile lui 2**
  
 {{:​sd-ca:​teme:​2n_table.png|}} {{:​sd-ca:​teme:​2n_table.png|}}
Line 145: Line 158:
 ==== 3. HyperLogLog ==== ==== 3. HyperLogLog ====
  
-Pentru a aduce algoritmul ​in forma finalava trebui sa mai facem cateva ajustari matematice la procedeul descris anterior.+Recapituland ce am prezentat ​in sectiunile precedentein cadrul algoritmului HyperLogLog avem 3 etape:
  
-In primul randvom folosi o medie similara ​cu **media armonica** in loc de cea geometrica.+**1)** stabilim numarul total de bucketuri **m**apoi initializam ​cu 0 un vector ​**M** de dimensiune **m**. 
 +<note important>​Alegerea lui m este diferita de la caz la caz. In contextul problemei curente, puteti sa folositi valoarea m = $2^{11}$, insa exista si alte variante posibile.</​note>​
  
-In al doilea rand, vom utiliza un **factor de atenuare** alfa, pentru ​a imbunatati eroarea ​de aproximare.+**2)** pentru ​fiecare numar citit de la intrare:
  
-{{:sd-ca:​teme:​estimare.png|}}+ii calculam hash-ul cu o functie de hash pentru numere intregi
  
-**E** reprezinta //estimarea finala//+- pe baza primilor $\log_2(m)$ biti din hash determinam bucketul in care se afla (din cele $m$ bucketuri posibile); notam numarul bucketului cu **j**
  
-**m** reprezinta //numarul ​total de bucketuri// ​**folosite**+- calculam ​numarul de biti 0 initiali din restul hash-ului; notam acest numar cu **x**
  
-**Z** reprezinta //media//calculata dupa urmatoarea formula:+- M[j] = max(M[j], x) 
 + 
 +**3)** agregam valorile din toate bucketurile 
 + 
 + 
 +In sectiunea precedenta, am mentionat ca pentru a agrega valorile din fiecare bucket, folosim ​media geometrica. Pentru a implementa HyperLogLogvom folosi in locul ei urmatorea medie:
  
 {{:​sd-ca:​teme:​media.png|}} {{:​sd-ca:​teme:​media.png|}}
  
-**alfa_m** reprezinta //factorul de atenuare//, calculat in functie de **m** dupa urmatoarea formula:+Ca exemplu, pentru bucketul evidentiat cu verde, ​**j = 6**, iar **M[j] = 2** 
 + 
 +{{:​sd-ca:​teme:​buckets.png|}} 
 + 
 + 
 +Avand aceasta medie **Z**, raspunsul final **E** (numarul de elemente distincte intalnite) va fi dat de urmatorea formula: 
 + 
 +{{:​sd-ca:​teme:​estimare.png|}} 
 + 
 +Explicatie:​ 
 + 
 +**m**, ca si pana acum, este numarul total de bucketuri folosite 
 + 
 +**$\alpha_m$** reprezinta //factorul de atenuare//, calculat in functie de **m** dupa urmatoarea formula:
  
 {{:​sd-ca:​teme:​alfa.png|}} {{:​sd-ca:​teme:​alfa.png|}}
 +
  
 //Pentru ultima cerinta, citirea se va face dintr-un fisier al carui nume este primit ca parametru.//​ //Pentru ultima cerinta, citirea se va face dintr-un fisier al carui nume este primit ca parametru.//​
  
 === Precizări === === Precizări ===
-<note warning>​Rezolvati ​fiecare cerinta ​utilizand structura de date ceruta. Nerespectarea acestui lucru va aduce la anularea punctajului pentru cerinta respectiva.</​note>​+<note warning>​Rezolvati ​cerintele I si II utilizand structura de date ceruta. Nerespectarea acestui lucru va aduce la anularea punctajului pentru cerinta respectiva.</​note>​
  
 <note important>​Având în vedere ca a 3-a parte a temei presupune implementarea unei structuri de date probabilistice,​ checkerul ofera punctajul daca raspunsul vostru se incadreaza intr-o marja de eroare de 10% fata de raspunsul corect.</​note>​ <note important>​Având în vedere ca a 3-a parte a temei presupune implementarea unei structuri de date probabilistice,​ checkerul ofera punctajul daca raspunsul vostru se incadreaza intr-o marja de eroare de 10% fata de raspunsul corect.</​note>​
  
 === Checker === === Checker ===
-{{:​sd-ca:​teme:​checker-tema2-2020.zip|CHECKER}} ​+{{:​sd-ca:​teme:​2-distinct-count.zip|CHECKER}} ​
  
 Temele vor fi trimise pe [[https://​elf.cs.pub.ro/​vmchecker/​ui/#​SD|vmchecker]]. ​ Temele vor fi trimise pe [[https://​elf.cs.pub.ro/​vmchecker/​ui/#​SD|vmchecker]]. ​
Line 196: Line 229:
  
 De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/​grupuri etc.</​note> ​ De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/​grupuri etc.</​note> ​
 +
 +===FAQ===
 + ​**Q:​** Ce functii de hashing trebuie sa folosesc in tema, la cerintele II si III? \\ \\
 + ​**A:​** Puteti folosi orice functii doriti. Un exemplu ar fi cele din laborator.
 +
 + ​**Q:​** La cerinta II functia mea de hashing nu imi genereaza deloc coliziuni. E ok? \\ \\
 + ​**A:​** E in regula, insa codul care trateaza posibilitatea coliziunilor **trebuie sa existe**.
 +
 + ​**Q:​** In enuntul cerintei III sunt mentionate functiile matematice log si pow, insa checkerul nu permite folosirea functiilor matematice. Cum rezolvam problema asta \\ \\
 + ​**A:​** Pentru a-l calcula pe **m** care e de forma $2^k$, puteti folosi shiftarea pe biti, adica <​code>​int m = 1 << k;</​code>​ Din moment ce k se stabileste in prealabil, $\log_2{m} = k$.
 +
  
 ===Link-uri utile=== ===Link-uri utile===
sd-ca/teme/tema2-2020.1585496534.txt.gz · Last modified: 2020/03/29 18:42 by gabriel_danut.matei
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