Differences

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

Link to this comparison view

sd-ca:teme:tema2-2020 [2020/03/26 21:04]
gabriel_danut.matei
sd-ca:teme:tema2-2020 [2020/04/11 12:07] (current)
gabriel_danut.matei
Line 1: Line 1:
-====== ​Tema2 - Count-distinct problem ======+====== ​Tema 2 - Count-distinct problem ======
  
 ** Responsabili:​ ** ** Responsabili:​ **
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 == 
 +  * **27 martie, ora 01:30** - adăugat clarificari in sectiunea **Introducere**
 +  * **27 martie, ora 21:05** - adăugat **checker** in **enunt** si pe **vmchecker**
 +  * **27 martie, ora 23:40** - modificat fisier **Makefile** din **checker**
 +  * **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 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>​
   * **26 martie, ora 21:00** - adăugat **checker**   * **26 martie, ora 21:00** - adăugat **checker**
Line 22: Line 32:
  
 **Problema estimarii cardinalitatii** (a numararii elementelor distincte) este, in esenta, gasirea numarului de elemente unice dintr-o colectie de elemente care se pot repeta. **Problema estimarii cardinalitatii** (a numararii elementelor distincte) este, in esenta, gasirea numarului de elemente unice dintr-o colectie de elemente care se pot repeta.
 +<note important>​
 +Pentru cerintele **I** si **II**, vom rezolva o problema si mai restrictiva:​ gasirea **numarului de aparitii** pentru fiecare element. Pentru cerinta **III**, vom vedea ca acest lucru e mai greu realizabil cand vine vorba de volume mari de date si, de aceea, ne vom rezuma la **gasirea numarului de elemente distincte**.</​note>​
 +
 +
 +**Conceptual,​ ne referim la:**
 +
 +INPUT:
 +
 +''​1,​ 34, 2, 2, 2, 3''​
 +
 +OUTPUT:
 +
 +**Pentru cerintele I si II:**
 +
 +''​1 - 1''​
 +
 +''​2 - 3''​
 +
 +''​3 - 1''​
 +
 +''​34 - 1''​
 +
 +**Pentru cerinta III:**
 +
 +''​Exista 4 elemente distincte''​
  
-Pentru primele doua subpuncte, vom rezolva o problema si mai restrictiva:​ gasirea ​**numarului de aparitii** pentru fiecare element. Pentru restul, vom vedea ca acest lucru e mai greu realizabil cand vine vorba de volume mari de date si, de aceea, ne vom rezuma la gasirea numarului de elemente distincte.+<note warning>**Fiecare** dintre cele **3** cerinte se va implementa intr-un **fisier separat**.</​note>​
  
 ===== I. Vector de frecventa - 25p ===== ===== I. Vector de frecventa - 25p =====
Line 51: Line 86:
 {{:​sd-ca:​teme:​hash3.png|}} {{:​sd-ca:​teme:​hash3.png|}}
  
-//Se garanteaza existenta a cel putin unui bucket liber in momentul fiecarei operatii de insertie.//+//Se garanteaza existenta a cel putin unui bucket liber in momentul fiecarei operatii de insertie.// ​**Pentru a satisface aceasta conditie, o idee ar fi ca dimensiunea Hashtable-ului sa fie egala cu numarul de siruri existente in fisierul de intrare.**
  
 Evident, daca in momentul unei operatii de selectie nu gasim cheia in bucketul in care ne-am astepta, vom continua cautarea secvential, aplicand un procedeu similar cu cel din momentul insertiei. Evident, daca in momentul unei operatii de selectie nu gasim cheia in bucketul in care ne-am astepta, vom continua cautarea secvential, aplicand un procedeu similar cu cel din momentul insertiei.
  
-//Se garanteaza ca lungimea maxima a oricarui este maxim **100** de caractere.//​+//Se garanteaza ca lungimea maxima a oricarui ​sir este maxim **100** de caractere.//​
  
 //Se garanteaza ca numarul de aparitii ale oricarui element este mai mic decat **256**.// //Se garanteaza ca numarul de aparitii ale oricarui element este mai mic decat **256**.//
Line 76: 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 89: 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 99: 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 113: 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//+- 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.//​
  
 === 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 ===
-<​hidden>​ +{{:​sd-ca:​teme:​2-distinct-count.zip|CHECKER}} 
-{{:​sd-ca:​teme:​checker-tema2-distinctcount.zip|}} ​ +
-</​hidden>​ +
-* checkerul va fi publicat in scurt timp+
  
 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 155: Line 218:
 === Punctaj === === Punctaj ===
  
-<note warning>​**Atenite!** O temă care nu compilează va primi 0 puncte.</​note>​+<note warning>​**Atentie!** O temă care nu compilează va primi 0 puncte.</​note>​
  
   - 80p teste   - 80p teste
Line 166: 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.txt · Last modified: 2020/04/11 12:07 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