multi diction orordonat

5

Click here to load reader

Upload: iosif-diana-cristina

Post on 12-Feb-2015

59 views

Category:

Documents


6 download

DESCRIPTION

programare

TRANSCRIPT

Page 1: Multi Diction ORordonat

Multidicționar ordonat (MDO)

Multidicționar = o cheie are mai multe valori asociate (o listă de valori asociate)

Multidicționar ordonat = cheile sunt într-o anumită relație de ordine R și sunt memorate în ordine

Problemă: Să se implementeze TAD Multidicționar ordonat (MDO) – reprezentare înlănțuită cu

alocare dinamică.

Operații:

creeaza (mdo, R)

pre: R – relatie pe multimea cheilor

post: mdoMDOmdo ,

distruge(mdo)

pre: MDOmdo

post:mdo a fost “distrusa” (spatiul alocat a fost eliberat)

adauga(mdo, c, v)

pre: TValoarevTCheiecMDOmdo ,,

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

sterge(mdo, c, v)

pre: TValoarevTCheiecMDOmdo ,,

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

cauta(mdo, c, l)

pre: TCheiecMDOmdo ,

post:

altfellsifals

mdoincheieestecdaca

ccuasociatevalorilorlistaestelsitrue

Ll

,

,

,

iterator(mdo, i)

pre: MDOmdo

post: Ii , i este iterator pe mdo

Alte operatii posibile:

multimeaCheilor(mdo, m)

pre: MDOmdo

post: ,Mm m este multimea tuturor cheilor din mdo

Page 2: Multi Diction ORordonat

multimeaValorilor(mdo, m)

pre: MDOmdo

post: ,Mm m este multimea tuturor valorilor din mdo

Reprezentare:

MDO:

prim: ↑NodT

R: relație

NodT:

urm: ↑NodT

e: Telement

TElement:

c: TCheie

l : TLista

Iterator MDO:

mdo: MDO

curent: ↑NodT

itL: IteratorList

Operații iterator:

Subalgoritm creeaza (it, mdo): { Θ (1) }

it.mdo ←mdo

it.curent ← [it.mdo].prim

Daca it.curent ≠ NIL atunci

iterator ([it.mdo.prim].e.l, it.itL)

SfDaca

SfSubalgoritm

Functia valid(it): { Θ (1) }

valid ← it.curent ≠ NIL

SfSubalgoritm

Subalgoritm element(it, e): {e = <c,v>} { Θ (1) }

e.c ← [it.curent].e.c

element (it.itL, e.v)

SfSubalgoritm

Subalgoritm urmator (it): { Θ (1) }

urmator(it.itL)

Daca ¬valid(it.itL) atunci

it.curent ← [it.curent].urm

Page 3: Multi Diction ORordonat

Daca it.curent ≠ NIL atunci

iterator ([it.curent].e.l, it.itL)

SfDaca

SfDaca

SfSubalgoritm

Operatii multidictionar ordonat:

La complexitati:

- n – nr de chei distinct

- mdo – nr total de elemente

Subalgoritm creeaza(mdo, R): { Θ (1) }

mdo.R ← R

mdo.prim ←NIL

SfSubalgoritm

Subalgoritm distruge(mdo): {Θ (mdo)}

CatTimp mdo.prim ≠ NIL executa

p ←mdo.prim

distruge ([p].e.l)

mdo.prim ← [mdo.prim].urm

dealoca(p)

SfCatTimp

SfSubalgoritm

Subalgoritm cauta (mdo, c, l): {Θ (n)}

p ← mdo.prim

gasit ← fals

CatTimp p ≠NIL si ¬ gasit executa

Daca [p].e.c = c atunci

gasit ← adevarat

altfel

p ← [p].urm

SfDaca

SfCatTimp

Daca gasit atunci

l ← [p].e.l

altfel

creeaza (l)

SfDaca

SfSubalgoritm

Functia cautNod (mdo, c): {Θ(n)}

p ← mdo.prim

gasit ← fals

Page 4: Multi Diction ORordonat

CatTimp p ≠NIL si ¬ gasit executa

Daca [p].e.c = c atunci

gasit ← adevarat

altfel

p ← [p].urm

SfDaca

SfCatTimp

Daca gasit atunci

cautNod ← p

altfel

cautNod ← NIL

SfDaca

SfFunctia

Subalgoritm adauga (mdo, c, v): {Θ(n)}

p ← cautNod (mdo, c)

Daca p = NIL atunci

adaugaCheieNoua (mdo, c, v)

altfel

adaugaSfarsit([p].e.l, v)

SfDaca

SfSubalgoritm

Subalgoritm adaugaCheieNoua(mdo, c,v): {Θ(n)}

Daca mdo.prim = NIL atunci

aloca (mdo.prim)

[mdo.prim].e.c ←c

creeaza ([mdo.prim].e.l)

adaugaSfarsit([mdo.prim].e.l, v)

altfel

aloca (q)

[q].e.c ← c

creeaza ([q].e.l)

adaugaSfarsit([q].e.l, v)

p ← mdo.prim

Daca mdo.R(c, [p].e.c) atunci {inseram inainte de primul nod}

[q].urm ← p

mdo.prim ← q

altfel

CatTimp ([p].urm ≠ NIL si ¬mdo.R(c, [[p].urm].e.c)) executa

p ← [p].urm

SfCatTimp

{am gasit pozitia (nodul p) dupa care inseram}

[q].urm ← [p].urm

[p].urm ← q

SfDaca

Page 5: Multi Diction ORordonat

SfDaca

SfSubalgoritm

Subalgoritm sterge (mdo, c, v): {Θ(n)}

p ← cautNod (mdo, c)

Daca p ≠ NIL atunci

pos ← pozitie ([p].e.l, v)

Daca pos ≠ ┴ atunci

sterge ([p].e.l, pos, e)

SfDaca

Daca vida ([p].e.l) atunci

stergCheie (mdo, c)

SfDaca

SfDaca

SfSubalgoritm

Subalgoritm stergCheie (mdo, c): {Θ(n)}

Daca [mdo.prim].e.c = c atunci

p ←mdo.prim

mdo.prim ← [mdo.prim].urm

dealoca (p)

altfel

p ←mdo.prim

CatTimp [p].urm ≠NIL si [[p].urm].e.c ≠ c executa

p ←[p].urm

SfCatTimp

q← [p].urm

[p].urm ← [q].urm

dealoca (q)

SfDaca

SfSubalgoritm