Differences

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

Link to this comparison view

sd-ca:teme:tema3 [2017/05/15 19:39]
andrei.petre3105 [Operatii de interogare]
sd-ca:teme:tema3 [2019/05/16 20:42] (current)
gabriel_danut.matei
Line 1: Line 1:
-====== Tema 3 - Internet Movie Database ​======+====== Tema 3 - Existential Graphs Reasoner ​======
  
  
 ** Responsabili:​ ** ** Responsabili:​ **
-  *[[armand.nicolicioiu@gmail.com|Armand Nicolicioiu]] +  *[[matei.danut.dm@gmail.com|Dănuţ Matei]] 
-  *[[p31andrei+sd@gmail.com|Andrei Petre]]+  *[[lucaistrate@gmail.com|Luca Istrate]]
  
-** Data publicarii1 mai, ora: 23:55 ** +** Data publicării ​27 aprilie, ora: 01:05 **
- +
-** Deadline: 23 mai, ora 23:55 ** +
- +
-== Modificări și actualizări == +
-  * **3 mai** +
-       * adaugare exemplu de input/​output +
-       * adaugat schelet de cod cu un singur test, cel din input/​output +
-  * **6 mai** +
-       * actualizat deadline  +
-       * adăugat noi răspunsuri în FAQ +
-       * scos bonus sistem recomandari +
-  * **14 mai** +
-       * corectat un bug in schelet (conform mentiunii de pe forum de [[http://​cs.curs.pub.ro/​2016/​mod/​forum/​discuss.php?​d=3442|aici]]);​ la linia main.cpp:​116 acum este ''​std::​string actor_id = elems[2];''​.+
  
 +** Deadline: 19 mai, ora 23:55 **
  
 +== Modificări şi actualizări == 
 +  * **1 mai, ora 00:25** - adăugat **schelet + checker**
 +  * **10 mai, ora 17:50** - adăugat în **arhivă** fișier necesar pentru partea de **coding style**;
 +  * **10 mai, ora 18:20** - mică clarificare în exemplul de **possible_erasures()** din secţiunea //Metode de implementat//​
 +  * **16 mai, ora 21:15** - am adăugat tema și pe **vmchecker**
  
 ===== Obiective ===== ===== Obiective =====
  
 În urma realizării acestei teme: În urma realizării acestei teme:
-  * veti invata cum sa adaptati structuri de date cunoscute la cerinte mai complicate +  * veţi exersa lucrul colaborativ ​în echipe de câte doi  
-  * veti invata sa apreciati diferentele de timp si memorie consumata intre diverse structuri de date +  * veţi putea lucra cu elemente colaborative pentru ​uşurarea ​muncii (e.g git pentru versionare de cod)  
-  * veti exersa lucrul colaborativ ​in echipe de cate doi +  * veţi învăţa să lucraţi cu structuri ​arborescente ​ 
-  * veti putea lucra cu elemente colaborative pentru ​usurarea ​muncii (e.g git pentru versionare de cod) +  * vă veţi acomoda cu gândirea şi implementarea ​de funcţii recursive ​
-  * veti putea folosi diverse ​structuri ​de date cu arbori pentru a rezolva problemele eficient +
-  * veti putea invata cate ceva despre cum functioneaza un sistem ​de recomandari clasic +
  
 ===== Intro ===== ===== Intro =====
  
-Internet Movie Database (IMDb) ​este o bază de date online ce conține informații legate de filmeprograme ​de televiziune și jocuri video. +Un [[https://​en.wikipedia.org/​wiki/​Existenţial_graph|graf existenţial]] ​este o formă de reprezentare vizuală a expresiilor logicepropusă ​de [[https://​en.wikipedia.org/​wiki/​Charles_Sanders_Peirce|Charles Sanders Peirce]] ​în 1882. Avantajul acestora este faptul ​că oferă ​alternativă vizuală la inferenţprin formule logice matematice. ​  
-A fost lansat ​în 1990 de tre programatorul Col Needham, iar în 1998 a devenit ​filială a Amazon Inc.+   
 +Scopul temei este realizarea unui program care verifică dacă există un raţionament valid care poate ajunge de la o ipoteză dată la o concluzie dată şi, în caz afirmativ, să afişeze transformările intermediare implicate în acest raţionament
  
-În prezent numără 4.2 milioane de titluri și 7.8 milioane de personalități. De asemenea, are 75 de milioane de utilizatori înregistrați.+===== Grafuri existenţiale =====
  
-Pe vară, am reusit sa obtinem un internship pe backend pentru IMDb. Avem acces la baza lor de date din toate timpurile (omg, ce onoare). Scopul acestui internship este să construim un set de structuri de date eficiente si să le refolosim cat mai mult posibil ​-- codul nostru să fie generic și reutulizabil de alți colegi/​interni în viitor. Comentariile ne vor ajuta atata pe noi cât și pe cei care vor citi codul nostru după ce ne-am terminat internship-ul (retineti că un cod e citit de mult mai multe ori decât e scris -- inclusiv de către voi, dacă reveniți peste 2-3 luni să recitiți ce ați scris).+Sintaxa unui **graf existenţial** este formată din 3 tipuri ​de entităţi:  
 +  * **Foaia ​de aserţiune** ​o suprafaţă imaginară pe care se vor trece restul elementelor; ​  
 +  * **Litere**, simbolizând propoziţii logice  
 +  * **Tăieturi** - linii circulare închise ​ce reprezintă negarea elementului / grupului ​de elemente pe care îl conţin ​
  
-Datele din IMDb la care avem acces și sunt relevante pentru noi sunt+În continuare, vom considera că //foaia de aserţiune este unică per desen//.  
-  colecția de filme +   
-  lista de utilizatori și rating-urile oferite ​de aceștia unor filme+Toate elementele ​care sunt trecute direct pe foaia de aserţiune se consideră a fi simultan adevărate. Astfel, dacă propoziţiile **P** , **Q** ş**R** sunt trecute pe foaia de aserţiune, atunci propoziţia “**P şi Q şi R**” este adevărată.  
 +\\ 
 +\\ 
 +\\ 
 +Să analizăm cum ar arăta o serie de propoziţii sub formă de grafuri existenţiale:  
 +\\ 
 +\\ 
 +{{:​sd-ca:​teme:​tema3:​a.png?​100 |}} 
 +\\ 
 +**P && Q**-literele **P** şi **Q** sunt trecute direct pe foaia de aserţiune. Distanţa şi poziţia lor nu au nicio relevanţă pentru valoarea lor de adevăr.  
 +\\ 
 +\\ 
 +\\ 
 +{{:​sd-ca:​teme:​tema3:​b.png?​100 |}} 
 +\\ 
 +\\ 
 +\\ 
 +**!P**-deoarece litera **P** este înconjurată ​de o tăietură, atunci valoarea de adevăr a propoziţiei este negată  
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +{{:sd-ca:​teme:​tema3:​c.png?​100 |}} 
 +\\ 
 +**P => Q**, echivalentă logic cu “**!(P and !Q)**”-litera **Q** este înconjurată ​de o tăietură, această nouă formaţiune e trecută lângă litera **P**, iar ambele sunt în continuare înconjurate de o tăietură comună 
 +\\ 
 +\\ 
 +\\ 
 +{{:​sd-ca:​teme:​tema3:​d.png?​100 |}} 
 +\\ 
 +**P || Q**, echivalentă logic cu “**!(!P && !Q)**”-foarte similar cu exemplul **c)**  
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +Astfel, un **graf** poate fi:  
 +  * o propoziţie  
 +  * o tăietură, împreună cu toate elementele pe care le înconjoară\\
  
-Un film are următoarele informații:​ +<note important>​**Atenţie!** Subgrafurile accentuate cu roşu sunt diferite: ​
-  ​nume +
-  ​id (un string) +
-  ​data apariției (ca unix timestamp) +
-  ​regizorul filmului +
-  * listă actori +
-  * o listă de categorii+
  
-Un utilizator are urmatoarele informatii+{{:sd-ca:​teme:​tema3:​31.png?​nolink&​100|}} {{:​sd-ca:​teme:​tema3:​32.png?​nolink&​100|}} 
-  * nume +</​note> ​
-  * id+
  
-Un actor are urmatoarele informatii:​ +Definim ​**nivelul** pe care se află un subgraf drept un număr întreg egal cu //numărul de tăieturi de care e înconjurat subgraful//​. Astfel, un subgraf care se află pe foaia de aserţiune se află pe nivelul 0, unul înconjurat de o tăietură se află pe nivelul 1 etc. 
-  ​nume +
-  ​id+
  
-Pe langa aceste informatii ​care sunt deja indexate in baza de datesistemul nostru poate primi noi informatii in timp real: +<note important>​**Atenţie!** În numărarea tăieturilor ce înconjoară un subgraf nu includem şi tăietura ​care delimitează acel subgraf. Spre exemplusubgraful colorat ​cu roşu se află pe nivelul 2 pentru că este înconjurat ​de 2 tăieturi: ​
-  * un nou film tocmai a fost adaugat (cu toate metadatele ​de mai sus) +
-  * un nou rating a fost adaugat/​actualizat/​sters de catre un utilizator unui anumit film (care trebuie sa existe) +
-===== Cerinta =====+
  
-Veți primi o succesiune de interogări la care va trebui să răspundeți cât mai rapidDe asemenea, va trebui să actualizați baza de date pe măsură ce se primesc informații noi (pentru punctaj maxim va fi nevoie de un mod eficient). Query-urile si actualizările pot și vor fi intercalate! Beware! ​+{{ :​sd-ca:​teme:​tema3:​hhh.png?200 |}} 
 +</​note>​
  
-Folisiti ​{{sd-ca:​teme:​3-imdb-schelet.zip|scheletul de cod}} pentru ​incepe. Modificarile voastre trebuie sa fie in alte fisiere ''​.h''​ aferentenu in main.cpp sau in Makefile. Daca vreti sa faceti compilarea cu mai putine warning-uri pana terminati temaputeti sa scoateti flag-ul ''​-Wextra''​ temporarinsa pe vmchecker vom compila ​cu toate flag-urile de warning-uri (folosind Makefile-ul primit in schelet).+Alte exemple: 
 +\\ 
 +{{ :sd-ca:teme:tema3:new1.png?​400 ​|}} 
 +\\ 
 +\\ 
 +Noţiunea de nivel poate fi înţeleasă mai intuitiv dacă ne imaginăm fiecare tăietură ca pe un disc circular pe care se aşază restul elementelor conţinute de aceastaSpre exemplupentru propoziţia **S && !(!(P && !Q) && R)**graful existenţial ar arăta în felul următor: 
 +\\ 
 +\\ 
 +{{ :sd-ca:​teme:​tema3:​shu.png?​250 |}} 
 +\\ 
 +Dacă ar fi să ne imaginăm cum ar arăta acest graf privit dintr-un plan lateralam vedea ceva similar ​cu:  
 +\\ 
 +\\ 
 +{{ :sd-ca:​teme:​tema3:​pic00.png?200 |}}
  
-==== Operatii de adaugare/​modificare ==== 
  
-  * ''​add_movie''​ are semnatura un pic mai lunga: +===== Arbori echivalenţi =====
-<code cpp> +
-void add_movie(string movie_name, string movie_id, int timestamp, vector<​string>​ categories,​ +
-               ​string director_name,​ vector<​string>​ actors_ids) +
-</​code>​ +
-  * ''​void add_actor(string actor_id, string name)''​ +
-  * ''​void add_user(string user_id, string name)''​ +
-  * ''​void add_rating(string user_id, string movie_id, int rating)''​ +
-    * Un user poate adauga cel mult un rating pentru un film. +
-  * ''​void update_rating(string user_id, string movie_id, int rating)''​ +
-  * ''​void remove_rating(string user_id, string movie_id)''​+
  
 +Ţinând cont de această structură ierarhică, am putea încerca să reprezentăm un graf existenţial sub formă de arbore. Astfel, rădăcină va reprezenta foaia de aserţiune, iar fiii acesteia vor fi subgrafurile de pe nivelul 0. Un nod diferit de rădăcină va reprezenta fie o propoziţie (caz în care nu va avea fii), fie o tăietura (caz în care va avea drept fii subgrafurile pe care le încercuieşte). ​
  
-==== Operatii de interogare ====+Spre exemplu, un **arbore echivalent** pentru exemplul precedent ar arăta în felul următor:  
 +\\ 
 +\\ 
 +{{ :​sd-ca:​teme:​tema3:​sinc1.png?​125 |}} 
 +\\ 
 +Se poate observa o corespondenţă între nivelul în graful existenţial şi nivelul în arborele echivalent:  
 +\\ 
 +\\ 
 +\\ 
 +{{ :​sd-ca:​teme:​tema3:​pic01.png?​300 |}} 
 +\\ 
 +\\ 
 +{{ :​sd-ca:​teme:​tema3:​sinc3.png?​225 |}}
  
-  * ''​string get_rating(string movie_id)''​ 
-    * Intoarce rating-ul unui film, reprezentand media tuturor rating-urilor date de utilizatori pentru filmul respectiv. 
-  * ''​string get_longest_career_actor()''​ 
-    * Intoarce id-ul actorului cu cea mai lunga activitate (diferenta dintre data de aparitie a celui mai recent film in care a jucat si data de aparitie a primului film). In caz de egalitate, se va intoarce primul ordonat crescator dupa id. 
-    * Daca un actor a jucat in exact un film, atunci vom considera activitatea sa ca fiind 0. Daca toti actorii au activitate de lungime 0, se aplica prioritatea de mai sus in care il vom intoarce pe primul ordonat crescator dupa id. 
-    * Daca nu aveti niciun actor care sa fi jucat in vreun film, intoarceti ''​none''​. 
-  * ''​string get_most_influential_director()''​ 
-    * Intoarce numele regizorului care a lucrat cu cei mai multi actori. In caz de egalitate, se va intoarce primul ordonat crescator dupa nume. 
-  * ''​string get_best_year_for_category(string category)''​ 
-    * Intoarce anul in care rating-ul mediu al filmelor din categoria ceruta este maxim. In caz de egalitate, se va intoarce anul minim. 
-  * ''​string get_2nd_degree_colleagues(string actor_id)''​ 
-    * Un actor Y este o legatura de gradul 1 cu X doar daca au jucat impreuna in cel putin un film. Legatura de gradul 2 inseamna acei actori Z care au jucat impreuna cu un actor de gradul 1 al lui X dar nu cu X direct. 
-    * Intoarce o lista de actori ordonati crescator dupa id separati prin spatiu 
-  * ''​string get_top_k_most_recent_movies(int k)''​ 
-    * Intoarce un string de forma ''​movie_id1 movie_id2 ... movie_idk''​ 
-    * Ordonarea se face descrescator dupa timestamp aparitie 
-  * ''​string get_top_k_actor_pairs(int k)''​ 
-    * Actorii care au jucat impreuna in cele mai multe filme (perechi de cate doi) 
-    * Intoarce un triplet de forma ''​(actor_id1,​ actor_id2, nr_filme)''​ delimitate prin spatiu, sortate dupa ''​nr_filme''​. In caz de egalitate, se va sorta dupa ''​actor_id1''​ si in caz de egalitate din nou, dupa ''​actor_id2''​. Totodata, ''​actor_id1 < actor_id2''​. <​hidden>​Hint:​ recomandam sa folositi o functia de comparare care verifica toate conditiile de mai sus</​hidden>​ 
-  * ''​string get_top_k_partners_for_actor(int k, string actor_id)''​ 
-    * Top K actori care au colaborat cel mai mult cu un actor dat (dupa numarul de filme). 
-    * Intoarce o lista de actori ordonati descrescator dupa numarul de filme (si crescator dupa ''​actor_id''​ in caz de egalitate) separati prin spatiu 
-  * ''​string get_top_k_most_popular_movies(int k)''​ 
-    * Cele mai populare k filme. (popular = cate rating-uri a primit) 
-    * Intoarce o lista de id-uri ale filmelor ordonate descrescator dupa numar (si, in caz de egalitate, crescator dupa id film) delimitate prin spatiu 
-    * Daca filmul nu a primit niciun rating, atunci numarul de rating-uri primite este 0, nu ''​​none''​. Doar rating-ul este ''​none''​. 
-  * ''​string get_avg_rating_in_range (int timestampStart,​ int timestampEnd)''​ 
-    * Media finala se face pe baza rating-urilor filmelor deja aflate (nerotunjite) ce corespund intervalului ''​[timestampStart,​ timestampEnd]''​. 
-    * Returneaza un singur string corespunzator unui numar real cu doua zecimale 
-    * Folositi ''​double''​ pentru reprezentarea rating-ului pentru a fi siguri ca obtineti acelasi rezultat la acest task 
  
-<​note>​ +<​note ​tip
-Observatii generale pentru toate interogarile:​ +  * Ordinea fiilor unui nod nu contează ​ 
-  * daca raspunsul ​nu exista, atunci se va intoarce string-ul ''​none''​ +  * Frunzele trebuie să fie întotdeauna propoziţii,​ în afara cazului în care foaia de aserţiune este goală ​
-  * pentru afisarea numerelor sub forma de string se va folosi rotunjire, deci 9.33511 se va intoarce intr-un ''​std::​string''​ ca 9.34+
 </​note>​ </​note>​
  
-<​hidden>​ 
  
-Ascuns pana terminam tot și facem un checker exact pt el poate.  +===== Cerinţă ​=====
-===== Bonus - Sistem de recomandari ​=====+
  
-Deja v-ati obisnuit cu cerinte ​de analiza datelorAvand un dataset mare de filmedar si de rating-uri ale utilizatorilor, va propunem implementarea unui sistem ​de recomandari+Sarcina voastră va fi să realizaţi operaţii pe un asemenea arbore pentru a implementa o parte din regulile ​de inferenţă care vor fi prezentate în continuare 
 +   
 +Pentru ca sistemul de grafuri existenţiale să fie echivalent cu logica propoziţională,​ avem nevoie de 5 reguli de inferenţă:​  
 +  * **Insertion** - orice subraf poate fi inserat pe un **nivel impar**  
 +  * **Erasure** - orice subgraf poate fi şters ​de pe un **nivel par**  
 +  * **Double Cut** - o pereche de tăieturi care nu au nimic între ele poate fi eliminată (din acelaşi motiv pentru care **!!P** este echivalent cu **P**)  
 +  * **Deiteration** - Fie **n** un nod n care are drept fiu graful **k**. Graful **k** poate fi şters din orice alt descendent al nodului **n**.  
 +  * **Iteration** - Fie **n** un nod care are drept fiu graful **k**. Graful k poate fi introdus drept fiu al oricărui alt descendent al nodului **n**.  
 +   
 +Ceea ce ne dorim să facem este cadându-se o ipoteză şi o concluzie, să verificăm dacă există o demonstraţie,​ adică o modalitate ​de a ajunge la concluzie printr-o serie de transformări asupra ipotezei.  
 +   
 +Totuşio modalitate mai simplă pentru a demonstra propoziţia **P => Q** (ipoteză implică concluzie) este să folosim principiului reducerii la absurd, demonstrând că **!(P => Q)** duce la o contradicţie. **P => Q** este echivalent cu \ **!(P && !Q)**, deci **!(P => Q)** va fi echivalent cu **!!(P && !Q)**, adică **P && !Q**.  
 +   
 +Astfel, pornim cu **P && !Q** pe foaia de aserţiune (unde **P** reprezintă propoziţiile din ipoteză, iar **Q** propoziţiile din concluzie) şi, folosind regulile de inferenţă,​ încercăm să ajungem la o contradicţie (în general, un graf de tipul \ **K && !K**).  
 +   
 +Acest proces este unul de simplificare a structurii grafului, deci în simularea lui va trebui să implementaţi numai regulile **2**, **3** şi **4** (**Erasure**,​ **Double Cut** şi **Deiteration**).  
 +Din cauza faptului că, la un pas oarecare, alegerea regulii următoare nu este deterministă,​ vom avea nevoie de o strategie ​de tip //​backtracking//​ (implementată deja în checker)
  
-Pentru un user dat si istoricul sau, sistemul trebuie sa recomande o lista de filme si nota pe care crede ca utilizatorul o va da fiecarui film.+===== Reprezentarea serializată =====
  
-Fiind interni, veti primi ajutor in rezolvarea acestui task, dar nu pana nu va veti documenta singuri. :+În scheletul de cod şi în testarea operaţiilor ne-am folosit de **reprezentarea serializată** a arborilor echivalenţiCâteva exemple ale acestei serializari sunt
-</​hidden>​+
  
-===== Date de intrare ===== 
  
-Scheletul se ocupa de citirea tuturor datalor si paseaza parametrii corespunzatori fiecarei functii.+{{ :​sd-ca:​teme:​tema3:​new2.png?400 |}}
  
-Fisiere de intrare pot fi si inspectate manual, fiecare linie reprezentand o singura operatie. Primul string al fiecarei linii reprezinta tipul operatiei. 
-===== Date de iesire ===== 
  
-Toate output-urile interogarilor sunt deja preluate in schelet si scrise intr-un fisierTot ce trebuie ​sa faceti ​ca la fiecare operatie sa generati un string pe baza rezultatui.+Conversia între structura internă a unui arbore echivalent şi reprezentarea serializată,​ precum şi conversia inversă, au fost deja implementate în scheletul de codMotivul pentru care trebuie ​să înţelegeţi această reprezentare ​pentru a putea înţelege input-ul şi output-ul şi pentru a vă putea crea teste custom
  
-De exemplu, functia ''​get_top_k_most_popular_movies(int k)''​ va returna o lista de id-uri concatenate prin spatiu: ''"​id1 id2 id3 .. idk"''​ +===== Exemple de operaţii ​=====
-===== Teste =====+
  
-Toate testele vor fi publice! Punctajul de pe vmchecker va fi cel luat in calcul (pentru ​ca timpii de rulare sunt calibrati pentru server, nu pentru masinile voastre locale) dar corectitunea poate fi verificata si local.+==== Double Cut ==== 
 +{{:sd-ca:​teme:​tema3:​new9.png?400 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\
  
-===== Punctaj =====+==== Deiteration ​==== 
 +**1.** 
 +\\ 
 +{{:​sd-ca:​teme:​tema3:​new6.png?​300 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +**2.** 
 +\\ 
 +{{:​sd-ca:​teme:​tema3:​new7.png?​400 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +<note warning>​ 
 +Exemplu **incorect**:​ 
 +\\ 
 +{{:​sd-ca:​teme:​tema3:​new8.png?​500 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +Este incorect deoarece un subgraf poate fi deiterat **doar din fiii nodului curent** 
 +</​note>​
  
-  ​80 puncte obținute pe testele de pe vmcheckerCondiții pentru obținerea punctajului total: +==== Erasure ==== 
-       fără memleak-uri +**1.** 
-       fără erori de valgrind +\\ 
-  * 20 puncteREADME +{{:sd-ca:​teme:​tema3:​new3.png?​300 |}} 
-  * **Bonus 20% din punctajul obținut** pentru coding style +\\ 
-       * spre exemplucu 60p din 100p și coding style perfect, obțineți 60*1.2 = 72p +\\ 
-<hidden+\\ 
-  * **Bonus 20% din punctajul obținut** pentru taskul bonus de sistem de recomandări +\\ 
-       * atat bonus-ul de coding style cat si acesta ​se calculeaza procentual din punctajul obtinut prin task-uri; ​un bonus nu va contribui la calculul procentului celuilalt bonus +\\ 
-</hidden>+\\ 
 +**2.** 
 +\\ 
 +{{:sd-ca:​teme:​tema3:​new4.png?350 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +<note warning
 +Exemplu ​**incorect**: 
 +\\ 
 +{{:sd-ca:​teme:​tema3:​new5.png?​425 |}} 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +\\ 
 +Este incorect deoarece un subgraf poate fi şters **numai dacă se află pe un nivel par**. 
 +</note>
  
-<note warning>​**Nu copiați!** Toate soluțiile vor fi verificate folosind o unealtă ​de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine care e) vor primi punctaj 0 pe **toate temele**!+===== Metode ​de implementat =====
  
-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> ​+==== possible_double_cuts()  ====
  
 +  * întoarce poziţiile pe care am putea realiza operaţii de double cut
  
-===== Exemplu ​input si output rulare =====+Exemplu
  
-Testul de mai jos contine 3 filme si cativa actori la fiecare film. Totodataexemplifica ce output s-ar obtine pentru fiecare apel de functie din cele detaliate mai sus.+    ([[AB]], [[[[A, B, C]], [[A], D], N]]) 
 +     
 +    0 
 +    1 
 +    1 0 0
  
-**input** file: +{{:sd-ca:​teme:​tema3:​new10.png?250| }}
-<code cpp> +
-// Inputul nu o sa contina comentarii ; le includem aici pentru a evidentia query-urile mai usor +
-// add_movie(string movie_name, string movie_id, int timestamp, vector<​string>​ categories,​ +
-//           ​string director_name,​ vector<​string>​ actors_ids) +
-// observati ​ca argumentele sunt in ordine in fisier, la fel ca semnatura functiei. +
-// nm0000199,​nm0000563,​nm0714310 e un vector de string-uri reprezentand id-urile actorilor +
-// la fel e si la celelalte functii, argumentele in fisier sunt in ordinea in care sunt si in semnaturile functiilor +
-// corespunzatoare. +
-add_movie;​Scent of a woman;​tt0105323;​725068800;​drama;​Martin Brest;​nm0000199,​nm0000563,​nm0714310 +
-add_user;​ch0114428;​Patrick Jane +
-add_user;​ch0111140;​Teresa Lisbon +
-add_user;​ch0000033;​Chewbacca +
-add_actor;​nm0000199;​Al Pacino +
-add_actor;​nm0000563;​Robin Tunney +
-add_actor;​nm0048932;​Simon Baker +
-add_actor;​nm0714310;​James Rebhorn +
-get_rating;​tt0105323 ​                           // 1 +
-add_rating;​ch0114428;​tt0105323;​9 +
-add_rating;​ch0111140;​tt0105323;​9 +
-add_rating;​ch0000033;​tt0105323;​2 +
-update_rating;​ch0000033;​tt0105323;​10 +
-get_rating;​tt0105323 ​                           // 2 +
-remove_rating;​ch0000033;​tt0105323 +
-remove_rating;​ch0111140;​tt0105323 +
-get_rating;​tt0105323 ​                           // 3 +
-get_longest_career_actor ​                       // 4 +
-// crime,drama e tot un vector de string-uri, reprezentand categoriile;​ la filmul anterior +
-// vectorul avea dimensiunea 1. +
-add_movie;​The Godfather;​tt0068646;​83462400;​crime,​drama;​Francis Ford Coppola;​nm0000199,​nm0000008 +
-add_actor;​nm0000008;​Marlon Brando +
-get_longest_career_actor ​                       // 5 +
-get_most_influential_director ​                  // 6 +
-get_best_year_for_category;​drama ​               // 7 +
-add_rating;​ch0111140;​tt0068646;​10 +
-get_best_year_for_category;​drama ​               // 8 +
-get_best_year_for_category;​comedy ​              // 9 +
-get_2nd_degree_colleagues;​nm0000199 ​            // 10 +
-add_movie;​The Godfather: Part II;​tt0071562;​169344000;​crime,​drama;​Francis Ford Coppola;​nm0000199,​nm0000380 +
-add_actor;​nm0000380;​Robert Duvall +
-get_2nd_degree_colleagues;​nm0000199 ​            // 11 +
-get_2nd_degree_colleagues;​nm0000008 ​            // 12 +
-get_most_influential_director ​                  // 13 +
-get_top_k_most_recent_movies;​2 ​                 // 14 +
-get_top_k_actor_pairs;​2 ​                        // 15 +
-get_top_k_partners_for_actor;​2;​nm0000380 ​       // 16 +
-get_top_k_partners_for_actor;​2;​nm0000199 ​       // 17 +
-get_top_k_most_popular_movies;​2 ​                // 18 +
-add_rating;​ch0000033;​tt0105323;​3 +
-get_top_k_most_popular_movies;​4 ​                // 19 +
-get_avg_rating_in_range;​0;​725068800 ​            // 20 +
-get_avg_rating_in_range;​169344000;​169344000 ​    // 21 +
-add_rating;​ch0111140;​tt0105323;​10 +
-add_rating;​ch0111140;​tt0071562;​9 +
-get_avg_rating_in_range;​126403200;​725068800 ​    // 22 +
-get_avg_rating_in_range;​0;​1000 ​                 // 23 +
-get_avg_rating_in_range;​725068800;​725068800 ​    // 24 +
-get_avg_rating_in_range;​169344000;​169344000 ​    // 25 +
-</​code>​+
  
 +Putem aplica double cut pe fiul 0 al rădăcinii:​ ''​%%[[A,​ B]]%%'' ​
 +  ​
 +Pe fiul 1: ''​%%[[[[A,​ B, C]], [[A], D], N]]%%'' ​
 +  ​
 +Sau selectăm fiul 1 al rădăcinii,​ apoi fiul 0 al acestuia, apoi fiul 0 al acestuia din urmă, deci pe: ''​%%[[A,​ B, C]]%%'' ​
 +  ​
 +<note undefined> ​
 +Observaţi că graful ''​%%[[N,​ [[A, B, C]], [D, [A]]]]%%''​ este identic cu graful ​
 +''​%%[[[[A,​ B, C]], [[A], D], N]]%%'',​ doar că ordinea fiilor este diferită. ​
 +  ​
 +Sortarea este deja implementată în schelet şi este apelată de oricâte ori este nevoie în teste, deci ordinea în care ţineţi fiii nodurilor nu va afecta rezultatul. ​
 +</​note>​
  
-**output** file: +==== double_cut(L ====
-<code cpp> +
-// Output-ul nu o sa contina comentarii; le includem aici pentru a evidentia query-urile mai usor +
-none                                                // 1 +
-9.33                                                // 2 +
-9.00                                                // 3 +
-// Al Pacino este primul actor ordonat dupa id, asa ca il intoarcem pe el, fiindca toti actorii au activitate 0 momentan. +
-nm0000199 ​                                          // 4 +
-// Acum Al Pacino are activitate mai mare decat 0; e singurul de altfel. +
-nm0000199 ​                                          // 5 +
-Martin Brest                                        // 6 +
-// godfather n-are rating +
-1992                                                // 7 +
-// godfather are rating mai mare acum pt aceasta categorie +
-1972                                                // 8 +
-none                                                // 9 +
-none                                                // 10 +
-none                                                // 11 +
-// Care sunt legaturile de grad 2 ale lui Marlon Brando? +
-// A jucat in Godfather 1 cu Al Pacino, astfel ca toti colegii cu care a jucat +
-// Al Pacino dar nu si Marlon Branco sunt de gradul 2. +
-nm0000380 nm0000563 nm0714310 ​                      // 12 +
-// E la egalitate cu Martin Brest ca numar de actori ​(treicu care a colaborat;​ +
-// dar e primul ordonat lexicografic dupa nume +
-Francis Ford Coppola ​                               // 13 +
-tt0105323 tt0071562 ​                                // 14 +
-(nm0000008 nm0000199 1) (nm0000199 nm0000380 1)     // 15 +
-nm0000199 ​                                          // 16 +
-nm0000008 nm0000380 ​                                // 17 +
-tt0068646 tt0105323 ​                                // 18 +
-tt0105323 tt0068646 tt0071562 ​                      // 19 +
-8.00                                                // 20 +
-// The Godfather: Part II n-are niciun rating inca +
-none                                                // 21 +
-// Scent of a woman are rating 7.3333333 (double precision) +
-// Godfather 2 are rating 9 +
-8.17                                                // 22 +
-none                                                // 23 +
-7.33                                                // 24 +
-9.00                                                // 25 +
-</​code>​+
  
 +  * realizează operaţia de double cut în poziţia primită ca argument (care se presupune că e validă) ​
 +  * L este o listă de indecşi ce indică numărul fiului care trebuie ales la fiecare pas.  ​
  
-===== FAQ =====+====  ​possible_deiterations() ​====
  
-**Q:** Se poate folosi STL?+  ​întoarce poziţiile unde am putea aplica operaţii de deiteration ​
  
-**A:** Se pot folosi urmatoarele structuri de date din STL: stringvectormapunordered maplist, pair, queue (nu priority queue), stack, set, unordered set.+Exemplu: 
 +    ([[A]][[[[A]D][[A]]N]]) 
 +     
 +    1 0 1
  
-**Q:** Ce fac daca numarul de returnat e mai mic decat K intr-un query de tip Top K?+{{:sd-ca:​teme:​tema3:​new11.png?200| }}
  
-**A:** Returnezi cate sunt (mai putine decat K).+Putem deitera doar fiul ''​%%[1 0 1]%%'':​ ''​%%[[A]]%%'',​ obţinând:
  
-**Q:** Ambii membri ai echipei obtin acelasi punctaj?+''​%%([[A]],​ [[[[A], D], N]])%%''​
  
-**A:** Nu neaparat; cei doi membri ai echipei pot sa obtina punctaje diferite si trebuie sa ne convinga prin readme de contributia fiecaruia.+==== deiterate(L) ====
  
-**Q:** E suficienta ​singura submisie per pereche?+  ​realizează operaţia de deiteration la poziţia specificată de **L**  
 +  * **L** este listă de indecşi care indică numărul subgrafului ce trebuie selectat la fiecare pas  
 +  * pentru un nod cu **n** copii, primii **k** fii sunt fii-tăieturi,​ iar următorii până la **n** sunt fii-frunză (atomi)  
 +  * dacă trebuie să selectăm un nod **n** mai mare decât **k**, înseamnă că este frunză (atom) şi vom selecta atomul cu numărul **n-k** ​
  
-**A:** Da. Trebuie sa specificati in readme ambii membri ai echipei.+==== possible_erasures() ====
  
-**Q:** Putem folosi algoritmi ​de sortare ​din STL?+   întoarce poziţiile unde am putea aplica operaţii de erase 
 +   
 + ​Exemplu 
 +     ​([[A]],​ [[[[A], D], [[A]], N]])  
 +       
 +     0  
 +     1  
 +     1 0 0  
 +     1 0 1  
 +     1 0 2  
 +       
 + ​{{:​sd-ca:​teme:​tema3:​new11.png?​200| }}  
 +   
 + Putem şterge fiul 0 al rădăcinii:​ ''​%%[[A]]%%''​  
 +   
 + Fiul ''​%%[1]%%'': ​ ''​%%[[[[A],​ D], [[A]], N]]%%''​  
 +   
 + Fiul ''​%%[1 0 0]%%'':​ ''​%%[[A],​ D]%%''​  
 +   
 + Fiul ''​%%[1 0 1]%%'':​ ''​%%[[A]]%%''​  
 +   
 + Fiul ''​%%[1 0 2]%%'':​ ''​%%N%%''​  
 +   
 + <​note important>​Operaţia ​de erase se poate realiza doar pe grafuri de pe niveluri pare</​note>​  
 +   
 + <​note warning>​Nu putem şterge un graf dacă este singurul graf <​del>​de pe nivelul</​del>​ **din tăietura** în care se află!  
 +   
 + ​Excepţie face nivelul 0 de pe care se pot şterge toate grafurile, rezultatul fiind un sheet of assertion gol.</​note>​  
 +   
 + ==== erase(L) ====  
 +   * similar cu operaţia deiterate  
 +   
 + ===== Schelet + Checker =====  
 +   * [[https://​ocw.cs.pub.ro/​courses/​_media/​sd-ca/​teme/​tema3/​schelet_checker.zip|schelet_checker.zip]] 
 +   * [[https://​vmchecker.cs.pub.ro/​ui/#​SD|vmchecker]]
  
-**A:** Da, puteti folosi ''​std::​sort''​ din ''<​algorithm>''​. In plus, mai puteti folosi ''​std::​nth_element'',​ ''​std::​find''​ tot din ''<​algorithm>''​.+===== Punctaj =====
  
-**Q:** Putem folosi malloc ​și Free?+  ​80 puncte obținute pe testele de pe vmchecker. Condiții pentru obținerea punctajului total: 
 +       fără memleak-uri 
 +       * fără erori de valgrind 
 +  * 10 puncteREADME 
 +  ​10 puncte pentru coding style, proporțional cu punctajul obținut pe teste 
 +<note warning>**Nu copiați!** Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine care e) vor primi punctaj 0 pe **toate temele**!
  
-**A:** Nu. Folosiți new și deletespecifice c+++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> ​
  
-**Q:** Are ceva dacă alocam memorie static? +===== FAQ =====
- +
-**A:** Nu, atâta timp cât știți dimensiunea de la bun început și puteți face asta în condiții ok (nu se șterge zona de memorie). Daca însă vreți sa alocați static o dimensiune foarte mare (10mil sau ceva mare hardcodat) doar pentru a va trece testele, ne rezervam dreptul de a va scădea din punctaj.+
  
-**Q:** Ce timezone folosim la conversia timestamp-ului intr-un string (cand se cer de e.ganii acelor timestamp-uri.)?​+**Q:** Ce se poate folosi din STL?  
 +   
 +**A:** Orice, atât timp cât respectaţi declaraţiile funcţiilor pe care trebuie să le implementaţi  
 +   
 +**Q:** Ambii membri ai echipei obţin acelaşi punctaj?  
 +   
 +**A:** Nu neapărat; cei doi membri ai echipei pot să obţină punctaje diferite dacă volumul ​de muncă depus de unul nu este comparabil cu cel depus de celălalt  
 +   
 +**Q:** E suficientă o singură submisie per pereche?  
 +   
 +**A:** DaTrebuie să specificaţi în README ambii membri ai echipei
  
-**A:** Folosim UTC cand e nevoie de conversie tot timpul. 
sd-ca/teme/tema3.1494866369.txt.gz · Last modified: 2017/05/15 19:39 by andrei.petre3105
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