PROGRAMARE S˘I STRUCTURI DE DATEmarianzsu/Postuniv/Curs/Curs04.pdf · 2020-01-13 · PROGRAMARE...

Post on 23-Apr-2020

11 views 1 download

Transcript of PROGRAMARE S˘I STRUCTURI DE DATEmarianzsu/Postuniv/Curs/Curs04.pdf · 2020-01-13 · PROGRAMARE...

PROGRAMARE SI STRUCTURI DE DATECURS 4

Lect. dr. Onet - Marian Zsuzsanna

Facultatea de Matematica si Informatica UBBın colaborare cu NTT Data

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Cuprins

Vector dinamic

Ansamblu binar

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array

Array-ul (vectorul) este o structura folosita foarte des candavem de stocat mai multe elemente de acelasi tip.

De exemplu:

elemente: Integer[10]

Sa vedem care sunt avantajele si dezavantajele array-ului.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

Care credeti ca este principalul avantaj al unui array?

Cand se defineste un array, trebuie sa spunem ce tip vor aveaelementele arrayului si cate elemente vrem sa aiba arrayul.

Pe baza acestor informatii se rezerva spatiu de memorarepentru array. De exemplu, daca limbajul de programarefoloseste 4 bytes pentru a stoca un numar ıntreg, si noidefinim un array de numere ıntregi de 10 elemente, atunci4 ∗ 10 = 40 de bytes consecutivi vor fi rezervati pentru arrayulnostru.

Valoarea arrayului (adica ceea ce este retinut intern) este defapt adresa de memorie unde ıncepe arrayul.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

Care credeti ca este principalul avantaj al unui array?

Cand se defineste un array, trebuie sa spunem ce tip vor aveaelementele arrayului si cate elemente vrem sa aiba arrayul.

Pe baza acestor informatii se rezerva spatiu de memorarepentru array. De exemplu, daca limbajul de programarefoloseste 4 bytes pentru a stoca un numar ıntreg, si noidefinim un array de numere ıntregi de 10 elemente, atunci4 ∗ 10 = 40 de bytes consecutivi vor fi rezervati pentru arrayulnostru.

Valoarea arrayului (adica ceea ce este retinut intern) este defapt adresa de memorie unde ıncepe arrayul.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

Avand aceste date (zona de memorie unde ıncepe array-ul sidimensiunea unui element), adresa de memorie pentru fiecareelement din array poate fi calculata foarte usor.

La ce adresa se gaseste elementul de pe pozitia 5?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

Avand aceste date (zona de memorie unde ıncepe array-ul sidimensiunea unui element), adresa de memorie pentru fiecareelement din array poate fi calculata foarte usor.

La ce adresa se gaseste elementul de pe pozitia 5?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

La ce adresa se gaseste elementul de pe pozitia 5?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

La ce adresa se gaseste elementul de pe pozitia 5?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Avantaje

Practic, cand noi scriem vector[i], acest lucru se transforma ınceva de genul:acceseaza elementul care se afla pe pozitiaadresa vector + i * marimea unui element

A calcula adresa unui element (folosind formula de mai sus)necesita timp constant (o singura operatie), a accesa ce seafla la o anumita adresa (acest lucru se ıntampla implicit candfolosim o variabila) tot timp constant necesita.

Avantajul principal al unui array este faptul ca oricare elementpoate fi accesat ın timp constant (Θ(1)).

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Dezavantaje

Care credeti ca este dezavantajul principal al unui array?

Cand vrem sa definim un array trebuie sa specificam neaparatcate elemente va avea array-ul. Odata ce am definit un arrayde n elemente, ulterior nu ne putem razgandi, ca de fapt vrem2 ∗ n. Daca nu stim exact cate elemente va avea array-ul,trebuie sa gasim o limita superioara, pentru ca odata definit,array-ul nu poate fi facut mai mare.

Pe de alta parte, nici sa ocup mult spatiu degeaba, pe motivca sa fim siguri ca e suficient de mare nu e ın regula.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Dezavantaje

Care credeti ca este dezavantajul principal al unui array?

Cand vrem sa definim un array trebuie sa specificam neaparatcate elemente va avea array-ul. Odata ce am definit un arrayde n elemente, ulterior nu ne putem razgandi, ca de fapt vrem2 ∗ n. Daca nu stim exact cate elemente va avea array-ul,trebuie sa gasim o limita superioara, pentru ca odata definit,array-ul nu poate fi facut mai mare.

Pe de alta parte, nici sa ocup mult spatiu degeaba, pe motivca sa fim siguri ca e suficient de mare nu e ın regula.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Dezavantaje

Care credeti ca este dezavantajul principal al unui array?

Cand vrem sa definim un array trebuie sa specificam neaparatcate elemente va avea array-ul. Odata ce am definit un arrayde n elemente, ulterior nu ne putem razgandi, ca de fapt vrem2 ∗ n. Daca nu stim exact cate elemente va avea array-ul,trebuie sa gasim o limita superioara, pentru ca odata definit,array-ul nu poate fi facut mai mare.

Pe de alta parte, nici sa ocup mult spatiu degeaba, pe motivca sa fim siguri ca e suficient de mare nu e ın regula.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Array-ul - Dezavantaje

Cand avem nevoie de un array, trebuie sa stabilim numarul deelemente (dimensiunea array-ului) cautand un echilibru ıntre aavea suficient spatiu sa memoram toate elementele de careavem nevoie, dar sa nici nu ocupam prea mult spatiu degeaba.Acest aspect este dezavantajul principal pentru un array.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vectorul dinamic

Solutia pentru a evita dezavantajul principal (macar partial)este sa folosim un vector dinamic.

Vectorul dinamic este un vector a carui dimensiune poate fimodificata.

Ideea de baza este simpla:

Definim un vector de n elemente.Daca la un moment dat vectorul este plin (toate pozitiile suntocupate), dar mai trebuie sa adaugam elemente, vom defini unalt vector, mai mare, si vom copia elementele din acest vectorın cel nou. Dupa ce am copiat elementele, vectorul nou devinevectorul nostru.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vectorul dinamic

Solutia pentru a evita dezavantajul principal (macar partial)este sa folosim un vector dinamic.

Vectorul dinamic este un vector a carui dimensiune poate fimodificata.

Ideea de baza este simpla:

Definim un vector de n elemente.Daca la un moment dat vectorul este plin (toate pozitiile suntocupate), dar mai trebuie sa adaugam elemente, vom defini unalt vector, mai mare, si vom copia elementele din acest vectorın cel nou. Dupa ce am copiat elementele, vectorul nou devinevectorul nostru.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vecotrl dinamic II

