Differences

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

Link to this comparison view

sd-ca:teme:tema3-2021 [2021/05/13 00:53]
gabriel_danut.matei
sd-ca:teme:tema3-2021 [2021/05/30 19:42] (current)
gabriel_danut.matei
Line 1: Line 1:
-<​hidden>​ 
 ====== Tema 3 - Rope data structure ====== ====== Tema 3 - Rope data structure ======
  
Line 11: Line 10:
  
 == Modificări şi actualizări ==  == Modificări şi actualizări == 
-  * **27 martie, ora 01:30** - adăugat clarificari in sectiunea ​**Introducere** +  * **21 mai, ora 23:20** - actualizat secțiunea **Q&A** ca urmare a întrebărilor de pe **Forum** 
-  * **27 martie, ora 21:05** - adăugat ​**checker** in **enunt** si pe **vmchecker**+  * **30 mai, ora 16:30** - configurat tema pe **vmchecker** 
 +  ​* **30 mai, ora 19:42** - actualizat secțiunea **Q&A** ca urmare a întrebărilor de pe **Forum** 
  
 ===== Obiective ===== ===== Obiective =====
Line 21: Line 22:
  
 ===== Introducere ===== ===== Introducere =====
- 
- 
  
 Scopul acestei teme este implementarea unei structuri de date arborescente Scopul acestei teme este implementarea unei structuri de date arborescente
-numită Rope. Aceasta permite efectuarea eficientă de operații (inserare, concatenare,​+numită ​**Rope**. Aceasta permite efectuarea eficientă de operații (inserare, concatenare,​
 ștergere etc.) pe un șir de caractere foarte lung (problemă caracteristică editoarelor de text ștergere etc.) pe un șir de caractere foarte lung (problemă caracteristică editoarelor de text
 de orice tip). de orice tip).
  
-Un Rope este un arbore binar cu 2 proprietăți:​ +Un Rope este un arbore binar cu //2 proprietăți//: 
-1. Frunzele conțin stringuri de lungime >= 1+ 
 +1. **Frunzele** conțin ​//stringuri// de lungime >= 1 
 2. Fiecare nod are o greutate asociată: 2. Fiecare nod are o greutate asociată:
-- pentru frunze, acest număr este lungimea stringului pe care îl conține fiecare + 
-- pentru restul nodurilor, acest număr este suma greutăților frunzelor din +- pentru ​**frunze**, acest număr este //lungimea stringului// pe care îl conține fiecare 
-subarborele stâng+ 
 +- pentru ​**restul nodurilor**, acest număr este //suma greutăților frunzelor din 
 +subarborele stâng//
  
 Prin punerea cap la cap a stringurilor din frunze, de la stânga la dreapta, obținem Prin punerea cap la cap a stringurilor din frunze, de la stânga la dreapta, obținem
-stringul pe care îl reprezintă ​rope-ul.+stringul pe care îl reprezintă ​Rope-ul.
  
-Trebuie să implementați următoarele operații: 
  
-1. Concat(R1, R2) - concatenarea a 2 rope-uri+<note important>​Înainte să vă apucați de implementare,​ citiți și secțiunile de **Precizări** si **FAQ**.</​note>​ 
 + 
 + 
 +Va trebui să implementați următoarele operații:​ 
 + 
 +==== 1. Concat - 10p ==== 
 + 
 +<code c> 
 +RopeTree* concat(RopeTree* rt1, RopeTree* rt2); 
 +</​code>​ 
 + 
 +Concat(R1, R2) - concatenarea a 2 rope-uri 
 ex: Concat(Rope("​ab"​),​ Rope("​cde"​)) -> Rope("​abcde"​) ex: Concat(Rope("​ab"​),​ Rope("​cde"​)) -> Rope("​abcde"​)
  
-2. Index(R1, i) - obținerea caracterului de pe poziția i dintr-un rope+{{:​sd-ca:​teme:​tema3_2021:​concat.png?​800 |}} 
 + 
 + 
 +==== 2. Index - 10p ==== 
 + 
 +<code c> 
 +char indexRope(RopeTree* rt, int idx); 
 +</​code>​ 
 + 
 + 
 +Index(R1, i) - obținerea caracterului de pe poziția i dintr-un rope 
 ex: Index(Rope("​abcde"​),​ 1) -> '​b'​ ex: Index(Rope("​abcde"​),​ 1) -> '​b'​
  
