Diferență între revizuiri ale paginii „SDA Lucrarea 5”
Linia 54: | Linia 54: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Pentru a implementa o funcție hash pentru variabilele de tip <code>struct Person</code>, avem întâi nevoie să definim operația de egalitate. O persoană își poate schimba numele, buletinul și adresa, și pot exista mai multe persoane cu aceeași dată de naștere, dar ceea ce identifică clar o persoană este codul numeric personal (CNP). Deci vom defini funcția <code> | + | Pentru a implementa o funcție hash pentru variabilele de tip <code>struct Person</code>, avem întâi nevoie să definim operația de egalitate. O persoană își poate schimba numele, buletinul și adresa, și pot exista mai multe persoane cu aceeași dată de naștere, dar ceea ce identifică clar o persoană este codul numeric personal (CNP). Deci vom defini funcția <code>equals</code> să întoarcă 1 dacă cnp-urile celor două argumente de tip <code>struct Person</code> sunt identice: |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> |
Versiunea de la data 20 aprilie 2016 19:13
În acest laborator se vor implementa mulțimi cu funcții hash și arbori binari.
Mulțimea
Mulțimea este o structură de date abstractă care stochează o colecție de elemente unice în care ordinea nu contează.
Mulțimea are următoarele proprietăți:
- Datele sunt plasate într-o ordine oarecare stabilită arbitrar de structură.
- Numărul de elemente ce poate fi stocat de structură este nelimitat.
- Elementele stocate în mulțime sunt de același fel.
- Mulțimea poate conține doar elemente unice, în baza unei funcții definite de egalitate. Altfel spus, dacă două elemente sunt egale din punctul de vedere al mulțimii, ele nu pot fi ambele conținute de mulțime.
Mulțimea suportă următoarele operații de bază:
- Interogarea numărului de elemente din mulțime.
- Verificarea dacă mulțimea este goală.
- Adăugarea unui element în mulțime (put).
- Verificarea dacă un element există în mulțime (contains).
- Eliminarea unui element din mulțime (remove).
Pentru a verifica egalitatea a două elemente vom defini o funcție equals
care va întoarce 1 dacă cele două argumente sunt egale și 0 dacă nu. Această funcție trebuie să existe pentru orice implementare de mulțime, atunci când elementele nu sunt valori ce pot fi comparate cu operatorul implicit ==:
/**
* Functia verifica daca valorile value1 si value2 sunt egale.
* @param value1 prima valoare de comparat.
* @param value2 a doua valoare de comparat.
* @return 1 daca cele doua valori sunt egale si 0 in rest.
*/
char equals(T value1, T value2);
Implementarea de mulțimi cu funcții hash
O funcție hash este o funcție care ia ca argument un șir de bytes de orice dimensiune și întoarce un șir de bytes de dimensiune fixă ce poartă numele de valoare de hash, cod hash sau pur și simplu hash.
Definiția unei funcții hash este strâns legată de definiția funcției equals
astfel încât dacă două elemente e1 și e2 sunt considerate egale (equals(e1, e1) == 1
), atunci obligatoriu hash(e1) == hash(e2)
.
Tipul de date și funcțiile de bază
În continuare vom prezenta un exemplu de mulțime pentru elemente de tip "persoană" implementată cu funcții hash. În primul rând vom defini structura ce memorează datele legate de o persoană:
struct Person {
char firstName[30];
char lastName[30];
char idNumber[9]; // seria si numarul de buletin
char address[255];
char birthday[11];
char cnp[14];
};
Pentru a implementa o funcție hash pentru variabilele de tip struct Person
, avem întâi nevoie să definim operația de egalitate. O persoană își poate schimba numele, buletinul și adresa, și pot exista mai multe persoane cu aceeași dată de naștere, dar ceea ce identifică clar o persoană este codul numeric personal (CNP). Deci vom defini funcția equals
să întoarcă 1 dacă cnp-urile celor două argumente de tip struct Person
sunt identice:
/**
* Functia intoarce 1 daca CNP-urile celor doua persoane sunt egale.
* @param person1 prima persoana de comparat.
* @param person2 a doua persoana de comparat.
* @return 1 daca CNP-urile celor doua persoane sunt identice.
*/
char equals(struct Person person1, struct Person person2);
Mai departe definim funcția hash pentru o Persoană.
Pentru a putea implementa o mulțime cu funcții hash trebuie ca hash-ul maxim să fie o valoare rezonabilă pentru a putea aloca memorie cu dimensiunea valorii respective.
Din motivul de mai sus, și pentru a micșora posibilitatea unei coliziuni de hash ce va micșora performanța structurii, ieșirea funcției hash va fi un număr între 0 și 999999 obținut din ultimele 6 cifre ale CNP-ului convertite din text în număr (pentru conversie puteți folosi funcția atoi).