Table of Contents

Tema 3

Responsabili:

Data publicării: 10.05.2023
Deadline: 31.05.2023 ora 23:55

Actualizări

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

Task 1 - Magic Keyboard (50p)

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.

Operatii

Se garanteaza corectitudinea formatului operatiilor.

Insert

INSERT <cuvant>

Retinem cuvantul sau incrementam frenventa de aparitie in cadrul structurii de date.

Load

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

REMOVE <cuvant>

Eliminam cuvantul (si eliberam memoria folosita de acesta) din structura de date (totusi acesta poate fi readaugat in viitor).

Atentie! Cuvantul poate sa nu existe, caz in care nu se va intampla nimic

Autocorrect

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

  • Daca nu exista niciun cuvant de printat, se va afisa: “No words found”
  • Daca <cuvant> exista printre cuvinte, il vom afisa si pe acela

Autocomplete

AUTOCOMPLETE <prefix> <nr-criteriu>

Pentru acest task, aveti de afisat 3 cuvinte:

  1. Cel mai mic lexicografic cuvant cu prefixul dat
  2. Cel mai scurt cuvant cu prefixul dat
  3. Cel mai frecvent folosit cuvant cu prefixul dat (in caz de egalitate, cel mai mic lexicografic)

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

Atentie! Cuvintele se pot repeta

  • Daca nu exista cuvantul, se va afisa: “No words found”
  • In cazul apelului cu parametrul 0, se poate afisa “No words found” de mai multe ori

Exit

EXIT

Eliberam memoria si terminam programul.

Task 2 - kNN (50p)

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:

 alt-text

Operatii

Load

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)

Precizare:

-10000 ⇐ a_ij ⇐ 10000

Se vor incarca punctele din fisier in structura de date.

NN - Nearest Neighbour

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.

Afisare

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

Atentie: In cazul existentei mai multor puncte situate la aceasi distanta (minima), se vor afisa toate, sortate crescator (prima oara dupa prima dimensiune; in caz de egalitate dupa a doua etc). Fiecare punct va fi afisat pe cate o linie.

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.

Afisare

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

EXIT

Eliberam memoria si terminam programul.

Referinte

k-d trees pe wikipedia
kNN algorithm

Punctaj

Fiecare test este verificat cu valgrind. Dacă un test are memory leaks, nu va fi punctat.

FAQ

Q: Putem implementa tema în C++?
A: Nu.

Q: Putem folosi variabile globale?
A: Nu.

Checker

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ă: