Table of Contents

Tema 3 - Internet Movie Database

Responsabili:

Data publicarii: 1 mai, ora: 23:55

Deadline: 23 mai, ora 23:55

Modificări și actualizări

Obiective

În urma realizării acestei teme:

Intro

Internet Movie Database (IMDb) este o bază de date online ce conține informații legate de filme, programe de televiziune și jocuri video. A fost lansat în 1990 de către programatorul Col Needham, iar în 1998 a devenit o filială a Amazon Inc.

Î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.

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).

Datele din IMDb la care avem acces și sunt relevante pentru noi sunt:

Un film are următoarele informații:

Un utilizator are urmatoarele informatii:

Un actor are urmatoarele informatii:

Pe langa aceste informatii care sunt deja indexate in baza de date, sistemul nostru poate primi noi informatii in timp real:

Cerinta

Veți primi o succesiune de interogări la care va trebui să răspundeți cât mai rapid. De 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!

Operatii de adaugare/modificare

void add_movie(string movie_name, string movie_id, int timestamp, vector<string> categories,
               string director_name, vector<string> actors_ids)

Operatii de interogare

Observatii generale pentru toate interogarile:

  • daca raspunsul nu exista, atunci se va intoarce string-ul none
  • pentru afisarea numerelor sub forma de string se va folosi rotunjire, deci 9.33511 se va intoarce intr-un std::string ca 9.34

Date de intrare

Scheletul se ocupa de citirea tuturor datalor si paseaza parametrii corespunzatori fiecarei functii.

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 fisier. Tot ce trebuie sa faceti e ca la fiecare operatie sa generati un string pe baza rezultatui.

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”

Teste

Aici gasiti un schelet nou de cod (versiunea anterioara avea warning-uri la checker-ul de coding style inclus) impreuna cu o suita de teste si un checker local. Toate testele sunt publice!

Punctajul de pe vmchecker va fi cel luat in calcul, dar corectitunea poate fi verificata si local. Inca nu am terminat de configurat pe vmchecher, iar timpii din scriptul de rulare check.sh pot suferi modificari pe vmchecker.

Pentru a testa pe local:

$ make
$ ./check.sh
...

Diff-ul intre fisierul de referinta si cel de output al vostru se face cu un script python diff.py (vedeti in check.sh), pentru ca pot aparea anumite diferente la rotunjire.

Reguli pentru trimitere

Temele vor trebui trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).

O singura submisie per echipa e suficienta.

Arhiva trebuie să conțină:

Atenție! in README trebuie specificata echipa (nume+grupa fiecare) si sa ne convingeti de contributia fiecaruia dintre voi. Punctajele pot sa nu fie egale pentru cei doi membri ai echipei.

Punctaj

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!

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.

Exemplu input si output rulare

Testul de mai jos contine 3 filme si cativa actori la fiecare film. Totodata, exemplifica ce output s-ar obtine pentru fiecare apel de functie din cele detaliate mai sus.

input file:

// argumentele in fisier sunt in ordinea in care sunt si in semnaturile functiilor
// corespunzatoare.
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
// 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
add_movie;Scent of a woman;tt0105323;725068800;drama;Martin Brest;nm0000199,nm0000563,nm0714310
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
add_actor;nm0000008;Marlon Brando
// 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
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_actor;nm0000380;Robert Duvall
add_movie;The Godfather: Part II;tt0071562;169344000;crime,drama;Francis Ford Coppola;nm0000199,nm0000380
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

output file:

// 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 (trei) cu 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

FAQ

Q: Se poate folosi STL?

A: Se pot folosi urmatoarele structuri de date din STL: string, vector, map, unordered map, list, pair, queue (nu priority queue), stack, set, unordered set.

Q: Ce fac daca numarul de returnat e mai mic decat K intr-un query de tip Top K?

A: Returnezi cate sunt (mai putine decat K).

Q: Ambii membri ai echipei obtin acelasi punctaj?

A: Nu neaparat; cei doi membri ai echipei pot sa obtina punctaje diferite si trebuie sa ne convinga prin readme de contributia fiecaruia.

Q: E suficienta o singura submisie per pereche?

A: Da. Trebuie sa specificati in readme ambii membri ai echipei.

Q: Putem folosi algoritmi de sortare din STL?

A: Da, puteti folosi std::sort din <algorithm>. In plus, mai puteti folosi std::nth_element, std::find tot din <algorithm>.

Q: Putem folosi malloc și Free?

A: Nu. Folosiți new și delete, specifice c++.

Q: Are ceva dacă alocam memorie static?

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.g. anii acelor timestamp-uri.)?

A: Folosim UTC cand e nevoie de conversie tot timpul.