This is an old revision of the document!


Tema 0 HashTable

Termen de predare: joi, 01 martie 2012, ora 23:59

Termen de predare hard: sâmbătă, 10 martie 2012, ora 23:59

Scopul temei

  • Recapitularea lucrului cu funcţiile ANSI C:
    • lucrul cu fişiere
    • alocare dinamică de memorie
  • Folosirea pointerilor

Enunț

Să se implementeze în C o tabelă de dispersie (hashtable) ce va conţine cuvinte. Operaţiile ce trebuie suportate de această tabelă sunt următoarele:

  • add <cuvânt> adauga cuvântul la hashtable (nu se permit dubluri)
  • remove <cuvânt> şterge cuvântul din hashtable (nu e obligatoriu să existe cuvântul)
  • clear goleşte tabela
  • find <cuvânt> [<fişier_ieşire>] caută cuvântul în hashtable → scrie True sau False pe o linie nouă în fişierul specificat sau la consolă dacă acest parametru lipseşte
  • print_bucket <index_bucket> [<fişier_ieşire>] scrie cuvintele din bucketul respectiv, pe o singură linie şi separate de spaţiu în fişierul specificat sau la consolă dacă acest parametru lipseşte, index_bucket este valid
  • print [<fişier_ieşire>] printeaza toate bucket-urile pe linii diferite, începând cu bucketul 0, în fişierul specificat sau la consolă dacă acest parametru lipseşte
  • resize double dublează dimensiunea hash-ului (bucket-urile vor fi parcuse în ordine şi cuvintele sunt redistribuite)
  • resize halve înjumătățește dimensiunea hash-ului (bucket-urile vor fi parcuse în ordine şi cuvintele sunt redistribuite, memoria în surplus va fi dealocată)

Aceste comenzi se vor regăsi una per linie.

Programul va primi o serie de parametri:

  • Primul parametru este lungimea iniţiala a hashului
  • Următorii parametri sunt opționali și reprezintă o listă de fişiere de intrare din care se face citirea. Dacă aceştia lipsesc citirea se face de la STDIN. Atenție, în cazul în care sunt specificate mai multe fișiere de intrare, toate operațiile se aplică aceluiași hash.

Exemplu:

 ./tema0 256 hash1.in hash2.in
 ./tema0 100 < hash1.in
 
hash1.in:
add tema
add hash
print hash.out
find tema hash.out
remove tema
find tema hash.out
print hash.out
resize double
print
print_bucket 185 hash2.out

Hashtable-ul implementat va conține SIZE bucketuri. Fiecare bucket va conține cuvintele în ordinea în care ele au fost introduse. Pentru operația de resize bucketurile vor fi parcurse în ordine și redistribuite. Cuvintele din bucket vor fi parcurse începând cu cel mai vechi și terminand cu cel mai recent.

Precizări generale

  • Valorile introduse în hashtable sunt cuvinte [A-Za-z].
  • Un tablou nu poate conține duplicate.
  • Nu există limitări pentru lungimea unui bucket sau a unui cuvânt.
  • Inserarea într-un tablou (bucket) se face la finalul acestuia.
  • Funcția de hash ce trebuie folosită (în întreaga temă) este definită in hash.c. Nu poate fi folosita altă funcţie.
  • Programul trebuie să execute comenzile în ordine, așa cum au fost primite citite din fişier(e).
  • În fişiere se va scrie în modul append.
  • Dacă dimensiunea hash-ului este impară (2k+1), după înjumătaţire dimensiunea lui va fi k.
  • Lungimea hash-ului și a unui cuvânt vor fi reprezentate pe un număr pe 32 de biți (fără semn) .
  • Şirul vid nu este valid.
  • Dimensiunea hash-ului va fi întotdeauna pozitivă.
  • Executabilul generat va purta numele tema0 pe Linux și tema0.exe pe Windows.
  • Dimensiunea maximă a unei comenzi (operația și cuvântul asociat) este de 20000 de caractere.
  • Bufferul folosit pentru citirea comenzilor poate fi declarat cu dimensiune statică.
  • Comportamentul dorit la resize este unul echivalent cu urmatorul: se creeaza un nou hash, se itereaza prin bucketurile din vechiul hash si se adauga in noul hash.

Precizări VMChecker

Arhiva temei va fi încărcată de doua ori pe vmchecker (Linux și Windows). Arhiva trimisă trebuie să fie aceeași pe ambele platforme (se vor compara cele două trimise). Arhivele trebuie să conţina sursele temei, README și două fișiere Makefile care conțin target-urile build și clean:

  • Fișierul Makefile de Linux se va numi GNUmakefile.
    • ATENȚIE: GNUmakefile (cu m mic).
  • Fișierul Makefile de Windows se va numi Makefile.

Executabilul rezultat din operația de compilare și linking se va numi tema0.

Punctare

  • Tema va fi punctată cu maxim 0.5 puncte dacă aceasta compilează pe o platformă şi cu 1 punct dacă ea compilează pe ambele platforme, fără a folosi directive de preprocesare:
#ifdef LINUX
[...]
#ifdef WIN32
[...]
  • Atenţie Depunctarea pentru această temă este de 1 punct/zi. Depunctarea nu se opreşte la nota 7

Nota mai poate fi modificată prin depunctări suplimentare:

Materiale ajutătoare

FAQ

  • Q: Tema 0 se poate face în C++?
    • A: Nu.
  • Q: “Valorile introduse în hastable sunt cuvinte [A-Za-z]” - trebuie verificate cuvintele la introducere?
    • A: Nu.
  • Q: Se pot folosi directive de preprocesare de tipul #define?
    • A: Da.
  • Q: Pentru citire/scriere din fișier/consolă putem folosi freopen?
    • A: Da, e ok. Puteți folosi orice funcție din categoria fopen, fread, fwrite, fclose.

Lista de discuţii

Pentru întrebări sau nelămuriri legate de temă puteți căuta, consulta sau trimite un mail pe lista de discuții (trebuie să fiți înregistrați).

so/teme/tema-0.1361101997.txt.gz · Last modified: 2013/02/17 13:53 by sergiu.costea
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