-3. Search(R1, start, end) - obținerea stringului din intervalul [start,end)+{{:​sd-ca:​teme:​tema3_2021:​index.png?​300 |}} 
 + 
 +==== 3. Search - 20p ==== 
 + 
 +<code c> 
 +char* search(RopeTree* rt, int start, int end); 
 +</​code>​ 
 + 
 +Search(R1, start, end) - obținerea stringului din intervalul [start,end) 
 ex: Search(Rope("​abcde"​),​ 1, 3) -> "​bc"​ ex: Search(Rope("​abcde"​),​ 1, 3) -> "​bc"​
  
-4. Split(R1, i) - împărțirea unui rope în 2 rope-uri separate+{{:​sd-ca:​teme:​tema3_2021:​search.png?​300 |}} 
 + 
 +==== 4. Split - 20p ==== 
 + 
 +<code c> 
 +SplitPair split(RopeTree* rt, int idx); 
 +</​code>​ 
 + 
 +Split(R1, i) - împărțirea unui rope în 2 rope-uri separate 
 ex: Split(Rope("​abcde"​),​ 2) -> (Rope("​ab"​),​ Rope("​cde"​)) ex: Split(Rope("​abcde"​),​ 2) -> (Rope("​ab"​),​ Rope("​cde"​))
  
-5. Insert(R1, i, str) - inserarea unui string pe o poziție a unui rope+Exemplu 1: 
 + 
 +{{:​sd-ca:​teme:​tema3_2021:​split1.png?​700 |}} 
 + 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +Exemplu 2: 
 + 
 +{{:​sd-ca:​teme:​tema3_2021:​split2.png?​700 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 + 
 +Exemplu 3: 
 + 
 +{{:​sd-ca:​teme:​tema3_2021:​split3.png?​900 |}} 
 + 
 +==== 5. Insert - 5p ==== 
 + 
 +<code c> 
 +RopeTree* insert(RopeTree* rt, int idx, const char* string); 
 +</​code>​ 
 + 
 +Insert(R1, i, str) - inserarea unui string pe o poziție a unui Rope 
 ex: Insert(Rope("​abcde"​),​ 1), "​123"​) -> Rope("​a123bcde"​) ex: Insert(Rope("​abcde"​),​ 1), "​123"​) -> Rope("​a123bcde"​)
  
-6. Delete(R1, start, len) - ștergerea substringului din intervalul [start, start+len) 
-ex: Delete(Rope("​abcde"​),​ 1, 2) -> Rope("​ade"​) 
  
 +<note important>​Dacă ați implementat corect operațiile Split și Concat, Insert-ul va fi practic un Split, urmat de două Concat-uri.</​note>​
  
 +
 +
 +==== 6. Delete - 5p ====
 +
 +<code c>
 +RopeTree* delete(RopeTree* rt, int start, int len);
 +</​code>​
 +
 +Delete(R1, start, len) - ștergerea substringului din intervalul [start, start+len)
 +
 +ex: Delete(Rope("​abcde"​),​ 1, 2) -> Rope("​ade"​)
 +
 +<note important>​Dacă ați implementat corect operațiile Split și Concat, Delete-ul va fi practic două Split-uri, urmate de un Concat.</​note>​
  
 === Precizări === === Precizări ===
-<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 warning>Aveți grijă ca Rope-urile create ​de funcțiile voastre să **respecte cele două proprietăți din definiția unui Rope**!</​note>​ 
 + 
 +<note warning>​Nu încercați să vă folosiți de "​trucuri" ​pentru ​a ocoli dificultatea cerințelor. 
 + 
 +Următorele sunt exemple 
 +de operații care, deși returnează Rope-uri care respectă definiția, **nu vor fi punctate**:​ 
 +</​note>​ 
 + 
 +{{:​sd-ca:​teme:​tema3_2021:​nu2.png?​400 |}} 
 + 
 +{{:​sd-ca:​teme:​tema3_2021:​nu1.png?​600 |}} 
 + 
 +{{:​sd-ca:​teme:​tema3_2021:​nu3.png?​600 |}}
  
-<​note ​important>Având în vedere ca a 3-a parte a temei presupune implementarea unei structuri de date probabilisticecheckerul ofera punctajul daca raspunsul vostru se incadreaza intr-o marja de eroare de 10% fata de raspunsul corect.</​note>​+<​note ​warning>Dacă nu sunteți siguriputeți întreba pe forum. 
 +</​note>​
  
-=== Checker === +=== Schelet + Checker === 
-{{:​sd-ca:​teme:​2-distinct-count.zip|CHECKER}} +{{:​sd-ca:​teme:​tema3_2021:​checker.zip|DOWNLOAD}}
  
 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 74: Line 193:
 Arhiva trebuie să conțină: Arhiva trebuie să conțină:
   * surse   * surse
-  * fișierul Makefile **din arhiva cu checkerul** 
   * fișier **README** care să conțină detalii despre implementarea temei   * fișier **README** care să conțină detalii despre implementarea temei
  
Line 82: Line 200:
  
   - 80p teste   - 80p teste
-  - **Fiecare** test este verificat ​cu valgrind. Dacă un test are memory leaks, nu va fi punctat.+  - Testele pentru operațiile elementare sunt verificate ​cu valgrind. Dacă un test are memory leaks, nu va fi punctat.
   - 20p README + comentarii/​claritate cod (ATENȚIE! Fișierul README trebuie făcut explicit, cât să se înțeleagă ce ați făcut în sursă, dar fără comentarii inutile și detalii inutile).   - 20p README + comentarii/​claritate cod (ATENȚIE! Fișierul README trebuie făcut explicit, cât să se înțeleagă ce ați făcut în sursă, dar fără comentarii inutile și detalii inutile).
   - Se acordă 20% din punctajul obținut pe teste, ca bonus pentru coding style. De exemplu, pentru o temă care obține maxim pe teste, se pot obține 20p bonus dacă nu aveți erori de coding style. Pentru o temă ce trece 18 teste din 20, se pot obține 18p dacă nu aveți erori de coding style.   - Se acordă 20% din punctajul obținut pe teste, ca bonus pentru coding style. De exemplu, pentru o temă care obține maxim pe teste, se pot obține 20p bonus dacă nu aveți erori de coding style. Pentru o temă ce trece 18 teste din 20, se pot obține 18p dacă nu aveți erori de coding style.
Line 92: Line 210:
  
 ===FAQ=== ===FAQ===
- ​**Q:​** ​Ce functii de hashing trebuie sa folosesc in tema, la cerintele II si III? \\ \\ + ​**Q:​** ​Pot modifica structurile ​din schelet? \\ \\ 
- ​**A:​** Puteti folosi orice functii doriti. Un exemplu ar fi cele din laborator. + ​**A:​** ​Nu.
- +
- ​**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===+ ​**Q:​** Îmi pot implementa alte funcții helper, pe lângă cele cerute? \\ \\ 
 + ​**A:​** Desigur, chiar vă încurajăm să o faceți.
  
-[[https://​en.wikipedia.org/​wiki/​Count-distinct_problem]]+ **Q:** Deci pentru Insert si Delete pot să dau copy-paste la codul din funcțiile Split si Concat?\\ \\ 
 + ​**A:​** Nu dați copy-paste, vă vom scădea din punctaj pentru cod duplicat. Pur și simplu chemați funcțiile deja implementate cu parametri corespunzători
  
-[[https://​www.omnicoreagency.com/​youtube-statistics]]+ **Q:** Rope-urile trebuie echilibrate de către noi?\\ \\ 
 + ​**A:​** Nu.
  
-[[https://en.wikipedia.org/​wiki/​HyperLogLog]]+ **Q:** Nu mă prind cum aș putea folosi funcția ''​getTotalWeight''​ din scheletDe ce ați inclus-o?\\ \\ 
 + ​**A:​** Sincer, am folosit-o în implementarea soluției și am uitat să o ștergemDacă nu vi se pare evident cum v-ați putea folosi de ea și mai mult vă încurcă, puteți să o ștergeți :)
  
-[[https://en.wikipedia.org/​wiki/​Linear_probing]]+ **Q:** Am căutat informații despre Rope pe internet și am citit că greutatea unei frunze ar trebui să fie egală cu lungimea stringului pe care îl conțineRespectăm enunțul și o lăsăm 0? 
 + ​**A:​** Vom considera ambele variante drept corecte.
  
-[[https://​stackoverflow.com/​questions/​12327004/​how-does-the-hyperloglog-algorithm-work]]+ **Q:** Aș vrea să folosesc un string auxiliar în care să îmi extrag tot șirul din Rope și să mă folosesc de el mai departe. E în regulă? 
 + ​**A:​** Nu este permisă extragerea stringului din rope urmată de prelucrarea acestui string.
  
-</​hidden>​ 
sd-ca/teme/tema3-2021.1620856432.txt.gz · Last modified: 2021/05/13 00:53 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