Responsabili:
Data publicarii: 1 mai, ora: 23:55
Deadline: 23 mai, ora 23:55
std::string actor_id = elems[2];
.add_actor
sa fie apelate inainte, conform cu intrebarile de pe forumcheck.sh
si nu cauta recursiv toate fisiere pentru style ; acum cauta si in include/Makefile
sa nu compileze cu -g; includeti voi local daca vretiÎn urma realizării acestei teme:
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:
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!
add_movie
are semnatura un pic mai lunga:void add_movie(string movie_name, string movie_id, int timestamp, vector<string> categories, string director_name, vector<string> actors_ids)
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)
void update_rating(string user_id, string movie_id, int rating)
void remove_rating(string user_id, string movie_id)
string get_rating(string movie_id)
string get_longest_career_actor()
none
.string get_most_influential_director()
string get_best_year_for_category(string category)
string get_2nd_degree_colleagues(string actor_id)
string get_top_k_most_recent_movies(int k)
movie_id1 movie_id2 … movie_idk
string get_top_k_actor_pairs(int k)
(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
. string get_top_k_partners_for_actor(int k, string actor_id)
actor_id
in caz de egalitate) separati prin spatiustring get_top_k_most_popular_movies(int k)
none
. Doar rating-ul este none
.string get_avg_rating_in_range (int timestampStart, int timestampEnd)
[timestampStart, timestampEnd]
.double
pentru reprezentarea rating-ului pentru a fi siguri ca obtineti acelasi rezultat la acest task
none
std::string
ca 9.34
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.
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”
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.
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ă:
Makefile
si main.cpp
(din schelet) vor fi incluse automat de noi
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.
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
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.