programare s˘i structuri de datemarianzsu/postuniv/curs/curs04.pdf · 2020-01-13 · programare...
TRANSCRIPT
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