This shows you the differences between two versions of the page.
|
sd-ca:teme:tema2-2020 [2020/03/29 19:30] 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 16: | Line 16: | ||
| * **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 | * **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 finala, va trebui sa mai facem cateva ajustari matematice la procedeul descris anterior. | + | Recapituland ce am prezentat in sectiunile precedente, in cadrul algoritmului HyperLogLog avem 3 etape: |
| - | In primul rand, vom 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 HyperLogLog, vom 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> | ||
| 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=== | ||