This shows you the differences between two versions of the page.
|
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 probabilistice, checkerul 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 siguri, puteț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 schelet. De ce ați inclus-o?\\ \\ |
| + | **A:** Sincer, am folosit-o în implementarea soluției și am uitat să o ștergem. Dacă 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ține. Respectă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> | ||