Pentru a reprezenta un vector dinamic avem nevoie de 3informatii:

numarul maxim de elemente care ıncap ın vector (capacitatea)numarul de elemente care sunt stocate ın vectorvectorul efectiv

Pentru ca avem nevoie de mai multe informatii, care tottimpul trebuie sa fie folosite ımpreuna, vom defini un tip noude date, pentru a reprezenta un vector dinamic:

VectorDinamic:cap: ıntreglen: ıntregelemente: TElem[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vecotrl dinamic II

Pentru a reprezenta un vector dinamic avem nevoie de 3informatii:

numarul maxim de elemente care ıncap ın vector (capacitatea)numarul de elemente care sunt stocate ın vectorvectorul efectiv

Pentru ca avem nevoie de mai multe informatii, care tottimpul trebuie sa fie folosite ımpreuna, vom defini un tip noude date, pentru a reprezenta un vector dinamic:

VectorDinamic:cap: ıntreglen: ıntregelemente: TElem[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector Dinamic III

Vectorul Dinamic este o structura de date, ıl vom folosi ca saimplementam diferite containere.

Orice container poate fi implementat folosind un vectordinamic ca structura de date.

Inainte de a vedea cum putem implementa containere folosindun vector dinamic, vom discuta despre cateva operatii pentruvector dinamic (la modul general).

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Creare vector dinamic

Cum creem un vector dinamic?

In general operatia de creare se ocupa cu initializareaatributelor. Un vector dinamic are 3 atribute: cap, len,elemente. Cu ce le initializam?

subalgorithm creeaza() is:this.len = 0this.cap = 10 //ar putea fi orice valoare pozitiva@ initializam this.elemente ca un vector de 10 elemente de tip TElem

end subalgorithm

cu @ notam instructiuni nestandard. Initializarea vectoruluidepinde de limbajul de programare (de exemplu ın Java arveni ceva de genul this.elemente = new TElem[10])

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Creare vector dinamic

Cum creem un vector dinamic?

In general operatia de creare se ocupa cu initializareaatributelor. Un vector dinamic are 3 atribute: cap, len,elemente. Cu ce le initializam?

subalgorithm creeaza() is:this.len = 0this.cap = 10 //ar putea fi orice valoare pozitiva@ initializam this.elemente ca un vector de 10 elemente de tip TElem

end subalgorithm

cu @ notam instructiuni nestandard. Initializarea vectoruluidepinde de limbajul de programare (de exemplu ın Java arveni ceva de genul this.elemente = new TElem[10])

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Creare vector dinamic

Cum creem un vector dinamic?

In general operatia de creare se ocupa cu initializareaatributelor. Un vector dinamic are 3 atribute: cap, len,elemente. Cu ce le initializam?

subalgorithm creeaza() is:this.len = 0this.cap = 10 //ar putea fi orice valoare pozitiva@ initializam this.elemente ca un vector de 10 elemente de tip TElem

end subalgorithm

cu @ notam instructiuni nestandard. Initializarea vectoruluidepinde de limbajul de programare (de exemplu ın Java arveni ceva de genul this.elemente = new TElem[10])

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - adaugare

Cum adaugam un element nou ıntr-un vector dinamic?

Unde ıl punem? (sa presupunem ca nu avem restrictiireferitoare la ordinea elementelor)

La ce trebuie sa fim atenti?

subalgorithm adauga(e:TElem) is:if this.len == this.cap then //vectorul e plin

this.cap = this.cap * 2 //dublam capacitatea@initializam vectNou ca un vector cu this.cap elemente de tip TElemfor i = 0; i < this.len; 1 execute //copiem elementele existente

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //this.elemente va retine adresa lui vectNou

end if//acum stim sigur ca avem loc ın vectorul elementethis.elemente[this.len] = ethis.len = this.len + 1

end subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - adaugare

Cum adaugam un element nou ıntr-un vector dinamic?

Unde ıl punem? (sa presupunem ca nu avem restrictiireferitoare la ordinea elementelor)

La ce trebuie sa fim atenti?

subalgorithm adauga(e:TElem) is:if this.len == this.cap then //vectorul e plin

this.cap = this.cap * 2 //dublam capacitatea@initializam vectNou ca un vector cu this.cap elemente de tip TElemfor i = 0; i < this.len; 1 execute //copiem elementele existente

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //this.elemente va retine adresa lui vectNou

end if//acum stim sigur ca avem loc ın vectorul elementethis.elemente[this.len] = ethis.len = this.len + 1

end subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - adaugare

Cat este complexitatea pentru operatia adauga?

Avem caz favorabil, cand exista spatiu liber ın vector, ın acestcaz complexitatea este Θ(1).

In caz defavorabil, trebuie sa realocam si sa copiem elementeleexistente, complexitatea este Θ(n).

Dar, cazul defavorabil se ıntampla rar (daca la redimensionareınmultim capacitatea existenta cu o valoare, de exemplu 2)deci complexitatea este Θ(1) amortizat

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - adaugare

Cat este complexitatea pentru operatia adauga?

Avem caz favorabil, cand exista spatiu liber ın vector, ın acestcaz complexitatea este Θ(1).

In caz defavorabil, trebuie sa realocam si sa copiem elementeleexistente, complexitatea este Θ(n).

Dar, cazul defavorabil se ıntampla rar (daca la redimensionareınmultim capacitatea existenta cu o valoare, de exemplu 2)deci complexitatea este Θ(1) amortizat

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - adaugare

Cat este complexitatea pentru operatia adauga?

Avem caz favorabil, cand exista spatiu liber ın vector, ın acestcaz complexitatea este Θ(1).

In caz defavorabil, trebuie sa realocam si sa copiem elementeleexistente, complexitatea este Θ(n).

Dar, cazul defavorabil se ıntampla rar (daca la redimensionareınmultim capacitatea existenta cu o valoare, de exemplu 2)deci complexitatea este Θ(1) amortizat

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - adaugare pe pozitie

Cum adaugam un elemente pe o anumita pozitie?

La ce trebuie sa fim atenti?

subalgorithm adaugaPozitie(e:TElem, poz:Integer) is://prima data verificam pozitiaif poz < 0 OR poz > this.len then

@eroare, pozitia nu e validaend ifif this.len == this.cap then //vectorul e plin

this.cap = this.cap * 2 //dublam capacitatea@initializam vectNou ca un vector cu this.cap elemente de tip TElemfor i = 0; i < this.len; 1 execute //copiem elementele existente

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //this.elemente va retine adresa lui vectNou

end if//continuare pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

//mutam elementele la dreapta, de la final pana la poz@eroare, pozitia nu e validathis.elemente[i] = this.elemente[i-1]

end forthis.elemente[poz] = ethis.len = this.len + 1

end subalgorithm

Complexitate:

O(n)

Caz favorabil: Θ(1) - adaugam la finalCaz defavorabil: Θ(n) - trebuie sa redimensionam (sauadaugam la ınceput)Caz mediu: Θ(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

//mutam elementele la dreapta, de la final pana la poz@eroare, pozitia nu e validathis.elemente[i] = this.elemente[i-1]

end forthis.elemente[poz] = ethis.len = this.len + 1

end subalgorithm

Complexitate: O(n)

Caz favorabil: Θ(1) - adaugam la finalCaz defavorabil: Θ(n) - trebuie sa redimensionam (sauadaugam la ınceput)Caz mediu: Θ(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - stergere

Cum stergem un element de pe o pozitie?La ce trebuie sa fim atenti?

pozitia sa fie validatrebuie sa redimensionam?

function stergePozitie(poz: Integer) is://prima data verificam pozitiaif poz < 0 OR poz ≥ this.len then

@eroare, pozitia nu e validaend ifelemSters = this.elemente[poz]for i = poz; i < this.len-1; 1 execute

this.elemente[i] = this.element[i+1]end forthis.len = this.len - 1return elemSters

end function

Complexitate: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - stergere

Cum stergem un element de pe o pozitie?La ce trebuie sa fim atenti?

pozitia sa fie validatrebuie sa redimensionam?

function stergePozitie(poz: Integer) is://prima data verificam pozitiaif poz < 0 OR poz ≥ this.len then

@eroare, pozitia nu e validaend ifelemSters = this.elemente[poz]for i = poz; i < this.len-1; 1 execute

this.elemente[i] = this.element[i+1]end forthis.len = this.len - 1return elemSters

end function

Complexitate:

O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Vector dinamic - stergere

Cum stergem un element de pe o pozitie?La ce trebuie sa fim atenti?

pozitia sa fie validatrebuie sa redimensionam?

function stergePozitie(poz: Integer) is://prima data verificam pozitiaif poz < 0 OR poz ≥ this.len then

@eroare, pozitia nu e validaend ifelemSters = this.elemente[poz]for i = poz; i < this.len-1; 1 execute

this.elemente[i] = this.element[i+1]end forthis.len = this.len - 1return elemSters

end function

Complexitate: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie pe vector dinamic

Care e specificul containerului Colectie?

Elementele nu au pozitiiPot exista duplicate

Reprezentarea colectiei (reprezentarea se refera laatribute/variabilele folosite pentru a reprezenta containerul).

Ce variabile ne trebuie pentru un vector dinamic?

Ne mai trebuie ceva extra (sau modificat) pentru partea deColectie?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie pe vector dinamic

Care e specificul containerului Colectie?

Elementele nu au pozitiiPot exista duplicate

Reprezentarea colectiei (reprezentarea se refera laatribute/variabilele folosite pentru a reprezenta containerul).

Ce variabile ne trebuie pentru un vector dinamic?

Ne mai trebuie ceva extra (sau modificat) pentru partea deColectie?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie pe vector dinamic - reprezentare

Colectie:elemente: TElem[]len: Integercap: Integer

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie pe vector dinamic - operatii

Ce operatii avea Colectia?

creeazaadaugastergecautadimensiuneiterator

Vom implementa pe rand fiecare operatie.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie pe vector dinamic - operatii

Ce operatii avea Colectia?

creeazaadaugastergecautadimensiuneiterator

Vom implementa pe rand fiecare operatie.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - creeaza

Ce trebuie sa facem pt a creea o Colectie?

subalgorithm creeaza() is:this.len = 0this.cap = 10@initializam this.elemente, vector cu 10 elemente de tip TElem

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - creeaza

Ce trebuie sa facem pt a creea o Colectie?

subalgorithm creeaza() is:this.len = 0this.cap = 10@initializam this.elemente, vector cu 10 elemente de tip TElem

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - creeaza

Ce trebuie sa facem pt a creea o Colectie?

subalgorithm creeaza() is:this.len = 0this.cap = 10@initializam this.elemente, vector cu 10 elemente de tip TElem

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - adauga

Ce trebuie sa facem la adaugare?

Cum se adauga ın general ıntr-un vector dinamic?

Unde se adauga ın general ıntr-un vector dinamic?

Cum combinam aceste lucruri cu specificul containeruluiColectie?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

subalgorithm adauga(e: TElem) is:if this.len == this.cap then //colectia e plina

this.cap = this.cap * 2 //dublam capacitatea@initializam vectNou ca un vector cu this.cap elemente de tip TElemfor i = 0; i < this.len; 1 execute //copiem elementele existente

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //this.elemente va retine adresa lui vectNou

end if//acum stim sigur ca avem loc ın vectorul elementethis.elemente[this.len] = ethis.len = this.len + 1

end subalgorithm

Complexitate:

Θ(1)amortizat

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

subalgorithm adauga(e: TElem) is:if this.len == this.cap then //colectia e plina

this.cap = this.cap * 2 //dublam capacitatea@initializam vectNou ca un vector cu this.cap elemente de tip TElemfor i = 0; i < this.len; 1 execute //copiem elementele existente

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //this.elemente va retine adresa lui vectNou

end if//acum stim sigur ca avem loc ın vectorul elementethis.elemente[this.len] = ethis.len = this.len + 1

end subalgorithm

Complexitate: Θ(1)amortizat

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectia - sterge

Ce trebuie sa facem la stergere?

Cum stergem ın general dintr-un vector dinamic?

Cum combinam stergerea cu specificul containerului Colecctie?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

function sterge(e: TElem) is:found: Booleanfound = falseindex: Integerindex = 0while found == false AND index < this.len execute

if this.elemente[index] == e thenfound = true

elseindex = index + 1

end ifend whileif found then

this.elemente[index] = this.elemente[this.len-1]this.len = this.len - 1

end ifreturn found

end function

Complexitate:

O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

function sterge(e: TElem) is:found: Booleanfound = falseindex: Integerindex = 0while found == false AND index < this.len execute

if this.elemente[index] == e thenfound = true

elseindex = index + 1

end ifend whileif found then

this.elemente[index] = this.elemente[this.len-1]this.len = this.len - 1

end ifreturn found

end function

Complexitate: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - cauta

Ce trebuie sa facem la cautare?

function cauta(e: TElem) is:found: Booleanfound = falseindex: Integerindex = 0while found == false AND index < this.len execute

if this.elemente[index] == e thenfound = true

elseindex = index + 1

end ifend whilereturn found

end function

Complexitate: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - cauta

Ce trebuie sa facem la cautare?

function cauta(e: TElem) is:found: Booleanfound = falseindex: Integerindex = 0while found == false AND index < this.len execute

if this.elemente[index] == e thenfound = true

elseindex = index + 1

end ifend whilereturn found

end function

Complexitate:

O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - cauta

Ce trebuie sa facem la cautare?

function cauta(e: TElem) is:found: Booleanfound = falseindex: Integerindex = 0while found == false AND index < this.len execute

if this.elemente[index] == e thenfound = true

elseindex = index + 1

end ifend whilereturn found

end function

Complexitate: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - dimensiune

Ce trebuie sa facem pentru a returna numarul de elemente dinColectie?

function dimensiune() is:return this.len

end function

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - dimensiune

Ce trebuie sa facem pentru a returna numarul de elemente dinColectie?

function dimensiune() is:return this.len

end function

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - dimensiune

Ce trebuie sa facem pentru a returna numarul de elemente dinColectie?

function dimensiune() is:return this.len

end function

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator

Pana acum am discutat despre iterator la containere la modulabstract.

Am spus ca un iterator are un element curent din container, sitrebuie sa poata sa treaca la elementul urmator.

Acum ca avem o structura de date (vectorul dinamic) putemdiscuta despre implementarea iteratorului pentru Colectie.

Daca retinem elementele ıntr-un vector dinamic, care este celmai simplu mod de a retine un element curent?

Varianta cea mai simpla de a retine un element curent ıntr-unvector dinamic este sa retinem pozitia elementului, decielementul curent din iteratorul pentru vector dinamic, va fi opozitie.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator

Pana acum am discutat despre iterator la containere la modulabstract.

Am spus ca un iterator are un element curent din container, sitrebuie sa poata sa treaca la elementul urmator.

Acum ca avem o structura de date (vectorul dinamic) putemdiscuta despre implementarea iteratorului pentru Colectie.

Daca retinem elementele ıntr-un vector dinamic, care este celmai simplu mod de a retine un element curent?

Varianta cea mai simpla de a retine un element curent ıntr-unvector dinamic este sa retinem pozitia elementului, decielementul curent din iteratorul pentru vector dinamic, va fi opozitie.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator

Ce operatii avea iteratorul?

creeaza - creeaza un iteratorelement - returneaza elementul curenturmator - trece la urmatorul element curentvalid - verifica daca elementul curent din iterator este valid

Ce campuri ar trebui sa aiba iteratorul pentru o Colectiereprezentata pe un vector dinamic?

IteratorColectie:col: Colectiecurent: Integer

E important ca sa retinem ın iterator si colectia, pentru caacolo sunt elementele. Tot timpul iteratorul retine sistructura/containerul peste care itereaza.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator

Ce operatii avea iteratorul?

creeaza - creeaza un iteratorelement - returneaza elementul curenturmator - trece la urmatorul element curentvalid - verifica daca elementul curent din iterator este valid

Ce campuri ar trebui sa aiba iteratorul pentru o Colectiereprezentata pe un vector dinamic?

IteratorColectie:col: Colectiecurent: Integer

E important ca sa retinem ın iterator si colectia, pentru caacolo sunt elementele. Tot timpul iteratorul retine sistructura/containerul peste care itereaza.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator

Ce operatii avea iteratorul?

creeaza - creeaza un iteratorelement - returneaza elementul curenturmator - trece la urmatorul element curentvalid - verifica daca elementul curent din iterator este valid

Ce campuri ar trebui sa aiba iteratorul pentru o Colectiereprezentata pe un vector dinamic?

IteratorColectie:col: Colectiecurent: Integer

E important ca sa retinem ın iterator si colectia, pentru caacolo sunt elementele. Tot timpul iteratorul retine sistructura/containerul peste care itereaza.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - creeaza

Ce ar trebui sa faca operatia creeaza?

subalgorithm creeaza (col: Colectie) is:this.col = colthis.curent = 0

end subalgorithm

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - creeaza

Ce ar trebui sa faca operatia creeaza?

subalgorithm creeaza (col: Colectie) is:this.col = colthis.curent = 0

end subalgorithm

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - creeaza

Ce ar trebui sa faca operatia creeaza?

subalgorithm creeaza (col: Colectie) is:this.col = colthis.curent = 0

end subalgorithm

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - element

Ce ar trebui sa faca operatia element?

function element() is:return this.col.elemente[this.curent]

end function

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - element

Ce ar trebui sa faca operatia element?

function element() is:return this.col.elemente[this.curent]

end function

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - element

Ce ar trebui sa faca operatia element?

function element() is:return this.col.elemente[this.curent]

end function

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - urmator

Ce ar trebui sa faca operatia urmator?

subalgorithm urmator() is:this.curent = this.curent + 1

end subalgorithm

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - urmator

Ce ar trebui sa faca operatia urmator?

subalgorithm urmator() is:this.curent = this.curent + 1

end subalgorithm

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - urmator

Ce ar trebui sa faca operatia urmator?

subalgorithm urmator() is:this.curent = this.curent + 1

end subalgorithm

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - valid

Ce ar trebui sa faca operatia valid?

function valid() is:if this.curent < this.col .len then

return adevaratelse

return falsend if

end function

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - valid

Ce ar trebui sa faca operatia valid?

function valid() is:if this.curent < this.col .len then

return adevaratelse

return falsend if

end function

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator - valid

Ce ar trebui sa faca operatia valid?

function valid() is:if this.curent < this.col .len then

return adevaratelse

return falsend if

end function

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Colectie - iterator

Colectia are si o operatie numita iterator. Scopul operatieieste sa creeze si sa returneze un iterator pentru Colectie.

function iterator() is:it = creeaza(this) //apelam creeaza de la Iteratorreturn it

end function

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Alte containere

Orice container (ordonat sau neordonat) poate fi implementatfolosind un vector dinamic ca reprezentare.

Sa vedem cateva exemple (nu implementari complete, ca laColectie), doar reprezentarea si o operatie.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic

Daca vrem sa implementam o Multime folosind vectoruldinamic, cum ar trebui sa reprezentam Multimea?

Multime:len: ıntregcap: ıntregelemente: TElem[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic

Daca vrem sa implementam o Multime folosind vectoruldinamic, cum ar trebui sa reprezentam Multimea?

Multime:len: ıntregcap: ıntregelemente: TElem[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

Nu exista pozitii ıntr-o Multime, deci putem pune elementulunde vrem noi, si cel mai simplu este sa-l punem la sfarsit.

Fiind Multime, elementele trebuie sa fie unice, deci ınainte dea adauga un element nou, trebuie sa verificam restulelementelor.

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

Nu exista pozitii ıntr-o Multime, deci putem pune elementulunde vrem noi, si cel mai simplu este sa-l punem la sfarsit.

Fiind Multime, elementele trebuie sa fie unice, deci ınainte dea adauga un element nou, trebuie sa verificam restulelementelor.

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic - adaugare

subalgorithm adauga (e: TElem) is://prima data verificam daca mai exista elementuli: Integergasit: Booleani = 0gasit = falswhile i < this.len AND gasit == fals execute

if this.elemente[i] == e thengasit = adevarat

end ifi = i + 1

end whileif gasit == fals then

//trebuie adaugat//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

if this.len == this.cap the//nu mai avem loc liber.@initializam vectNou, vector cu this.cap*2 elementei: Integerfor i = 0, i < this.len, 1 execute

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //ınlocuim vectorulthis.cap = this.cap * 2

end ifthis.elemente[this.len] = ethis.len = this.len + 1

end ifend subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea depinde si de cautare

Caz favorabil: Θ(1) (gasesc elementul pe prima pozitie)Caz defavorabil: Θ(n) (elementul nu se gaseste si trebuieadagat)Caz mediu: Θ(n) (din cauza cautarii nu mai am complexitateamortizata)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea depinde si de cautare

Caz favorabil: Θ(1) (gasesc elementul pe prima pozitie)Caz defavorabil: Θ(n) (elementul nu se gaseste si trebuieadagat)Caz mediu: Θ(n) (din cauza cautarii nu mai am complexitateamortizata)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic

Daca vrem sa implementam o Lista folosind Vectorul Dinamic,cum ar trebui sa reprezentam Lista?

Lista:len: ıntregcap: ıntregelemente: TElem[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic

Daca vrem sa implementam o Lista folosind Vectorul Dinamic,cum ar trebui sa reprezentam Lista?

Lista:len: ıntregcap: ıntregelemente: TElem[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

La Lista exista pozitii, si exista operatia de a adauga unelement pe o pozitie. Deci nu putem pune elementul pur sisimplu la final (exceptand cazul daca pozitia ne spune sa-lpunem acolo).

In primul rand trebuie sa verificam sa avem o pozitie valida.

Si pentru a elibera pozitia respectiva, trebuie sa mutamelementele de dupa pozitia respectiva cu o pozitie mai ladreapta.

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

La Lista exista pozitii, si exista operatia de a adauga unelement pe o pozitie. Deci nu putem pune elementul pur sisimplu la final (exceptand cazul daca pozitia ne spune sa-lpunem acolo).

In primul rand trebuie sa verificam sa avem o pozitie valida.

Si pentru a elibera pozitia respectiva, trebuie sa mutamelementele de dupa pozitia respectiva cu o pozitie mai ladreapta.

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic - adaugarePozitie

subalgorithm adaugaPozitie (poz: Integer, e: TElem) is://prima data verificam pozitiaif poz < 0 or poz > this.len then

@arunca exceptie, pozitie invalidaend ifi: Integerif this.len == this.cap then

//nu mai avem loc liber.@ initializam vectNou, un vector cu this.cap*2 elementefor i = 0, i < this.len, 1 execute

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //ınlocuim vectorulthis.cap = this.cap * 2

end if//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

//mutam elementele la dreapta. Incepem de la capatfor i = this.len-1, i ≥ poz, -1 execute

this.elemente[i+1] = this.elemente[i]end for//punem elementul pe pozitia pozthis.elemente[poz] = ethis.len = this.len + 1

end subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic - adaugarePozitie

Cat este complexitatea pentru adaugaPozitie?

Complexitatea este:

Caz favorabil: Θ(1) (adaugam la sfarsit si nu trebuie realocat)Caz defavorabil: Θ(n) (adaugam la ınceput sau trebuierealocat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Lista pe Vector Dinamic - adaugarePozitie

Cat este complexitatea pentru adaugaPozitie?

Complexitatea este:

Caz favorabil: Θ(1) (adaugam la sfarsit si nu trebuie realocat)Caz defavorabil: Θ(n) (adaugam la ınceput sau trebuierealocat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic

Daca vrem sa implementam un Dictionar folosind VectorulDinamic, cum ar trebui sa reprezentam Dictionarul?

Ne trebuie ceva similar cu ce am avut pana acum, dar la unDictionar avem perechi cheie-valoare si trebuie sa tinem contde acest lucru. Avem doua variante:

Definim separat un tip Pereche, care este alcatuit dintr-o cheiesi o valoare. In acest caz vom avea un singur vector, cuelemente de tip Pereche.Nu definim tip Pereche si vom avea 2 vectori, unul cu chei siunul cu valori. Valoarea de pe pozitia i apartine cheii de pepozitia i.

Indiferent ce alegem, reprezentarea fiind un Vector Dinamic,ne trebuie lungime si capacitate.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic

Daca vrem sa implementam un Dictionar folosind VectorulDinamic, cum ar trebui sa reprezentam Dictionarul?

Ne trebuie ceva similar cu ce am avut pana acum, dar la unDictionar avem perechi cheie-valoare si trebuie sa tinem contde acest lucru. Avem doua variante:

Definim separat un tip Pereche, care este alcatuit dintr-o cheiesi o valoare. In acest caz vom avea un singur vector, cuelemente de tip Pereche.Nu definim tip Pereche si vom avea 2 vectori, unul cu chei siunul cu valori. Valoarea de pe pozitia i apartine cheii de pepozitia i.

Indiferent ce alegem, reprezentarea fiind un Vector Dinamic,ne trebuie lungime si capacitate.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - cu Pereche

Pereche:cheie: TCheie //TCheie e tipul cheilorvaloarea: TValoare //TValoare e tipul valorilor

Dictionar:len: ıntregcap: ıntregelemente: Pereche[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

Nu exista pozitii ın Dictionar, putem pune pereche unde vremnoi.

Trebuie sa verificam daca mai exista cheia ın dictionar, dacada, vom ınlocui valoarea asociata.

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

Nu exista pozitii ın Dictionar, putem pune pereche unde vremnoi.

Trebuie sa verificam daca mai exista cheia ın dictionar, dacada, vom ınlocui valoarea asociata.

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

subalgorithm adauga (c: TCheie, v: TValoare) is://prima data verificam daca mai exista cheiai: Integergasit: Booleani = 0gasit = falswhile i < this.len AND gasit == fals execute

if this.elemente[i].cheie == c thengasit = adevarat//ınlocuim valoareathis.elemente[i].valoare = v

end ifi = i + 1

end whileif gasit == fals then

//trebuie sa adaugam. Continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

if this.len == this.cap then//nu mai avem loc liber.@initializam vectNou, un vector cu this.cap*2 elementei: Integerfor i = 0, i < this.len, 1 execute

vectNou[i] = this.elemente[i]end forthis.elemente = vectNou //ınlocuim vectorulthis.cap = this.cap * 2

end ifp: Perechep.cheie = cp.valoare = vthis.elemente[this.len] = pthis.len = this.len + 1

end ifend subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea este:

Caz favorabil: Θ(1) (cheia este pe prima pozitie ın vector)Caz defavorabil: Θ(n) (cheia nu se gaseste sau trebuierealocat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea este:

Caz favorabil: Θ(1) (cheia este pe prima pozitie ın vector)Caz defavorabil: Θ(n) (cheia nu se gaseste sau trebuierealocat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - fara Pereche

Reprezentarea Dictionarului:

Dictionar:len: ıntregcap: ıntregchei: TCheie[]valori: TValoare[]

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

subalgorithm adauga (c: TCheie, v: TValoare) is://prima data verificam daca mai exista cheiai: Integergasit: Booleani = 0gasit = falswhile i < this.len AND gasit == fals execute

if this.chei[i] == c thengasit = adevarat//ınlocuim valoareathis.valori[i] = v

end ifi = i + 1

end whileif gasit == fals then

//trebuie sa adaugam. Continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

if this.len == this.cap then//nu mai avem loc liber.cNou = @un vector cu this.cp*2 elementevNou = @un vector cu this.cp*2 elementei: Integerfor i = 0, i < this.len, 1 execute

cNou[i] = this.chei[i]vNou[i] = this.valori[i]

end forthis.chei = cNou //ınlocuim vectorul de cheithis.valori = vNou //ınlocuim vectorul si de valorithis.cap = this.cap * 2

end ifthis.chei[this.len] = cthis.valori[this.len] = vthis.len = this.len + 1

end ifend subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea este:

Caz favorabil: Θ(1) (cheia este pe prima pozitie ın vector)Caz defavorabil: Θ(n) (cheia nu se gaseste sau trebuierealocat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Dictionar pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea este:

Caz favorabil: Θ(1) (cheia este pe prima pozitie ın vector)Caz defavorabil: Θ(n) (cheia nu se gaseste sau trebuierealocat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic

Daca vrem sa implementam un MultiDictionar folosindVectorul Dinamic, cum ar trebui sa reprezentamMultiDictionarul?

In general avem doua variante pentru a reprezenta unMultiDictionar

Retinem perechi cheie - valoare (ca la un Dictionar) darpermitem mai multe perechi cu aceeasi cheie, pentru situatiicand o cheie are mai multe valoriRetinem perechi cheie - lista de valori, ın acest caz cheile suntunice

Lista de valori - nu trebuie sa fie neaparat TAD Lista, poate fiun Vector Dinamic sau alta structura de date.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic

Daca vrem sa implementam un MultiDictionar folosindVectorul Dinamic, cum ar trebui sa reprezentamMultiDictionarul?

In general avem doua variante pentru a reprezenta unMultiDictionar

Retinem perechi cheie - valoare (ca la un Dictionar) darpermitem mai multe perechi cu aceeasi cheie, pentru situatiicand o cheie are mai multe valoriRetinem perechi cheie - lista de valori, ın acest caz cheile suntunice

Lista de valori - nu trebuie sa fie neaparat TAD Lista, poate fiun Vector Dinamic sau alta structura de date.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic

Varianta cu perechi cheie-valoare (prima varianta de pe paginaanterioara) seamana foarte mult cu ce am facut la Dictionar,dar nu verificam daca o cheie mai exista.

Avem si aici varianta ın care avem o structura separata pentruo Pereche (si un singur vector de Perechi), sau varianta ın careavem doi vectori (unul pentru chei si unul pentru valori).

Pentru varianta cu lista de valori, putem defini separat ostructura Pereche (alcatuita dintr-o cheie si un vector dinamicde valori) sau putem lucra fara Pereche, cu un vector de cheisi un vector dinamic de vectori dinamici (dar e mai complicatadecat varianta anterioara).

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic

Daca avem o structura Pereche formata dintr-o cheie si unVector Dinamic de valori, cum reprezentam MultiDictionarul?

Pereche:cheie: TCheievalori: TValoare[]len: ıntregcap: ıntreg

MultiDictionar:elemente: Pereche[]len: ıntregcap: ıntreg

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic

Daca avem o structura Pereche formata dintr-o cheie si unVector Dinamic de valori, cum reprezentam MultiDictionarul?

Pereche:cheie: TCheievalori: TValoare[]len: ıntregcap: ıntreg

MultiDictionar:elemente: Pereche[]len: ıntregcap: ıntreg

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic

Daca avem o structura Pereche formata dintr-o cheie si unVector Dinamic de valori, cum reprezentam MultiDictionarul?

Pereche:cheie: TCheievalori: TValoare[]len: ıntregcap: ıntreg

MultiDictionar:elemente: Pereche[]len: ıntregcap: ıntreg

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia adaugare?

subalgorithm adauga (c: TCheie, v: TValoare) is://prima data verificam daca mai exista cheiai: Integergasit: Booleani = 0gasit = falswhile i < this.len AND gasit == fals execute

if this.elemente[i].cheie == c thengasit = adevarat//trebuie sa adaugam valoarea//valorile sunt retinute ıntr-un VD, poate trebuie realocat//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD MultiDictionar pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia adaugare?

subalgorithm adauga (c: TCheie, v: TValoare) is://prima data verificam daca mai exista cheiai: Integergasit: Booleani = 0gasit = falswhile i < this.len AND gasit == fals execute

if this.elemente[i].cheie == c thengasit = adevarat//trebuie sa adaugam valoarea//valorile sunt retinute ıntr-un VD, poate trebuie realocat//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

if this.elemente[i].len == this.elemente[i].cap then@alocam vNou, un vector cu this.elemente[i].cap * 2 elementeindex: Intregfor index = 0, index < this.elemente[i].len, 1 execute

vNou[index] = this.elemente[i].valori[index]end forthis.elemente[i].valori = vNouthis.elemente[i].cap = this.elemente[i].cap * 2

end if//punem valoarea in vectorul de valorithis.elemente[i].valori[this.elemente[i].len] = vthis.elemente[i].len = this.elemente[i].len + 1

end ifi = i + 1

end while//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

if gasit == fals then//trebuie sa adaugam o pereche noua. Verificam daca avem spatiuif this.len == this.cap then

//nu mai avem loc liber.@initializam vectNou, un vector cu this.cap*2 elementeindex: Integerfor index = 0, index < this.len, 1 execute

vectNou[index] = this.elemente[index]end forthis.elemente = vectNou //ınlocuim vectorul

this.cap = this.cap * 2end ifp: Perechep.cheie = cp.cap = 4 //putem pune cate pozitii vrem sa avem initial@initializam p.valori, un vector de p.cap elementep.valori[0] = v //punem valoarea in vectorp.len = 1 //am adaugat valoarea v//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

this.elemente[this.len] = pthis.len = this.len + 1

end ifend subalgorithm

Cat este complexitatea algoritmului?

Avem caz favorabil: Θ(1) - adaugam o valoare la prima cheiesi nu trebuie realocat.Caz devaforabil: Θ(n + m), unde n este numarul total de cheisi m este numarul total de valori

Adunarea la complexitati (de exempl: n + m) se folosestecand avem 2 valori si nu stim care este maximul. Inseamna”maximul dintre cele 2 valori”.

Caz mediu: Θ(n)Complexitate totala: O(n + m)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

this.elemente[this.len] = pthis.len = this.len + 1

end ifend subalgorithm

Cat este complexitatea algoritmului?

Avem caz favorabil: Θ(1) - adaugam o valoare la prima cheiesi nu trebuie realocat.Caz devaforabil: Θ(n + m), unde n este numarul total de cheisi m este numarul total de valori

Adunarea la complexitati (de exempl: n + m) se folosestecand avem 2 valori si nu stim care este maximul. Inseamna”maximul dintre cele 2 valori”.

Caz mediu: Θ(n)Complexitate totala: O(n + m)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

this.elemente[this.len] = pthis.len = this.len + 1

end ifend subalgorithm

Cat este complexitatea algoritmului?

Avem caz favorabil: Θ(1) - adaugam o valoare la prima cheiesi nu trebuie realocat.Caz devaforabil: Θ(n + m), unde n este numarul total de cheisi m este numarul total de valori

Adunarea la complexitati (de exempl: n + m) se folosestecand avem 2 valori si nu stim care este maximul. Inseamna”maximul dintre cele 2 valori”.

Caz mediu: Θ(n)Complexitate totala: O(n + m)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic

Daca vrem sa implementam o Multime ordonata folosindVectorul Dinamic, cum ar trebui sa reprezentam Multimeaordonata?

MultimeOrdonata:rel: Relatielen: ıntregcap: ıntregelemente: TElem[]

Vom trata Relatia ca o functie cu 2 parametrii:

rel(e1, e2) = 0, daca e1 == e2

rel(e1, e2) = −1, daca e1 < e2

rel(e1, e2) = 1, daca e1 > e2

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic

Daca vrem sa implementam o Multime ordonata folosindVectorul Dinamic, cum ar trebui sa reprezentam Multimeaordonata?

MultimeOrdonata:rel: Relatielen: ıntregcap: ıntregelemente: TElem[]

Vom trata Relatia ca o functie cu 2 parametrii:

rel(e1, e2) = 0, daca e1 == e2

rel(e1, e2) = −1, daca e1 < e2

rel(e1, e2) = 1, daca e1 > e2

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

Fiind Multime, elementele trebuie sa fie unice, deci ınainte dea adauga un element nou, trebuie sa verificam restulelementelor. Verificarea e suficienta sa o facem pana la pozitiaunde elementul ar trebui sa fie (elementele fiind ordonate).

Fiind o Multime ordonata, daca adaugam elementul, trebuiesa-l punem ın asa fel, ıncat elementele sa ramana ordonate(deci nu putem pune doar la capat).

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic - adaugare

Ce ar trebui sa faca operatia de adaugare?

Fiind Multime, elementele trebuie sa fie unice, deci ınainte dea adauga un element nou, trebuie sa verificam restulelementelor. Verificarea e suficienta sa o facem pana la pozitiaunde elementul ar trebui sa fie (elementele fiind ordonate).

Fiind o Multime ordonata, daca adaugam elementul, trebuiesa-l punem ın asa fel, ıncat elementele sa ramana ordonate(deci nu putem pune doar la capat).

Fiind Vector Dinamic, daca elementul trebuie adaugat, trebuiesa verificam daca mai avem loc liber, si daca nu, alocam unvector mai mare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic - adaugare

subalgorithm adauga (e: TElem) is://prima data verificam daca mai exista elementuli, index: Integeri = 0while i < this.len AND this.rel(e, this.elemente[i]) == 1 execute

i = i + 1end while//Acum ori i = this.len (am iesit din vector) ori e = this.elemente[i]//ori e < this.elemente[i]if (i < this.len AND this.elemente[i] 6= e) OR i == this.len then

//trebuie adaugat//continuam pe pagina urmatoare

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

if this.len == this.cap then//nu mai avem loc liber.@initializam vectNou, un vector cu this.cap*2 elementefor index = 0, index < this.len, 1 execute

vectNou[index] = this.elemente[index]end forthis.elemente = vectNou //ınlocuim vectorulthis.cap = this.cap * 2

end if//mutam elementele de la pozitia i la dreaptafor index = this.len-1, index > i-1, -1 execute

this.elemente[index+1] = this.elemente[index]end forthis.elemente[i] = ethis.len = this.len + 1

end ifend subalgorithm

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea depinde si de cautare

Caz favorabil: Θ(1) (gasesc elementul pe prima pozitie)Caz defavorabil: Θ(n) (elementul nu se gaseste si trebuieadagat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

TAD Multime ordonata pe Vector Dinamic - adaugare

Cat este complexitatea pentru adauga?

Complexitatea depinde si de cautare

Caz favorabil: Θ(1) (gasesc elementul pe prima pozitie)Caz defavorabil: Θ(n) (elementul nu se gaseste si trebuieadagat)Caz mediu: Θ(n)Complexitatea totala: O(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Coada cu Prioritati pe Vector Dinamic

La Multime ordonata am vazut ca este necesar sa retinemelementele ordonate, si acest lucru este adevarat si pentrurestul containerelor ordonate care au iterator. Dar cum putemretine elementele pentru o Coada cu Prioritati?

Putem retine elementele ın ordinea ın care au fost adaugate

La adaugare pur si simplu punem elementul unde este cel maiusor de pusLa stergere trebuie sa cautam elementul cu prioritatea maximaLa element trebuie sa cautam elementul cu prioritateamaxima.

Putem retine elementele ordonate dupa prioritate

La adaugare trebuie sa punem elementul astfel ıncat structurasa ramana ordonata.La stergere stim ca elementul cu prioritatea maxima este la uncapat al cozii, nu trebuie sa cautam.La element stim ca elementul cu prioritatea maxima este la uncapat al cozii, nu trebuie sa cautam.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Coada cu Prioritati pe Vector Dinamic

La Multime ordonata am vazut ca este necesar sa retinemelementele ordonate, si acest lucru este adevarat si pentrurestul containerelor ordonate care au iterator. Dar cum putemretine elementele pentru o Coada cu Prioritati?

Putem retine elementele ın ordinea ın care au fost adaugate

La adaugare pur si simplu punem elementul unde este cel maiusor de pusLa stergere trebuie sa cautam elementul cu prioritatea maximaLa element trebuie sa cautam elementul cu prioritateamaxima.

Putem retine elementele ordonate dupa prioritate

La adaugare trebuie sa punem elementul astfel ıncat structurasa ramana ordonata.La stergere stim ca elementul cu prioritatea maxima este la uncapat al cozii, nu trebuie sa cautam.La element stim ca elementul cu prioritatea maxima este la uncapat al cozii, nu trebuie sa cautam.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

Coada cu Prioritati pe Vector Dinamic

La Multime ordonata am vazut ca este necesar sa retinemelementele ordonate, si acest lucru este adevarat si pentrurestul containerelor ordonate care au iterator. Dar cum putemretine elementele pentru o Coada cu Prioritati?

Putem retine elementele ın ordinea ın care au fost adaugate

La adaugare pur si simplu punem elementul unde este cel maiusor de pusLa stergere trebuie sa cautam elementul cu prioritatea maximaLa element trebuie sa cautam elementul cu prioritateamaxima.

Putem retine elementele ordonate dupa prioritate

La adaugare trebuie sa punem elementul astfel ıncat structurasa ramana ordonata.La stergere stim ca elementul cu prioritatea maxima este la uncapat al cozii, nu trebuie sa cautam.La element stim ca elementul cu prioritatea maxima este la uncapat al cozii, nu trebuie sa cautam.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Retinem elementele ın ordinea ın care au fost adaugate. Incare capat al Vectorului adaugam un element nou (numar maimare ınseamna element cu prioritate mai mare)?

Sageata verde arata capatul unde inseram.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Daca vectorul nu este ordonat, la stergere (si la operatiaelement) trebuie sa parcurgem vectorul sa gasim prioritateamaxima, indiferent de capatul ales pentru adaugare.

La adaugare e mai simplu sa punem un element la finalulvectorului dinamic, de aceea vom alege varianta a 2-a.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Unde punem elementul (Radu, 4)?

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Unde punem elementul (Radu, 4)?

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Unde punem elementul (Radu, 4)?

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Care element va fi sters?

Trebuie sa stergem elementul cu prioritatea maxima, adica pe(Oana, 5).

Complexitate: Θ(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Care element va fi sters?

Trebuie sa stergem elementul cu prioritatea maxima, adica pe(Oana, 5).

Complexitate:

Θ(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Care element va fi sters?

Trebuie sa stergem elementul cu prioritatea maxima, adica pe(Oana, 5).

Complexitate: Θ(n)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic

Complexitatea este Θ(n) pentru ca pentru a gasi elementul cuprioritate maxima trebuie sa parcurgem tot vectorul. Nuexista caz favorabil, chiar daca sterg ultimul element si nu amde mutat niciun element, pentru a afla ca ultimul element areprioritatea maxima trebuie sa parcurgem tot vectorul.

Dupa stergere vom avea:

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Daca folosesc un Vector Dinamic Ordonat pot sa am 2variante (ordonat crescator dupa prioritate, sau ordonatdescrescator dupa prioritate):

Care varianta e mai buna?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

La adaugare trebuie sa inseram elementul astfel ıncat vectorulsa ramana ordonat, indiferent de varianta aleasa.

La stergere e mai simplu sa stergem de la finalul vectorului,deci vom alege prima varianta.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Unde punem elementul (Radu, 4)?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Unde punem elementul (Radu, 4)?

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Elementul (Radu, 4) poate fi pus si ın fata elementului (Raul,4) pentru ca au aceeasi prioritate.

Complexitate:

O(n) - aici avem caz favorabil, poate elementulde adaugat are complexitate mai mare decat ultimul element,si atunci pur si simplu ıl punem la final.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Elementul (Radu, 4) poate fi pus si ın fata elementului (Raul,4) pentru ca au aceeasi prioritate.

Complexitate: O(n) - aici avem caz favorabil, poate elementulde adaugat are complexitate mai mare decat ultimul element,si atunci pur si simplu ıl punem la final.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Care element va fi sters?

Stergem din nou elementul cu prioritatea maxima, dar de dataasta stim ca este la finalul vectorului.

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Care element va fi sters?

Stergem din nou elementul cu prioritatea maxima, dar de dataasta stim ca este la finalul vectorului.

Complexitate:

Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Reprezentare pe Vector Dinamic Ordonat

Care element va fi sters?

Stergem din nou elementul cu prioritatea maxima, dar de dataasta stim ca este la finalul vectorului.

Complexitate: Θ(1)

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Vector Dinamic - Rezumat

Sa vedem complexitatea operatilor pentru cele 2 variante dereprezentare pe vector dinamic (ordonat sau neordonat)

Operatie VD Neordonat VD Ordonatadauga Θ(1) O(n)

sterge Θ(n) Θ(1)

element Θ(n) Θ(1)

Pe baza complexitatilor putem conclude ca este mai binesa retinem elementele ıntr-o structura ordonata.

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE

CP - Rezumat

Am vazut ca putem sa implementam operatia de adaugareavand complexitate O(n) si stergerea ın Θ(1).

Acest lucru ınseamna ca daca adaugam n elemente ıntr-ocoada cu prioritati dupa care stergem n elemente,complexitatea totala a operatiilor va fi: O(n2) ( n * O(n) + n* Θ(1)).

Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE