Responsabili:
Data publicării: 10.05.2023
Deadline: 31.05.2023 ora 23:55
12.05: Am adaugat teste pentru task-1
12.05: Am clarificat afisarea la task-2
17.05: Am scos caracterele non-ascii din fisierul little_women.txt (Thanks Cristian-Ştefan LAZĂR)
21.05: Am updatat checkerul sa reduca numarul de crash-uri, si am adaugat feature-uri noi. (Vedeti sectiunea checker)
21.05: Clarificare afisarea la autocorrect
22.05: Clarificare afisarea la load task-1
Ne propunem sa implementam un sistem de corectare/completare a cuvintelor pentru un utilizator in baza istoricului lui (cuvinte folosite in trecut). Scopul nostru este sa folosim eficient structurile de date pentru a realiza cat mai rapid operatiile.
Pentru a lucra mai eficient cu aceasta problema, recomandam parcurgerea Laboratorului 11 - Trie pentru a realiza implementarea mai eficient. Nu vor exista depunctari pentru alte abordari decat Trie, insa aceasta este cea mai usoara si eficienta abordare a problemei.
INSERT <cuvant>
Retinem cuvantul sau incrementam frenventa de aparitie in cadrul structurii de date.
LOAD <filename>
Citim un fisier ascii (acesta va contine litere mici ale alfabetului englez si whitespace), si inseram toate cuvintele din el in structura de date. Acest fisier modeleaza istoricul utilizatorului.
Se garanteaza ca fisierul exista si este formatat corect.
REMOVE <cuvant>
Eliminam cuvantul (si eliberam memoria folosita de acesta) din structura de date (totusi acesta poate fi readaugat in viitor).
AUTOCORRECT <cuvant> <k>
Se cer toate cuvintele care difera de cuvantul dat, in maxim k caractere. Vom lua in calcul doar schimbari de litere, nu si inserari sau stergeri.
Se vor afisa toate cuvintele in ordine lexicografica.
Exemplu:
> INSERT mask > INSERT mass > INSERT man > INSERT bass > INSERT marks > AUTOCORRECT mars 1 < mass > INSERT mars > AUTOCORRECT mars 2 < bass < mars < mask < mass
<cuvant>
exista printre cuvinte, il vom afisa si pe acela
AUTOCOMPLETE <prefix> <nr-criteriu>
Pentru acest task, aveti de afisat 3 cuvinte:
Afisare:
Daca suntem in cazul 0, o sa afisam toate cele 3 criterii
> INSERT mama > INSERT matei > INSERT mar > INSERT mare > INSERT matei > AUTOCOMPLETE ma 0 < mama < mar < matei > AUTOCOMPLETE ma 1 < mama > AUTOCOMPLETE ma 2 < mar > AUTOCOMPLETE ma 3 < matei
EXIT
Eliberam memoria si terminam programul.
Tema cere implementarea structurii de date k-d trees, o generalizare a ABC pentru date multidimensionale. Ideea din spate este extrem de simpla, si anume:
LOAD <filename>
Programul va incepe mereu cu operatia de load. Pentru simplitate, nu se vor mai adauga puncte dupa aceasta prima incarcare a datelor. Coordonatele punctelor sunt numere intregi.
Fisierul o sa aibe datele in forma:
n k a_11 a_12 a_13 ... a_1k a_21 a_22 a_23 ... a_2k ... a_n1 a_n2 a_n3 ... a_nk Unde pe fiecare linie avem cate un vector cu k intrari (pe acesta il vom numi in continuare punct)
-10000 ⇐ a_ij ⇐ 10000
Se vor incarca punctele din fisier in structura de date.
Se cere gasirea si afisarea celui mai apropiat punct de punctul dat. Vom folosi distanta euclidiana intre puncte:
$ d(p, q) = \sqrt{\sum_{i=1}^k (q_i - p_i)^2} $
unde:
$ p, q $ = doua puncte in spatiul euclidian k-space
$ k $ = k-space
$ p_i, q_i $ = coordonatele unui punct
NN <b_1> <b_2> ... <b_k>
Formal, dorim punctul ce minimizeaza distanta intre el insusi si b.
Pentru simplitate, toate coordonatele vor fi urmate de un spatiu, chiar si la final de linie.
c_1 c_2 c_3 ... c_k \n
RS <start_1> <end_1> <start_2> <end_2> ... <start_k> <end_k>
Se cere gasirea si afisarea punctelor ale caror coordonate se incadreaza in intervalele date.
Pentru simplitate, toate coordonatele vor fi urmate de un spatiu, chiar si la final de linie.
m: c_11 c_12 c_13 ... c_1k \n c_21 c_22 c_23 ... c_2k \n ... c_m1 c_m2 c_m3 ... c_mk \n Unde m = numarul de puncte gasite pe urmatoarele m linii avem punctele gasite
Similar cu NN, aceste puncte vor fi afisate sortate (criteriul este acelasi).
EXIT
Eliberam memoria si terminam programul.
Fiecare test este verificat cu valgrind. Dacă un test are memory leaks, nu va fi punctat.
Q: Putem implementa tema în C++?
A: Nu.
Q: Putem folosi variabile globale?
A: Nu.
Changelog checker:
v0.2.1:
v0.2.0:
Pentru a updata checkerul rulati comanda cargo install checker-tema-3-sd
Scheletul poate fi gasit aici
Pentru a instala checkerul, rulati comanda ./install.sh
Recomand sa setati numarul de core-uri de la masina virtuala la macar 4-6 pentru o perfomanta mai buna.
Temele vor fi trimise pe vmchecker. Atenție! Temele trebuie trimise în sectiunea Structuri de Date (CA).
Arhiva trebuie să conțină:
mk
si kNN