Sunteți pe pagina 1din 14

PROIECT STRUCTURI DE DATE I

ALGORITMI

TAD MultiDicionar ordonatimplementare folosind o tabel de


dispersie cu rezolvarea
coliziunilor prin liste
independente

Realizator:
Mrcu Lucian Dan
FACULTATEA DE MATEMATIC I INFORMATIC
secia:Informatic romn
an I,grupa 211

Profesor ndrumtor:
Czibula Gabriela

1.Specificarea i interfaa Tipului


Abstract de Date
Elementele din MultiDicionar sunt perechi de forma (cheie, valoare).

Multidictionar = {mdo | mdo multidictionar cu elemente de


tip TElement}

TElement = cheie x valoare;


R=Relaie de ordine
Operaii:

creeaza (mdo, R)

pre: R relatie pe multimea cheilor


post: mdoMDO, mdo

distruge(mdo)

pre: mdoMDO
post:spatiul alocat pentru mdo a fost eliberat

adauga(mdo, c, v)

pre: mdoMDO, c TCheie, v TValoare


post: perechea <c,v> a fost adaugata in mdo

sterge(mdo, c, v)

pre: mdoMDO, c TCheie, vTValoare


post: perechea <c,v> a fost stearsa din mdo

cauta(mdo, c, l)

pre: mdoMDO, c TCheie,l L

post* returneaza l, l fiind lista valorilor asociate cheii c existe in mdo


*returneaza multimea vida daca c nu este cheie in mdo

functieDispersie(mdo, c)
pre: mdoMDO

SAU

c TCheie
post: returneaza c%M
actualizeazaPrimLiber()
pre: post: actualizeazaPrimLiber<-prima locatie libera;

iterator(mdo,i)

pre: mdoMDO

post: i I , i este iterator pe mdo

multimeaCheilor(mdo, m)
pre: mdoMDO

post: m M , m este multimea tuturor cheilor din mdo

IteratorMultidictionar = {i | i iterator pe Mdo


cu elemente de tip TElement}

creeaza(i, mdo)
pre: mdo: MultiDictionarOrdonat;
post: s-a creat iteratorul i vid, iar curent refer primul element din mdo;

getCurent(i, e)
pre: i: IteratorMultidictionar
post: e:TElement este elementul curent din iteratie;
pozitie_vida(i)
pre: i: IteratorMultidictionar
post: valid=true daca curent refera o pozitie valida din mdo;
valid=false in caz contrar;
urmator(i)
pre: i: IteratorMultidictionar;
post: curent refera urmatorul element din colectie;
returneaza_cheie(i)
pre: i: IteratorMultidictionar;
post: returneaza cheia elementului curent din iteratie;
returneaza_valoare(i)
pre: i: IteratorMultidictionar;
post: returneaza valoarea elementului curent din iteratie;

2.Implementare TAD
subalgoritm adauga(TElement x)
daca prim=NIL atunci

