This is an old revision of the document!
Tema 0 HashTable
Termen de predare:
miercuri, 6 martie 2013, ora 23:59
Termen de predare hard: miercuri, 20 martie 2013, ora 23:59
Scopul temei
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
:
Executabilul rezultat din operația de compilare și linking se va numi tema0
.
Punctare
#ifdef LINUX
[...]
#ifdef WIN32
[...]
Nota mai poate fi modificată prin depunctări suplimentare:
Materiale ajutătoare
FAQ
Lista de discuţii