aloca(nou);
prim<-ultim;
ultim<-nou;
dim<-dim+1;
altfel
daca(compara(x,[prim].elem)) atunci
aloca(nod);
aloca(nou);
[p].prec<-nou;
prim<-nou;
dim<-dim+1;
daca(compara(x, [prim].elem))atunci
aloca(p);
p<-prim;
cat timp([p].urm!=NULLsi compara(x,[[prim].urm]elem)) executa
p=[p].urm;
sf cat_timp
daca([p].urm=NIL){
aloca(nou);
[p].urm<-nou;
ultim<-nou;
dim<-dim+1;
altfel
aloca(nou)
[[p].urm].prec<-nou;
[p].urm<-nou;
dim<-dim+1;
sf_daca
sf_daca
sf_daca
sf_subalgorimt

Complexitate adaugare:
CazFavorabil:(1);
CazMediu: (n);
CazDefavorabil: (n);

Subalgoritm cauta(TElement x)
Aloca(q);
q<-prim;
cat timp(q!=NIL && [x]operator=([q].elem)=false) executa
q=[q].urm;
sf_cat_timp
daca(q=NIL) atunci
return NIL;
return [q].elem;
sf_subalgoritm

subalgoritm stergere(TElement x)
aloca(q);
q<-prim;
cat timp(q!=NIL && [x].operator=([q].elem)=false) executa
q<-[q].urm;
sf_cat_timp
daca(q=NIL)atunci
return NIL;
altfel
daca([q].prec=NIL && [q].urm=NIL)atunci
e<-[q].elem;
dealoca(prim);
prim<-NIL;
ultim<-NIL;
dim<-dim-1;
return e;
altfel
daca([q].prec!=NIL && [q].urm=NIL)atunci
e<-[q].elem;
q<-[ultim].prec;
dealoca(ultim);
ultim<-q;
[ultim].urm=NIL;
Dim<-dim-1;
return e;
altfel
daca([q].prec=NIL && [q].urm!=NIL)atunci
e=[q].elem;
q =[prim].urm;
dealoca(prim);
prim<-q;

[prim].prec=NIL;
Dim<-dim-1;
return e;
altfel
e=[q].elem;
[[q].prec].urm=[q].urm;
[[q].urm].prec=[q].prec;
dim<-dim-1;
return e;
sf_daca
sf_daca
sf_algoritm
functie size()
return dim;
functie vida()
if(prim=NIL)
return true;
return false;
sfarsit_functie

3.Implementare iterator
Subalgoritm creeaza(it, mdo)
it.mdo <- mdo
creeaza(l, mdo.R) {=> l : ListaOrdonata & vida(l)}
Pentru i <- 0,m-1
l <- interclasare(l, mdo.lo[i], mdo.R)
sf_pentru
iterator(l, it.itL)
sf_subalgoritm
Subalg urmator(it)
urmator(it.itL)
sf_subalgoritm

Functia interclasare(l1,l2,R)
creeaza(l,R) {l : ListaOrdonata}
iterator(l1,it1)
iterator(l2,it2)
Cat timp valid(it1) si valid(it2) exec
element(it1,e1)
element(it2,e2)
Daca e1 R e2 atunci
adauga(l,e1)
urmator(it1)
Altfel
adauga(l,e2)
urmator(it2)
sf_daca
sf_cattimp
Cat timp valid(it1) exec
element(it1,e1)
adauga(l,e1)
urmator(it1)
sf_cattimp
Cat timp valid(it2) exec
element(it2,e2)
adauga(l,e2)
urmator(it2)
sf_cattimp
interclasare <- l
sf_functie

4.Enunul problemei
S se creeze o aplicaie folosit pentru gestionarea notelor studenilor
din acelasi an al unei facultati. Aplicatia va retine numarul matricol al fiecarui
student(un numar natural) precum si nota/notele obtinuta/e de acesta la
examenele din timpul sesiunii. Aplicatia va permite adaugare unui nou

student, adaugarea unei note asociate unui student existent, stergerea unei
note, afisarea studentilor si a notelor.

5.Justificarea TAD-ului ales


Aplicatia va folosi un multidictionar ordonat reprezentat pe tabela de
dispersie/rezolvarea coliziunilor prin liste independente. Numarul matricol al
unui student este considerat cheie, iar nota obtinuta apare ca o valoare
asociata cheii, asadar unei chei ii pot fi asociate mai multe valori. Astfel, se
justifica alegerea unei structuri de multidictionar. Deoarece, numerele
matricole ale studentilor respecta o relatie de ordine data de numele acestora,
consider ca Multidictionarul Ordonat reprezinta cea mai buna alegere pentru
crearea acestei aplicaii.

6. Diagrama UML a aplicaiei


MAIN

USER INTERFACE

OrderedMultiMap

ListaOrdonata

ELEMENT

NOD

IntElement

MultiMap

Map

Element

Element

HashElemen
t

7. Scenariu de rulare
Utilizator

Program

Descriere

*optiune 1
pereche(11,10)
*optiune 1
pereche(12,7)
*optiune 1
pereche(11,9)
*optiune 1
pereche(13,6)
*optiune 2

*adauga (11,10)

Adauga o nota.

*adauga (12,7)

Adauga o nota.

*adauga (11,9)

Adauga o nota.

*adauga (13,6)

Adauga o nota.

Note stocate:
(13,6)
(12,7)
(11,10)
(11,9)

Afiseaza notele si cheile


ordonate dupa cheie.

*optiune 3 pereche
(11,9)

Note stocate:
(13,6)
(12,7)
(11,10)

Sterge perechea data


din mulridictionar.

*optiune 3 pereche
(11,9)

-----

*optiune 2

Note stocate:
(13,6)
(12,7)
(11,10)
--

Perechea data pentru


stergere nu a fost gasita
in muldictionar.
Afiseaza notele si cheile
ordonate dupa cheie.

*optiune 4

EXIT

S-ar putea să vă placă și