programare s˘i structuri de datemarianzsu/postuniv/curs/curs03.pdf · 2019-12-15 · ce operat˘ii...
TRANSCRIPT
PROGRAMARE SI STRUCTURI DE DATECURS 3
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
Containere ordonate
Complexitati
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Containere ordonate
Sunt situatii ın care avem nevoie de un anumit container, darne trebuie si ca elementele containerului sa fie ordonate.
Am tot discutat exemplul cu portmoneu. S-ar putea sa vremsa avem bancnotele din portmomenu aranjate ın ordinecrescatoare a valorii.
In aceste situatii putem folosi containere ordonate (sortate),majoritatea containerelor avand si varianta ordonata.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor
Cum putem ordona elementele? De unde stie un container ınce ordine vrem sa fie elementele?
Pentru anumite tipuri de date simple, pare simplu ordonareaelementelor si majoritatea limbajelor de programare auoperatii de comparatie definite
numerele ın general se ordoneaza crescator
stringurile ın general se ordoneaza ın ordine alfabetica
etc.
In general putem defini o ordonare si pentru tipuri definite deutilizator
De exemplu, daca avem tipul Data (compusa din luna, an, zi),putem defini ordonarea ın ordine cronologica.
Daca avem tipul Elev, putem defini ordonarea pe baza numeluisi a prenumelui.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor
Cum putem ordona elementele? De unde stie un container ınce ordine vrem sa fie elementele?
Pentru anumite tipuri de date simple, pare simplu ordonareaelementelor si majoritatea limbajelor de programare auoperatii de comparatie definite
numerele ın general se ordoneaza crescator
stringurile ın general se ordoneaza ın ordine alfabetica
etc.
In general putem defini o ordonare si pentru tipuri definite deutilizator
De exemplu, daca avem tipul Data (compusa din luna, an, zi),putem defini ordonarea ın ordine cronologica.
Daca avem tipul Elev, putem defini ordonarea pe baza numeluisi a prenumelui.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor
Cum putem ordona elementele? De unde stie un container ınce ordine vrem sa fie elementele?
Pentru anumite tipuri de date simple, pare simplu ordonareaelementelor si majoritatea limbajelor de programare auoperatii de comparatie definite
numerele ın general se ordoneaza crescator
stringurile ın general se ordoneaza ın ordine alfabetica
etc.
In general putem defini o ordonare si pentru tipuri definite deutilizator
De exemplu, daca avem tipul Data (compusa din luna, an, zi),putem defini ordonarea ın ordine cronologica.
Daca avem tipul Elev, putem defini ordonarea pe baza numeluisi a prenumelui.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor II
In anumite limbaje de programare (de exemplu C++), putemdefini operatoarele =, >, < pentru tipuri definite de utilizator.
Deci putem scrie data1 < data2 (presupunand ca data1 sidata2 sunt doua variabile de tip Data)
In alte limbaje de programare (de exemplu Java), pentruanumite tipuri exista operatori =, < si >, dar pentru acompara tipuri definite de utilizatori trebuie implementata (sifolosita) o functie separata, numita compareTo.
Deci ın Java, vom folosi data1.compareTo(data2).
compareTo returneaza 0, daca elementele sunt egale, un numarnegativ daca data1 este mai mic (adica vine ınaintea lui data2la ordonare), si un numar pozitiv daca data1 este mai mare
Daca o clasa are implementata operatia compareTo, Java stiesa foloseasca aceasta functie pentru ordonarea elementelor.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor II
In anumite limbaje de programare (de exemplu C++), putemdefini operatoarele =, >, < pentru tipuri definite de utilizator.
Deci putem scrie data1 < data2 (presupunand ca data1 sidata2 sunt doua variabile de tip Data)
In alte limbaje de programare (de exemplu Java), pentruanumite tipuri exista operatori =, < si >, dar pentru acompara tipuri definite de utilizatori trebuie implementata (sifolosita) o functie separata, numita compareTo.
Deci ın Java, vom folosi data1.compareTo(data2).
compareTo returneaza 0, daca elementele sunt egale, un numarnegativ daca data1 este mai mic (adica vine ınaintea lui data2la ordonare), si un numar pozitiv daca data1 este mai mare
Daca o clasa are implementata operatia compareTo, Java stiesa foloseasca aceasta functie pentru ordonarea elementelor.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor III
Presupunand ca avem tipul definit de utilizator Elev (care arenume, prenume, medie, si data nasterii de tip Data), s-arputea sa vrem sa ordonam elevii ın mai multe moduri:
Vrem sa ordonam elevii alfabetic dupa nume si prenume (deex. pentru catalog)
Vrem sa ordonam elevii dupa media lor (de ex. pentru a vedeacine obtine premiul I, II, etc.)
Vrem sa ordonam elevii dupa data nasterii (de ex. pentru avedea cine e cel mai tanar si cel mai batran)
Vrem sa ordonam elevii dupa luna si ziua nasterii (de ex.pentru a vedea cand se sarbatoreste ziua lor de nastere)
In aceste situatii nu ne ajuta operatorul < sau operatiacompareTo (pentru ca au o singura implementare)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor IV
Pentru o flexibilitate mai mare la ordonare, putem presupuneca exista o relatie care ajuta la ordonare.
relatia poate fi considerata ca o functie care primeste caparametru 2 elemente (elementele de comparat) si returneaza:
o valoare booleana (adevarat sau fals), ın functie daca primulparametru e mai mic sau egal decat celalalt (e un fel de <=).
o valoare ıntrega, 0, valoare negativa sau pozitiva (similar curezultatul operatiei compareTo).
In multe limbaje de programare, anumite operatii care aunevoie de o metoda de a compara/ordona elementele, primescca parametru o relatie.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ordonarea elementelor V
In Java, pentru a defini o relatie, avem nevoie de unComparator.
Comparatorul este o clasa, care contine o functie compare,care are 2 parametri: cele 2 elemente de comparat.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata
Colectia ordonata este similara cu Colectia, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Colectie.
creeaza()col.adauga(e)col.sterge(e)col.dim()col.cauta(e)col.iterator()
Ce operatii credeti ca nu mai exista pentru o Colectieordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Colectie ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata
Colectia ordonata este similara cu Colectia, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Colectie.
creeaza()col.adauga(e)col.sterge(e)col.dim()col.cauta(e)col.iterator()
Ce operatii credeti ca nu mai exista pentru o Colectieordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Colectie ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata
Colectia ordonata este similara cu Colectia, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Colectie.
creeaza()col.adauga(e)col.sterge(e)col.dim()col.cauta(e)col.iterator()
Ce operatii credeti ca nu mai exista pentru o Colectieordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Colectie ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata
Colectia ordonata este similara cu Colectia, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Colectie.
creeaza()col.adauga(e)col.sterge(e)col.dim()col.cauta(e)col.iterator()
Ce operatii credeti ca nu mai exista pentru o Colectieordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Colectie ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata
Colectia ordonata este similara cu Colectia, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Colectie.
creeaza()col.adauga(e)col.sterge(e)col.dim()col.cauta(e)col.iterator()
Ce operatii credeti ca nu mai exista pentru o Colectieordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Colectie ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata II
Exista o singura diferenta dintre interfata Colectiei si aColectiei ordonate:
La operatia creeaza, se transmite ca parametru o relatie, carespecifica ordinea ın care elementele trebuie ordonate.
Daca restul operatiilor sunt la fel, de unde putem sa vedemdaca avem o Colectie sau o Colectie ordonata?
Diferenta dintre Colectie si Colectia ordonata se vede ınmomentul ın care folosim iteratorul sa parcurgem elementele:
La Colectie elementele pot fi parcurse ın orice ordineLa Colectia ordonata iteratorul trebuie sa returneze elementeleordonate dupa relatie.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Colectie ordonata II
Exista o singura diferenta dintre interfata Colectiei si aColectiei ordonate:
La operatia creeaza, se transmite ca parametru o relatie, carespecifica ordinea ın care elementele trebuie ordonate.
Daca restul operatiilor sunt la fel, de unde putem sa vedemdaca avem o Colectie sau o Colectie ordonata?
Diferenta dintre Colectie si Colectia ordonata se vede ınmomentul ın care folosim iteratorul sa parcurgem elementele:
La Colectie elementele pot fi parcurse ın orice ordineLa Colectia ordonata iteratorul trebuie sa returneze elementeleordonate dupa relatie.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Multime ordonata
Multimea ordonata este similara cu Multimea, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Multime.
creeaza()mul.adauga(e)mul.sterge(e)mul.dim()mul.cauta(e)mul.iterator()
Ce operatii credeti ca nu mai exista pentru o Multimeordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Multime ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Multime ordonata
Multimea ordonata este similara cu Multimea, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Multime.
creeaza()mul.adauga(e)mul.sterge(e)mul.dim()mul.cauta(e)mul.iterator()
Ce operatii credeti ca nu mai exista pentru o Multimeordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Multime ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Multime ordonata
Multimea ordonata este similara cu Multimea, dar elementelesunt ordonate.
Mai jos aveti lista operatiilor pentru Multime.
creeaza()mul.adauga(e)mul.sterge(e)mul.dim()mul.cauta(e)mul.iterator()
Ce operatii credeti ca nu mai exista pentru o Multimeordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Multime ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Multime ordonata II
Similar cu Colectia ordonata, si la Multimea ordonata exista osingura diferenta ın interfata: operatia creeaza primeste caparametru o relatie care este folosita pentru ordonareaelementelor.
Iteratorul si la Multimea ordonata trebuie sa returnezeelementele ordonate dupa relatiei.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Multime ordonata ın Java
In Java exista multime ordonata, se numeste SortedSet.
Lista operatiilor pentru SortedSet se gaseste la adresa:https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
Lista de la adresa de mai sus contine operatiile care sunt ın plus, fata de
operatiile de la Set
(https://docs.oracle.com/javase/8/docs/api/java/util/Set.html)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Lista ordonata
Lista ordonata este similara cu Lista, dar elementele suntordonate pe baza unei relatii
Mai jos aveti lista operatiilor pentru Lista
creeaza()
lst.adaugaSfarsit(e)
lst.adaugaPozitie(e, poz)
lst.modifica(e, poz)
lst.cauta(e)
lst.dim()
lst.sterge(e)
lst.sterge(poz)
lst.element(poz)
lst.pozitie(e)
lst.vida()
lst.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Lista ordonata II
Ce operatii credeti ca nu mai exista pentru o Lista ordonata?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Lista ordonata?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Lista ordonata III
La Lista ordonata exista mai multe diferente:
operatia creeaza primeste ca parametru o relatie
nu mai exista operatia adaugaSfarsit si adaugaPozitie, doar osingura operatie de adauga.
nu exista operatia modifica
Iteratorul trebuie sa returneze elementele ordonate duparelatie.
Daca folosim pozitiile pentru a accesa elementele, ele trebuiesa fie ordonate (elementul de pe prima pozitie este ”cel maimic”, etc.).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu Prioritati
Coada cu prioritati (Priority Queue ın engleza) este uncontainer ın care fiecare element are asociat o prioritate.
O coada cu prioritati functioneaza dupa principiul HighestPriority First - putem accesa doar elementul cu prioritatemaxima.
La stergerea unui element, se sterge automat elementul cuprioritatea maxima.
Adaugarea se face ın asa fel ıncat sa respectam relatia deordine ıntre prioritati.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata I
Coada cu prioritati are aceeasi operatii ca Stiva si Coada,numai sunt niste diferente date de prezenta prioritatilor si arelatiei R.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata II
creeaza(R)
Descriere: creaza o coada cu prioritati noua, vida
Pre: R este o relatie (functie)
Post: o Coada cu Prioritati vida este creata
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata III
cp.adauga(e, p)
Desciere: adauga un element cu o prioritate ın coada cuprioritati
Pre: cp este o Coada cu Prioritati, e este TElement, p esteprioritatea elementului
Post: elementul e cu prioritatea p este adaugat ın cp
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata IV
cp.sterge()
Descriere: sterge elementul cu prioritatea maxima sireturneaza elementul sters cu prioritatea lui.
Pre: cp este o Coada cu Prioritati, cp nu este vida
Post: din cp se sterge elementul e cu prioritatea p, e este unTElement, e este elementul cu prioritatea maxima, stergereturneaza (e, p) - returnam o pereche formata din element siprioritate.
Arunca: exceptie, daca cp este vida.
Obs: Daca sunt mai multe elemente cu prioritate maximaoricare poate fi sters.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata V
cp.element()
Descriere: returneaza elementul cu prioritate maximaımpreuna cu prioritatea lui, dar nu ıl sterge
Pre: cp este o Coada cu Prioritati, cp nu este vida
Post: element returneaza (e, p), e este un TElement, e esteelementul cu prioritatea maxima ın cp, p este prioritatea lui e.
Arunca: exceptie, daca cp este vida
Obs: Daca sunt mai multe elemente cu prioritate maximaoricare poate fi returnat.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata VI
cp.vida()
Descriere: verifica daca coada cu prioritati este vida
Pre: cp este o Coada cu Prioritati
Post: vida returneaza Adevarat, daca cp nu contine niciunelement, Fals, altfel.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Coada cu prioritati - Interfata VII
Observatie: Coada cu Prioritati nu poate fi iterata, nu areiterator! Nu avem metode de a vedea toate elementele Coziicu Prioritati, doar cel cu prioritate maxima. (Daca vrem savedem restul elementelor trebuie sa tot stergem din coada cuprioritati).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Coada cu Prioritati ın Java
In Java exista TAD Coada cu Prioritati, se numeste PriorityQueue.
Lista operatiilor pentru Priority Queue se gaseste la adresa:https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Dictionar ordonat
Un dictionar contine perechi cheie-valoare. Cum se ordoneazaelementele unui dictionar?
Dictionarul ordonat este similar cu Dictionar, dar cheile suntordonate (perechile sunt ordonate dupa chei).
Mai jos aveti lista operatiilor pentru Dictionar.
creeaza()d.adauga(c, v)d.sterge(c)d.dim()d.cauta(c)d.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Dictionar ordonat
Un dictionar contine perechi cheie-valoare. Cum se ordoneazaelementele unui dictionar?
Dictionarul ordonat este similar cu Dictionar, dar cheile suntordonate (perechile sunt ordonate dupa chei).
Mai jos aveti lista operatiilor pentru Dictionar.
creeaza()d.adauga(c, v)d.sterge(c)d.dim()d.cauta(c)d.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Dictionar ordonat
Un dictionar contine perechi cheie-valoare. Cum se ordoneazaelementele unui dictionar?
Dictionarul ordonat este similar cu Dictionar, dar cheile suntordonate (perechile sunt ordonate dupa chei).
Mai jos aveti lista operatiilor pentru Dictionar.
creeaza()d.adauga(c, v)d.sterge(c)d.dim()d.cauta(c)d.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Dictionar ordonat II
Ce operatii credeti ca nu mai exista pentru un Dictionarordonat?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la Dictionarul ordonat?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD Dictionar ordonat III
Exista o singura diferenta ın interfata Dictionarului ordonat:operatia creeaza primeste ca parametru o relatie care estefolosita pentru ordonarea cheilor.
Iteratorul trebuie sa returneze perechile ordonate dupa relatiacheilor.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Dictionar ordonat ın Java
In Java exista dictionarul ordonat, se numeste SortedMap.
Lista operatiilor pentru SortedMap se gaseste la adresa:https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html
Lista de la adresa de mai sus contine operatiile care sunt ın plus, fata de
operatiile de la Map
(https://docs.oracle.com/javase/8/docs/api/java/util/Map.html)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD MultiDictionar ordonat
Un multidictionar contine perechi cheie-valoare, iar o cheiepoate sa aiba mai multe valori asociate. Cum se ordoneazaelementele unui multidictionar?
MultiDictionarul ordonat este similar cu MultiDictionar, darcheile sunt ordonate (perechile sunt ordonate dupa chei).Daca o cheie are mai multe valori asociate, acele valori pot fiın orice ordine, nu ordonam dupa valori.
Mai jos aveti lista operatiilor pentru MultiDictionar.
creeaza()md.adauga(c, v)md.sterge(c, v)md.dim()md.cauta(c)md.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD MultiDictionar ordonat
Un multidictionar contine perechi cheie-valoare, iar o cheiepoate sa aiba mai multe valori asociate. Cum se ordoneazaelementele unui multidictionar?
MultiDictionarul ordonat este similar cu MultiDictionar, darcheile sunt ordonate (perechile sunt ordonate dupa chei).Daca o cheie are mai multe valori asociate, acele valori pot fiın orice ordine, nu ordonam dupa valori.
Mai jos aveti lista operatiilor pentru MultiDictionar.
creeaza()md.adauga(c, v)md.sterge(c, v)md.dim()md.cauta(c)md.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD MultiDictionar ordonat
Un multidictionar contine perechi cheie-valoare, iar o cheiepoate sa aiba mai multe valori asociate. Cum se ordoneazaelementele unui multidictionar?
MultiDictionarul ordonat este similar cu MultiDictionar, darcheile sunt ordonate (perechile sunt ordonate dupa chei).Daca o cheie are mai multe valori asociate, acele valori pot fiın orice ordine, nu ordonam dupa valori.
Mai jos aveti lista operatiilor pentru MultiDictionar.
creeaza()md.adauga(c, v)md.sterge(c, v)md.dim()md.cauta(c)md.iterator()
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD MultiDictionar ordonat II
Ce operatii credeti ca nu mai exista pentru un MultiDictionarordonat?
Ce operatii credeti ca sunt diferite (antetul, nuimplementarea) la MultiDictionarul ordonat?
Credeti ca sunt operatii care ar trebui adaugate ın interfata?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
TAD MultiDictionar ordonat III
Exista o singura diferenta ın interfata MultiDictionaruluiordonat: operatia creeaza primeste ca parametru o relatie careeste folosita pentru ordonarea cheilor.
Iteratorul trebuie sa returneze perechile ordonate dupa relatiacheilor.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Un exemplu
In seminarul 2 ati discutat despre problema cu bete: Avem Nbete, si lungimea fiecarui bat, care este un numar pozitiv.Cand se face o operatie de taiere pe aceste N bete, lungimeafiecarui bat este redus cu lungimea celui mai scurt bat.Operatia de taiere se repeta pana cand nu mai avem delocbete, considerand tot timpul minimul actual dintre lungimi.Afisati numarul de bete ınainte de fiecare operatie de taiere.
De exemplu, pentru lungimile: [5, 4, 4, 2, 2, 8] vom avea:
[5, 4, 4, 2, 2, 8], minimul e 2[3, 2, 2, 6], minimul e 2[1, 4], minimul e 1[4], minimul e 4
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Un exemplu II
Ati discutat 2 variante de solutii pentru aceasta problema:1 O varianta ın care:
cautam minimul (ignorand posibile valori de 0)reducem toate lungimile nonzero cu lungimea minimanumaram cate valori non-zero ramanrepetam pasii de mai sus, pana nu mai avem valori non-zero
2 O varianta ın care:
am sortat array-ul de lungimi descrescatoram cautat minimul array-ului (ignorand posibile valori 0 lafinalul array-ului)am scazut minimul din fiecare valoare non-zerorepetam pasul de mai sus, pana nu mai avem valori non-zero
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Un exemplu III
Care varianta vi se pare mai buna (optima)?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Analiza empirica
Analiza empirica ınseamna implementarea algoritmilor,executarea lor si masurarea timpului de executie pentru avedea care algoritm este mai bun.
N Varianta 1 Varianta 210000 0.53 0.26
20000 2.17 1.15
40000 9.83 5.16
100000 53.92 32.43
200000 218.27 130.29
Table: Timp de rulare ın secunde
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Analiza empirica
Analiza empirica ınseamna implementarea algoritmilor,executarea lor si masurarea timpului de executie pentru avedea care algoritm este mai bun.
N Varianta 1 Varianta 210000 0.53 0.26
20000 2.17 1.15
40000 9.83 5.16
100000 53.92 32.43
200000 218.27 130.29
Table: Timp de rulare ın secunde
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Examplu 2
O analiza similara am facut si pentru problema cu sume,discutata ieri: Sa se citeasca un array de n elemente si saverifice daca exista ın tablou o pozitie i, astfel ıncat sumaelementelor ın stanga pozitiei este egala cu suma elementelorın dreapta pozitiei (elementul de pe pozitia i nu se adauga ınsume). Daca ıntr-o parte nu exista elemente, suma seconsidera 0.
Varianta 1: tot recalculam sumele dintre 2 pozitiiVarianta 2: retinem cele 2 sume, stanga si dreapta, si candavansam cu o pozitie, pur si simplu adunam elementul urmatorla suma stanga, si scadem un element din suma dreapta.
Care varianta vi se pare mai buna?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Analiza empirica exemplu 2
N Varianta 1 Varianta 250000 1.51 0.0006
100000 5.79 0.0011
200000 24.28 0.0013
400000 98.36 0.0018
1000000 648.98 0.0027
2000000 - 0.006
4000000 - 0.012
10000000 - 0.022
20000000 - 0.045
Table: Timp de rulare ın secunde
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Analiza empirica
Desi analiza empirica poate sa ne ofere informatii utile despretimpul de rulare, ın general nu e o varianta practica saimplementam mai multe variante de algoritmi.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitati
Sunt foarte multe probleme care pot fi rezolvate ın mai multefeluri. Pentru a compara solutiile si a determina care este maibuna se foloseste complexitatea algoritmului.
In general sunt considerate doua criterii importante candmasuram performata unui algoritm: timpul necesar pentru aobtine solutia problemei si spatiul - memoria utilizata pentrustocarea datelor necesare. Astfel, exista complexitate de timpsi complexitate de spatiu.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitati
Sunt foarte multe probleme care pot fi rezolvate ın mai multefeluri. Pentru a compara solutiile si a determina care este maibuna se foloseste complexitatea algoritmului.
In general sunt considerate doua criterii importante candmasuram performata unui algoritm: timpul necesar pentru aobtine solutia problemei si spatiul - memoria utilizata pentrustocarea datelor necesare. Astfel, exista complexitate de timpsi complexitate de spatiu.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Desi se numeste complexitate de timp, acest tip decomplexitate nu se masoara ın milisecunde, secunde, minute,etc., pentru ca aceste valori depind foarte mult de calculatorulpe care rulam codul.
Pentru a calcula complexitatea de timp al unui algoritm, estenecesar sa consideram ın primul rand numarul de operatiielementare efectuate de algoritm.
Operatiile elementare sunt citirea, afisarea, atribuirea,comparatia, adunarea, etc.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemplu
Sa consideram o problema mai simpla (decat problema cubete sau cu sume): Sa calculam si sa afisam suma primelor nnumere naturale.
De exemplu, pentru n = 4 solutia este 1+2+3+4 = 10, iarpentru n = 10 solutia este 55.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemplu 2 - Prima implementare
Prima varianta de implementare este sa folosim un ciclu(pentru sau cattimp), pentru a calcula suma, adunand perand fiecare element.
subalgorithm suma1(n: integer) is:suma, i: integersuma = 0i = 1while i <= n execute
suma = suma + ii = i + 1
end whileprint ”Suma este: ” + suma
end subalgorithm
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemplu 2 - A doua implementare
O alta solutie este sa ne aducem aminte ca exista o formulapentru a calcula suma primelor n numere:
n ∗ (n + 1)
2
subalgorithm suma2(n: integer) is:suma: integersuma = n * (n+1) / 2print ”Suma este” + suma
end subalgorithm
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemplu 2 - A doua implementare
O alta solutie este sa ne aducem aminte ca exista o formulapentru a calcula suma primelor n numere:
n ∗ (n + 1)
2
subalgorithm suma2(n: integer) is:suma: integersuma = n * (n+1) / 2print ”Suma este” + suma
end subalgorithm
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp II
Cate operatii elementare sunt efectuate de prima varianta desolutie?
subalgorithm suma1(n: ınteger) is:suma, i: integersuma = 0i = 1while i <= n execute
suma = suma + ii = i + 1
end whileprint ”Suma este: ” + suma
end subalgorithm
De foarte multe ori numarul de operatii depinde de datele deintrare, ın cazul nostru de n. Sa calculam numarul de operatiipentru n = 5.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp II
Cate operatii elementare sunt efectuate de prima varianta desolutie?
subalgorithm suma1(n: ınteger) is:suma, i: integersuma = 0i = 1while i <= n execute
suma = suma + ii = i + 1
end whileprint ”Suma este: ” + suma
end subalgorithm
De foarte multe ori numarul de operatii depinde de datele deintrare, ın cazul nostru de n. Sa calculam numarul de operatiipentru n = 5.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
definirea variabilelor suma si i - 2 operatii
suma = 0 - o operatie
i = 1 - o operatie
ın ciclul cattimp avem urmatoarele operatii:
i <= 5 - o operatie (dar se executa de 6 ori: pentru valorile 1,2, 3, 4, 5, 6 ale variabilei i)suma = suma + i - 2 operatii (adunare si atribuire) (dar seexecuta de 5 ori: pentru valorile 1, 2, 3, 4, 5 ale variabile i)i = i + 1 - 2 operatii (adunare si atribuire) (dar se executa de5 ori: pentru valorile 1, 2, 3, 4, 5 ale variabilei i)
afisarea - o operatie
In total pentru n = 5, vom avea 2 + 1 + 1 + 6 + 10 + 10 +1 = 31 operatii
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
Cate operatii vom avea pentru numarul n = 10?
Vom avea 2 + 1 + 1 + 11 + 20 + 20 + 1 = 56 operatii
Cate operatii vom avea pentru numarul n = 30?
Vom avea 2 + 1 + 1 + 31 + 60 + 60 + 1 = 156 operatii
Cate operatii avem pentru numarul n?
Vom avea 2 + 1 + 1 + n+1 + 2*n + 2*n + 1 = 5*n + 6operatii. Numarul de operatii pentru un algoritm care are datede intrare de marime n, se noteaza cu T(n). Deci, ın cazulalgoritmului suma1 avem T (n) = 5 ∗ n + 6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
Cate operatii vom avea pentru numarul n = 10?
Vom avea 2 + 1 + 1 + 11 + 20 + 20 + 1 = 56 operatii
Cate operatii vom avea pentru numarul n = 30?
Vom avea 2 + 1 + 1 + 31 + 60 + 60 + 1 = 156 operatii
Cate operatii avem pentru numarul n?
Vom avea 2 + 1 + 1 + n+1 + 2*n + 2*n + 1 = 5*n + 6operatii. Numarul de operatii pentru un algoritm care are datede intrare de marime n, se noteaza cu T(n). Deci, ın cazulalgoritmului suma1 avem T (n) = 5 ∗ n + 6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
Cate operatii vom avea pentru numarul n = 10?
Vom avea 2 + 1 + 1 + 11 + 20 + 20 + 1 = 56 operatii
Cate operatii vom avea pentru numarul n = 30?
Vom avea 2 + 1 + 1 + 31 + 60 + 60 + 1 = 156 operatii
Cate operatii avem pentru numarul n?
Vom avea 2 + 1 + 1 + n+1 + 2*n + 2*n + 1 = 5*n + 6operatii. Numarul de operatii pentru un algoritm care are datede intrare de marime n, se noteaza cu T(n). Deci, ın cazulalgoritmului suma1 avem T (n) = 5 ∗ n + 6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
Cate operatii vom avea pentru numarul n = 10?
Vom avea 2 + 1 + 1 + 11 + 20 + 20 + 1 = 56 operatii
Cate operatii vom avea pentru numarul n = 30?
Vom avea 2 + 1 + 1 + 31 + 60 + 60 + 1 = 156 operatii
Cate operatii avem pentru numarul n?
Vom avea 2 + 1 + 1 + n+1 + 2*n + 2*n + 1 = 5*n + 6operatii. Numarul de operatii pentru un algoritm care are datede intrare de marime n, se noteaza cu T(n). Deci, ın cazulalgoritmului suma1 avem T (n) = 5 ∗ n + 6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
Cate operatii vom avea pentru numarul n = 10?
Vom avea 2 + 1 + 1 + 11 + 20 + 20 + 1 = 56 operatii
Cate operatii vom avea pentru numarul n = 30?
Vom avea 2 + 1 + 1 + 31 + 60 + 60 + 1 = 156 operatii
Cate operatii avem pentru numarul n?
Vom avea 2 + 1 + 1 + n+1 + 2*n + 2*n + 1 = 5*n + 6operatii. Numarul de operatii pentru un algoritm care are datede intrare de marime n, se noteaza cu T(n). Deci, ın cazulalgoritmului suma1 avem T (n) = 5 ∗ n + 6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma1
Cate operatii vom avea pentru numarul n = 10?
Vom avea 2 + 1 + 1 + 11 + 20 + 20 + 1 = 56 operatii
Cate operatii vom avea pentru numarul n = 30?
Vom avea 2 + 1 + 1 + 31 + 60 + 60 + 1 = 156 operatii
Cate operatii avem pentru numarul n?
Vom avea 2 + 1 + 1 + n+1 + 2*n + 2*n + 1 = 5*n + 6operatii. Numarul de operatii pentru un algoritm care are datede intrare de marime n, se noteaza cu T(n). Deci, ın cazulalgoritmului suma1 avem T (n) = 5 ∗ n + 6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma2
Cate operatii sunt efectuate de algoritmul suma2 pentru n =5?
subalgorithm suma2(n: integer) is:suma: integersuma = n * (n+1) / 2print ”Suma este” + suma
end subalgorithm
6 operatii
Si pentru n = 10? n = 30? numarul n?
Tot 6 operatii. Indiferent de ce numar avem ca parametru,algortimul suma2 va efectua 6 operatii, deci T(n) = 6.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma2
Cate operatii sunt efectuate de algoritmul suma2 pentru n =5?
subalgorithm suma2(n: integer) is:suma: integersuma = n * (n+1) / 2print ”Suma este” + suma
end subalgorithm
6 operatii
Si pentru n = 10? n = 30? numarul n?
Tot 6 operatii. Indiferent de ce numar avem ca parametru,algortimul suma2 va efectua 6 operatii, deci T(n) = 6.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma2
Cate operatii sunt efectuate de algoritmul suma2 pentru n =5?
subalgorithm suma2(n: integer) is:suma: integersuma = n * (n+1) / 2print ”Suma este” + suma
end subalgorithm
6 operatii
Si pentru n = 10? n = 30? numarul n?
Tot 6 operatii. Indiferent de ce numar avem ca parametru,algortimul suma2 va efectua 6 operatii, deci T(n) = 6.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Numarul de operatii pentru suma2
Cate operatii sunt efectuate de algoritmul suma2 pentru n =5?
subalgorithm suma2(n: integer) is:suma: integersuma = n * (n+1) / 2print ”Suma este” + suma
end subalgorithm
6 operatii
Si pentru n = 10? n = 30? numarul n?
Tot 6 operatii. Indiferent de ce numar avem ca parametru,algortimul suma2 va efectua 6 operatii, deci T(n) = 6.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
T(n) - adica numarul de operatii - nu este complexitateaalgoritmului. Ceea ce ne intereseaza pentru a calculacomplexitatea este cum se modifica valoarea T(n), daca semodifica valoarea lui n? Cat de repede creste valoarea T(n),daca creste valoarea lui n?
Pentru algoritmul suma1 am calculat ca T (n) = 5 ∗ n + 6.Cat va fi T (n) daca dublam n-ul?
T (2 ∗ n) = 10 ∗ n + 6, adica T (2 ∗ n) ≈ 2 ∗ T (n)
Pentru algoritmul suma2 am calculat ca T (n) = 6 indiferentde valoarea lui n. Adica, T (2 ∗ n) = T (n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
T(n) - adica numarul de operatii - nu este complexitateaalgoritmului. Ceea ce ne intereseaza pentru a calculacomplexitatea este cum se modifica valoarea T(n), daca semodifica valoarea lui n? Cat de repede creste valoarea T(n),daca creste valoarea lui n?
Pentru algoritmul suma1 am calculat ca T (n) = 5 ∗ n + 6.Cat va fi T (n) daca dublam n-ul?
T (2 ∗ n) = 10 ∗ n + 6, adica T (2 ∗ n) ≈ 2 ∗ T (n)
Pentru algoritmul suma2 am calculat ca T (n) = 6 indiferentde valoarea lui n. Adica, T (2 ∗ n) = T (n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
T(n) - adica numarul de operatii - nu este complexitateaalgoritmului. Ceea ce ne intereseaza pentru a calculacomplexitatea este cum se modifica valoarea T(n), daca semodifica valoarea lui n? Cat de repede creste valoarea T(n),daca creste valoarea lui n?
Pentru algoritmul suma1 am calculat ca T (n) = 5 ∗ n + 6.Cat va fi T (n) daca dublam n-ul?
T (2 ∗ n) = 10 ∗ n + 6, adica T (2 ∗ n) ≈ 2 ∗ T (n)
Pentru algoritmul suma2 am calculat ca T (n) = 6 indiferentde valoarea lui n. Adica, T (2 ∗ n) = T (n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
T(n) - adica numarul de operatii - nu este complexitateaalgoritmului. Ceea ce ne intereseaza pentru a calculacomplexitatea este cum se modifica valoarea T(n), daca semodifica valoarea lui n? Cat de repede creste valoarea T(n),daca creste valoarea lui n?
Pentru algoritmul suma1 am calculat ca T (n) = 5 ∗ n + 6.Cat va fi T (n) daca dublam n-ul?
T (2 ∗ n) = 10 ∗ n + 6, adica T (2 ∗ n) ≈ 2 ∗ T (n)
Pentru algoritmul suma2 am calculat ca T (n) = 6 indiferentde valoarea lui n. Adica, T (2 ∗ n) = T (n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n + 1
T(2*n) = 20*n + 1 ≈ 2 * T(n) = 20*n + 2T(n) = 7*n + 10T(2*n) = 14* n + 10 ≈ 2 * T(n) = 14*n + 20T(n) = 2*n + 99T(2*n) = 4*n + 99 ≈ 2* T(n) = 4*n + 198 (ın special dacan e mare, nu conteaza diferenta dintre T(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n + 1T(2*n) = 20*n + 1 ≈ 2 * T(n) = 20*n + 2T(n) = 7*n + 10
T(2*n) = 14* n + 10 ≈ 2 * T(n) = 14*n + 20T(n) = 2*n + 99T(2*n) = 4*n + 99 ≈ 2* T(n) = 4*n + 198 (ın special dacan e mare, nu conteaza diferenta dintre T(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n + 1T(2*n) = 20*n + 1 ≈ 2 * T(n) = 20*n + 2T(n) = 7*n + 10T(2*n) = 14* n + 10 ≈ 2 * T(n) = 14*n + 20T(n) = 2*n + 99
T(2*n) = 4*n + 99 ≈ 2* T(n) = 4*n + 198 (ın special dacan e mare, nu conteaza diferenta dintre T(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n + 1T(2*n) = 20*n + 1 ≈ 2 * T(n) = 20*n + 2T(n) = 7*n + 10T(2*n) = 14* n + 10 ≈ 2 * T(n) = 14*n + 20T(n) = 2*n + 99T(2*n) = 4*n + 99 ≈ 2* T(n) = 4*n + 198 (ın special dacan e mare, nu conteaza diferenta dintre T(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n2 + 1
T(2*n) = 10*(2*n*2*n) + 1 = 40*n2 + 1 ≈ 4 * T(n) = 40*n2 + 4T(n) = 7*n2 + 10T(2*n) = 7* (2*n*2*n) + 10 = 28*n2 + 10 ≈ 4 * T(n) =28*n2 + 40T(n) = 2*n2 + 99T(2*n) = 2*(2*n*2*n) + 99 = 8*n2 + 99 ≈ 4* T(n) = 8* n2
+ 396 (ın special daca n e mare, nu conteaza diferenta dintreT(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n2 + 1T(2*n) = 10*(2*n*2*n) + 1 = 40*n2 + 1 ≈ 4 * T(n) = 40*n2 + 4T(n) = 7*n2 + 10
T(2*n) = 7* (2*n*2*n) + 10 = 28*n2 + 10 ≈ 4 * T(n) =28*n2 + 40T(n) = 2*n2 + 99T(2*n) = 2*(2*n*2*n) + 99 = 8*n2 + 99 ≈ 4* T(n) = 8* n2
+ 396 (ın special daca n e mare, nu conteaza diferenta dintreT(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n2 + 1T(2*n) = 10*(2*n*2*n) + 1 = 40*n2 + 1 ≈ 4 * T(n) = 40*n2 + 4T(n) = 7*n2 + 10T(2*n) = 7* (2*n*2*n) + 10 = 28*n2 + 10 ≈ 4 * T(n) =28*n2 + 40T(n) = 2*n2 + 99
T(2*n) = 2*(2*n*2*n) + 99 = 8*n2 + 99 ≈ 4* T(n) = 8* n2
+ 396 (ın special daca n e mare, nu conteaza diferenta dintreT(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm pt care T(n) este functiade mai jos. Cat este T(2*n) pentru fiecare functie(aproximativ)?
T(n) = 10*n2 + 1T(2*n) = 10*(2*n*2*n) + 1 = 40*n2 + 1 ≈ 4 * T(n) = 40*n2 + 4T(n) = 7*n2 + 10T(2*n) = 7* (2*n*2*n) + 10 = 28*n2 + 10 ≈ 4 * T(n) =28*n2 + 40T(n) = 2*n2 + 99T(2*n) = 2*(2*n*2*n) + 99 = 8*n2 + 99 ≈ 4* T(n) = 8* n2
+ 396 (ın special daca n e mare, nu conteaza diferenta dintreT(2*n) si 2 * T(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Cand vorbim de complexitati, nu ne intereseaza numarul exactde operatii, ci doar termenul de gradul maxim din T (n) (deaceea, ın general nici nu calculam T(n) exact, ci ıncercam sagasim doar termenul de gradul maxim din T(n)) .
Incercam sa cautam o functie care, la valori mari pentru n,aproximeaza valoarea lui T(n). De aceea, acest tip de analizase numeste analiza asimptotica.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Sa presupunem ca avem un algoritm cu urmatorul numar deoperatii: T (n) = n2 + 3 ∗ n + 20
n n2 T(n) T (n)n2
1 1 24 24
5 25 60 2.4
7 49 90 1.84
10 100 150 1.5
100 10000 10320 1.032
200 40000 40620 1.0155
Cu cat creste valoarea lui n, cu atat devine mai mica diferentadintre valoarea T (n) si valoarea n2. Astfel, pentru valori maripentru n, putem spune ca T (n) ≈ n2
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp
Exista 3 notatii folosite pentru a descrie complexitatea unuialgoritm: notatia O-mare, notatia Ω-mare si notatia Θ-mare
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare I
Notatia O-mare desemneaza marginea asimptoticasuperioara a unei functii.
Fie o functie g(n). Multimea de functii O(g(n)) estedefinita ın modul urmator:
O(g(n)) = f (n) : exista constante pozitive
c si n0 astfel incat
0 ≤ f (n) ≤ c ∗ g(n) pentru orice n ≥ n0(1)
Pentru a indica apartenenta unei functii f (n) la multimeaO(g(n)), vom utiliza notatia f (n) = O(g(n)) sauf (n) ∈ O(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare II
Figure: Sursa: Cormen et. al: Introduction to Algorithms, 3rd Edition,MIT Press, 2009
Sa consideram f (n) = n4 + 2n2 + 10n + 500 si g(n) = n5.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare III
Pe baza definitiei, f (n) = O(g(n)) daca putem gasi constantepozitive c si n0 astfel ıncat 0 ≤ n4 + 2n2 + 10n + 500 ≤ c ∗ n5
pentru orice n ≥ n0
Inegalitatea nu trebuie sa fie adevarata pentru toate valorileposibile ale lui n. Pot exista valori mici, pentru careinegalitatea sa nu fie adevarata, dar trebuie sa aratam caexista o limita, n0, si inegalitatea este adevarata pentru oricepunct mai mare ca n0.
Exista mai multe alegeri bune pentru c si n0. Sa alegem c = 2
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare IV
n f (n) 2 * g(n)1 513 23 629 4864 828 20485 1225 62507 3069 33614
Pe baza valorilor din tabel, putem conclude ca pentru oricen0 ≥ 4, vom avea 0 ≤ n4 + 2n2 + 10n + 500 ≤ 2n5
Obs. Daca alegeam o valoare mai mare pentru c , atunciprobabil inegalitatea era adevarata de la o valoare mai micapentru n0, dar acest lucru nu conteaza: trebuie sa gasim unsingur c pentru care trebuie sa existe un n0, nu conteaza catde mare/mic este.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare V
Deci pentru functia f (n) = n4 + 2n2 + 10n + 500 avemf (n) = O(n5).
Sa consideram g(n) = n4. Este f (n) = O(n4)?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare VI
Pentru a demonstra ca f (n) = O(n4) trebuie sa cautamconstante pozitive c si n0, astfel ıncat0 ≤ n4 + 2n2 + 10n + 500 ≤ c ∗ n4 pentru orice n ≥ n0
Sa alegem c = 3. In acest caz avem urmatoarele valori:
n f (n) 3 ∗ n4
1 513 3
3 629 243
4 828 768
5 1225 1875
7 3069 7203
Pe baza valorilor din tabel, putem conclude ca pentru oricen0 ≥ 5, vom avea 0 ≤ n4 + 2n2 + 10n + 500 ≤ 3n4
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare VII
Sa consideram g(n) = n3. Este f (n) = O(n3)?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare VIII
Pentru a demonstra ca f (n) = O(n3) trebuie sa cautamconstante pozitive c si n0, astfel ıncat0 ≤ n4 + 2n2 + 10n + 500 ≤ c ∗ n3, pentru orice n ≥ n0.
Aceata inegalitate nu mai poate fi demonstrata. Indiferent catde mare ar fi valoarea lui c, va exista un punct p, cand f (p)devine mai mare decat c ∗ p3.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare IX
Sa consideram f (n) = 3n3 + 20n2 + 10n + 500 si g(n) = n3.Este f (n) = O(g(n))?
Pe baza definitiei, f (n) = O(g(n)) daca putem gasi constantepozitive c si n0 astfel ıncat0 ≤ 3 ∗ n3 + 20n2 + 10n + 500 ≤ c ∗ n3 pentru orice n ≥ n0
E clar ca pentru valori de c ≤ 3 inegalitatea nu esteadevarata. Sa luam c = 4.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare X
n 3 ∗ n3 + 20n2 + 10 ∗ n + 500 4 ∗ n3
1 533 4
5 1425 500
10 5600 4000
15 15275 13500
20 32700 32000
25 60125 62500
Pe baza valorilor din tabel, putem conclude ca pentru oricen0 ≥ 25, vom avea 0 ≤ 3 ∗ n3 + 20 ∗ n2 + 10n + 500 ≤ 4n3
Deci pentru functia f (n) = 3 ∗ n3 + 20 ∗ n2 + 10n + 500 avemf (n) = O(n3).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare XI
Am vazut ca pentru f (n) = n4 + 2 ∗ n2 + 10n + 500:
f (n) = O(n5),
f (n) = O(n4)
f (n) 6= O(n3).
Puteti spune alte functii g(n) pentru care f (n) = O(g(n)) ?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare XII
Functia suma1 avea T (n) = 5 ∗ n + 6
Gasiti o functie g(n) pentru care T (n) = O(g(n)).
Puteti gasi mai multe valori pentru g(n)?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare XIII
Pentru orice functie g(n) mai mare sau egal cu n (de ex. n,n2, n3, 2n, etc.) avem T (n) = O(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare XIV
Functia suma2 avea T (n) = 6
Gasiti o functie g(n) pentru care T (n) = O(g(n))
Puteti gasi mai multe valori pentru g(n)?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare XV
Pentru orice functie g(n) mai mare sau egal cu 1 (de ex. 1, n,n2, n3, 2n, etc.) avem T (n) = O(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O −mare XVI
Am vazut ca pentru o functie f (n) pot exista mai multefunctii g(n), astfel ıncat f (n) = O(g(n)). In general, dacafolosim notatia O-mare, ıncercam sa gasim cea mai micavaloarea posibila pentru g(n).
Deci, vom spune ca T (n) = 5 ∗ n + 6 apartine lui O(n) siT (n) = 6 apartine lui O(1).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia O-mare - concluzii
Sa presupunem ca T (n) este numarul de operatii elementarepentru un algoritm
Sa presupunem ca t(n) este termenul de gradul maxim dinT (n), fara orice constanta
T (n) apartine lui O(g(n)), daca g(n) ≥ t(n)
Exemple:
7n3 + 10 ∈ O(n3)n2
2 + 4n + 1 ∈ O(n2)n ∗ log2n + 4n ∈ O(n ∗ log2n)n ∗ log2n + 4n ∈ O(n2)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Ω−mare I
Notatia Ω-mare desemneaza marginea asimptoticainferioara a unei functii.
Fie o functie g(n). Multimea de functii Ω(g(n)) estedefinita ın modul urmator:
Ω(g(n)) = f (n) : exista constante pozitive
c si n0 astfel incat
0 ≤ c ∗ g(n) ≤ f (n) pentru orice n ≥ n0(2)
Pentru a indica apartenenta unei functii f (n) la multimeaΩ(g(n)), vom utiliza notatia f (n) = Ω(g(n)) sauf (n) ∈ Ω(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Ω−mare II
Figure: Sursa: Cormen et. al: Introduction to Algorithms, 3rd Edition,MIT Press, 2009
Sa consideram f (n) = n4 + 2n2 + 10n + 500
Gasiti valori pentru functia g(n), astfel ıncat f (n) = Ω(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Ω−mare III
Pentru orice functie g(n) mai mica sau egala cu n4 (1, n, n2,n3 si n4, etc.) avem f (n) = Ω(g(n))
Si ın cazul T (n) = 5 ∗ n + 6?
Si la T (n) = 6?
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Ω−mare IV
Am vazut ca pentru o functie f (n) pot exista mai multefunctii g(n), astfel ıncat f (n) = Ω(g(n)). In general, dacafolosim notatia Ω-mare, ıncercam sa gasim cea mai marevaloarea posibila pentru g(n).
Deci, vom spune ca T (n) = 5 ∗ n + 6 apartine lui Ω(n) siT (n) = 6 apartine lui Ω(1).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Θ-mare I
Fie o functie g(n). Multimea de functii Θ(g(n)) estedefinita ın modul urmator:
Θ(g(n)) = f (n) : exista constante pozitive
c1, c2 si n0 astfel incat
c1 ∗ g(n) ≤ f (n) ≤ c2 ∗ g(n) pentru orice n ≥ n0(3)
Pentru a indica apartenenta unei functii f (n) la multimeaΘ(g(n)), vom utiliza notatia f (n) = Θ(g(n)) sauf (n) ∈ Θ(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Θ-mare II
Figure: Sursa: Cormen et. al: Introduction to Algorithms, 3rdEdition, MIT Press, 2009
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Θ-mare III
Sa consideram functai suma1, care avea T (n) = 5 ∗ n + 6.Gasiti o valoare pentru functia g(n), astfel ıncatf (n) = Θ(g(n))
Sa consideram functai suma2, care avea T (n) = 6. Gasiti ovaloare pentru functia g(n), astfel ıncat f (n) = Θ(g(n))
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Θ-mare IV
Pentru functia suma1 avem T (n) = Θ(n)
Pentru functia suma2 avem T (n) = Θ(1)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Notatia Θ-mare V
O(g(n)) este limita superioara pentru functia f (n), Ω(g(n))este limita inferioara, Θ(g(n)) este valoarea exacta.
Am vazut ca pentru o functie f (n), pot exista mai multefunctii g(n), astfel ıncat f (n) = O(g(n)) sau f (n) = Ω(g(n)),dar exista o singura functie pentru care f (n) = Θ(n)
Cand acest lucru este posibil, vom folosi notatia Θ pentrucomplexitatea unui algoritm. Daca nu putem folosi notatia Θ,vom folosi notatia O, si ıncercam sa gasim cea mai micavaloare la notatia O.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitati uzuale
Cateva complexitati des ıntalnite ın practica
T (n) = Θ(1) - complexitate constantaT (n) = Θ(log2n) - complexitate logaritmicaT (n) = Θ(n) - complexitate liniaraT (n) = Θ(n2) - complexitate patraticaT (n) = Θ(nk) - complexitate polinomialaT (n) = Θ(2n) - complexitate exponentiala
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm I
Cicluri - Numarul de operatii pentru un ciclu: numarul deoperatii din interiorul ciclului, ınmultit cu numarul de repetitiipentru ciclu.
m = 0n = 1for i = 0, i < n, 1 execute
m = m + 2n = n + 2 * m
end for
Practic, numarul de operatii pentru orice ciclu (undeincrementarea se face cu 1) poate fi scris ca o suma:
2 +n−1∑i=0
5 = 2 + 5 ∗ n
Deci T (n) = 2 + 5 ∗ n = Θ(n)Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm II
Cicluri imbricate - Se analizeaza de la ciclul din exterior spreciclul din interior. Numarul de operatii este produsulnumerelor de operatii din cicluri.
k = 1for i = 0, i < n, 1 execute
for j = 0, i ¡ n, 1, executek = k + i + j
end forend for
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm III
1 +n−1∑i=0
n−1∑j=0
1 = 1 +n−1∑i=0
n = 1 + n2
Deci T (n) = n2 + 1 = Θ(n2)
Nu trebuie sa consideram separat ca avem 3 instructiuni ınciclul pentru cu j (2 adunari si o atribuire), daca e vorba deun numar constant de operatii, putem scrie doar 1.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm IV
Instructiuni consecutive - Se aduna numarul de operatiipentru fiecare instructiune
x = 0for i = 0, i < n, 1 execute
x = x + 1end form = xfor i = 0, i < n, 1 execute
for j = 1, j < i, 1 executem = m + j - i
end forend for
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm V
1 +n−1∑i=0
1 + 1 +n−1∑i=0
i−1∑j=0
1 = 2 + n +n−1∑i=0
i = 2 + n +n ∗ (n − 1)
2
T (n) =n2
2+
n
2+ 2 = Θ(n2)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm VI
Instructiunea daca - Se aduna numarul de operatii pentruconditie si maximul dintre numarul de operatii dintre ramuradaca si altfel
rez = 0if x ≤ 0 then
rez = x * (-1)else
for i = 1, i < x+1, 1 executerez = rez + x
end forend if
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Ghid pentru a calcula complexitatea unui algoritm VII
1 + 1 + max(1,x∑
i=1
1) = 2 + max(1, x) = 2 + x
T (x) = x + 2 = Θ(x)
In general complexitatile sunt sub forma Θ(n), sau O(n), dardaca avem un algoritm unde datele de intrare nu sunt notatecu n, putem folosi alta valoare, de ex: Θ(x)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Caz favorabil, defavorabil, mediu I
Am vazut ca numarul de operatii efectuate de un algoritm(T (n)) de multe ori depinde de marimea datelelor de intrare(notata de obicei cu valoarea n).
De exemplu, daca am o functie care calculeaza sumaelementelor dintr-un tablou, numarul de operatii depinde delungimea tabloului (numarul de elemente din tablou).
Cateodata numarul de operatii nu depinde doar de marimeadatelor de intrare, ci si de datele exacte.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Caz favorabil, defavorabil, mediu II
Sa consideram functia urmatoare, care cauta pozitia unuinumar dat ıntr-un tablou si returneaza -1 daca tabloul nucontine elementul respectiv.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Caz favorabil, defavorabil, mediu III
function PozitieElement(tablou: integer[], n: integer, elem: integer) is://n este numarul de elemente din tablou
rezultat, index: integergasit: booleanrezultat = -1gasit = falseindex = 0while gasit = fals AND index < n execute
if tablou[index] == elem thenrezultat = indexgasit = true
end ifindex = index + 1
end whilereturn rezultat
end function
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Caz favorbil, defavorabil, mediu IV
Sa presupunem ca tabloul transmis ca parametru are lungimean = 5 si cautam elementul 13. Cate operatii vor fi efectuatede algoritm?
Trebuie sa determinam de cate ori se executa ciclul cattimp.
Daca tablou[0] este 13 (de exemplu ın tabloul [13, 1, 5, 3, 6]),ciclul cattimp se executa o singura data si avem aproximativ 6+ 6 + 1 = 13 operatiiDaca tablou[0] nu e 13 si tablou[1] este 13 (de exemplu ıntabloul [5, 13, 9, 10, 12]) ciclul cattimp se executa de 2 ori siavem aproximativ 6 + 11 + 1 = 18 operatiiDaca tablou[0] si tablou[1] nu e 13 si tablou[2] este 13 (deexemplu ın tabloul [3, 7, 13, 1, 2]), ciclul cattimp se executade 3 ori si avem aproximativ 6 + 15 + 1 = 22 operatiietc...
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Caz favorabil, defavorabil, mediu V
In cazul functiei PozitieElement, complexitatea algoritmuluinu depinde doar de lungimea tabloului, ci si de elementeexacte din tablou. In aceste situatii putem vorbi despre:
Complexitate ın caz favorabil - cel mai mic numar de operatiiComplexitate ın caz defavorabil - cel mai mare numar deoperatiiComplexitate ın caz mediu - numarul mediu de operatii
Cazul favorabil, defavorabil si mediu se refera la un nfixat! Nu spunem ca avem caz favorabil cand tabloul e scurtsi caz defavorabil cand e lung.
Nu orice algoritm are caz favorabil, defavorbil si mediuseparat, sunt algoritmi care tot timpul executa acelasi numarde operatii pentru un n fixat.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul favorabil
Cazul favorabil este cea mai buna situatie posibila, reprezintadatele de intrare pentru care algoritmul va executa un numarcat mai mic (minimul posibil) de operatii.
In cazul functiei PozitieElement cazul favorabil este candprimul element din tablou este cel cautat. In acest cazalgoritmul va executa aproximativ 13 operatii (6 operatii deinitializare, conditia din cattimp si din daca, 2 atribuiri ındaca, incrementarea indexului, conditia din cattimp siatribuirea finala).
Numarul de operatii ın acest caz favorabil nu depinde delungimea tabloului (adica ın caz favorabil avem 13 operatiiindiferent de numarul de elemente din tablou), decicomplexitatea ın caz favorabil este Θ(1)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul favorabil
Cazul favorabil este cea mai buna situatie posibila, reprezintadatele de intrare pentru care algoritmul va executa un numarcat mai mic (minimul posibil) de operatii.
In cazul functiei PozitieElement cazul favorabil este candprimul element din tablou este cel cautat. In acest cazalgoritmul va executa aproximativ 13 operatii (6 operatii deinitializare, conditia din cattimp si din daca, 2 atribuiri ındaca, incrementarea indexului, conditia din cattimp siatribuirea finala).
Numarul de operatii ın acest caz favorabil nu depinde delungimea tabloului (adica ın caz favorabil avem 13 operatiiindiferent de numarul de elemente din tablou), decicomplexitatea ın caz favorabil este Θ(1)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul defavorabil
Cazul defavorabil este situatia cea mai defavorabila, datele deintrare pentru care algoritmul va executa numarul maxim deoperatii posibile.
In cazul functiei PozitieElement cazul defavorabil este candtabloul nu contine elementul cautat. In acest caz va trebui saparcurgem si sa verificam toate elementele din tablou. E ca sicum nu ar exista variabila gasit si am avea un ciclu pentru.
In cazul defavorabil parcurgem toate elementele, decicomplexitatea este proportionala cu lungimea tabloului, deciΘ(n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul defavorabil
Cazul defavorabil este situatia cea mai defavorabila, datele deintrare pentru care algoritmul va executa numarul maxim deoperatii posibile.
In cazul functiei PozitieElement cazul defavorabil este candtabloul nu contine elementul cautat. In acest caz va trebui saparcurgem si sa verificam toate elementele din tablou. E ca sicum nu ar exista variabila gasit si am avea un ciclu pentru.
In cazul defavorabil parcurgem toate elementele, decicomplexitatea este proportionala cu lungimea tabloului, deciΘ(n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul mediu I
La cazult mediu, teoretic, ar trebuie sa luam toate cazurileposibile, sa numaram pentru fiecare caz cate operatii suntefectuate, si sa facem media. Dar acest lucru e imposibil ıngeneral.
Cazul mediu se calculeaza cu o formula:∑I∈D
P(I ) ∗ E (I )
D reprezinta domeniul problemei, adica toate datele de intrareposibile (pentru PozitieElement asta ınseamna toate tablourilede numere ıntregi cu n elemente).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul mediu II
I reprezinta un caz posibil pentru date de intrare (pentruPozitieElement cand vorbim de I nu ne gandim la un tablouconcret, ci la situatii posibile: tablou unde primul element estecel cautat, tablou unde al 2-lea element este cel cautat, ...,tablou unde ultimul element este cel cautat, tablou care nucontine elementul cautat)
P(I ) reprezinta probabilitatea sa avem ca data de intrare pe I .De cele mai multe ori probabilitatile sunt considerate egale,adica e la fel de probabil sa am tablou unde primul element ecel cautat ca situatia ın care elementul cautat e pe pozitia 2,etc.
E (I ) este numarul de operatii care vor fi efectuate pentrudatele de intrare I .
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul mediu III
Si acum sa vedem concret pentru functia PozitieElement:
Fixam lungimea tabloului la n.Pentru I exista urmatoarele posibilitati: tablou unde primulnumar e cel cautat, tablou unde al 2-lea numar este cel cautat,..., tablou unde ultimul element este cel cautat, tablou unde nuexista numarul cautat.Sunt ın total n + 1 situatii posibile, deci probabilitatea P(I )este 1
n+1 .Pentru a calcula valoarea E (I ) putem considera doar numarulde cate ori este executat ciclul cattimp, pentru fiecare I (ın locsa ıncercam sa calculam numarul exact de operatii).∑I∈D
P(I )∗E (I ) =1
n + 1∗1+
1
n + 1∗2+....+
1
n + 1∗n+
1
n + 1∗n =
1
n + 1∗(1+2+3+...+n+n) =
1
n + 1∗n ∗ (n + 1)
2+
n
n + 1= Θ(n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Cazul mediu IV
Am calculat ca avem:
Caz favorabil Θ(1)Caz defavorabil Θ(n)Caz mediu Θ(n)
Complexitatea totala este maximul dintre aceste valori, adican. Dar pentru a arata ca exista situatii cand complexitateaeste mai mica, vom folosi notatia O −mare. Daca toate cele3 valori erau la fel, atunci complexitatea totala era exprimatacu Θ.
Deci, complexitatea totala pentru functia PozitiePar esteO(n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de timp - Concluzii
Complexitatea unui algoritm depinde de marimea datelor deintrare.
Cateodata complexitatea depinde nu doar de marimea datelorde intrare ci si de valoarea lor exacta. In aceste situatii vorbimde caz favorabil, defavorabil si mediu.
Notatia Ω−mare nu prea este folosita ın practica
In general, preferam sa folosim notatia Θ−mare
Folosim notatia O −mare ın 2 situatii:
Nu pot exprima complexitatea cu Θ (nu pot calcula valoareaexacta), dar pot sa dau o limita superioaraAm caz favorabil, defavorabil si mediu, si aceste 3 cazuri aucomplexitati diferite
Daca folosim notatia O −mare, ıncercam sa estimam cat maiprecis valoarea complexitatii
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Formule utile
n∑i=0
1 = 1 + 1 + 1 + ... + 1 = n + 1
n∑i=0
i = 0 + 1 + 2 + 3 + ... + n =n ∗ (n + 1)
2
n∑i=0
i2 = 02 + 12 + 22 + 32 + ... + n2 =n ∗ (n + 1) ∗ (2n + 1)
6
n∑i=0
i3 = 03 + 13 + 23 + 33 + ... + n3 =n2 ∗ (n + 1)2
4
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Formule utile
n∑i=0
i4 = 04 + 14 + ... + n4 =n ∗ (n + 1) ∗ (2n + 1) ∗ (3n2 + 3n − 1)
30
n∑i=0
pi = 1 + p1 + p2 + ... + pn =pn+1 − 1
p − 1
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de spatiu I
Complexitatea de spatiu masoara spatiul de memorie de careare nevoie un algoritm pentru a stoca variabilele folosite peparcursul algoritmului. In general vorbim de complexitate despatiu extra, adica nu calculam spatiul ocupat de parametri,doar ceea ce trebuie ın plus.
Se folosesc aceleasi notatii ca ın cazul complexitatii de timp
De exemplu, complexitatea de spatiu pentru algoritmulPozitieElement este Θ(1) - tot timpul avem de retinul doar 3variabile (rezultat, gasit si index) indiferent de marimeatabloului.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Complexitatea de spatiu II
De multe ori exista un compromis ıntre complexitatea de timpsi spatiu: un algoritm cu o complexitate de timp mai buna,s-ar putea sa aiba complexitate de spatiu mai mare, decat unalt algoritm care are o complexitate de timp mai slaba.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static int sum(int n) int sum = 0;for (int i = 0; i < n; i++)
for (int j = 0; j < i ∗ i ; j++) sum = sum + 1;
return sum;
Obs: Nu trebuie sa ıntelegem ce face subalgoritmul pentru acalcula complexitatea.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Putem rescrie (aproape) orice ciclu for ca o suma:
n−1∑i=0
j<i2∑j=0
1 =n−1∑i=0
i2 =(n − 1) ∗ n ∗ (2n − 1)
6∈ Θ(n3)
Obs 1: Nu trebuie sa calculam expresia exacta, cand vedemcat va fi termenul de gradul maxim, ne putem opri cu calcule.
Obs 2: Doua cicluri for unul ın altul, nu ınseamna automatcomplexitate n2.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Putem rescrie (aproape) orice ciclu for ca o suma:
n−1∑i=0
j<i2∑j=0
1 =n−1∑i=0
i2 =(n − 1) ∗ n ∗ (2n − 1)
6∈ Θ(n3)
Obs 1: Nu trebuie sa calculam expresia exacta, cand vedemcat va fi termenul de gradul maxim, ne putem opri cu calcule.
Obs 2: Doua cicluri for unul ın altul, nu ınseamna automatcomplexitate n2.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static int sum(int n)int sum = 0;for (int i = 0; i < n; i++)
for (int j = 0; j < i ; j++) sum = sum + 1;
return sum;
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Daca ın ciclul for, variabila se incrementeaza cu 1, putemfolosi suma:
n−1∑i=0
i−1∑j=0
1 =n−1∑i=0
(i − 1) =n−1∑i=0
i −n−1∑i=0
1 =
=(n − 1) ∗ n
2− (n − 1) ∈ Θ(n2)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static int mistery(int n) int r = 0;
for (int i = 1; i <= n; i++) for (int j = i+1; j <= n; j++)
for (int k = i + j − 1; k <= n; k++) r = r + 1;
return r;
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
n∑i=1
n∑j=i+1
n∑k=i+j−1
1 =n∑
i=1
n∑j=i+1
(n − (i + j − 1) + 1) =
=n∑
i=1
n∑j=i+1
(n − i − j + 2) =
=n∑
i=1
n∑j=i+1
n −n∑
i=1
n∑j=i+1
i −n∑
i=1
n∑j=i+1
j +n∑
i=1
n∑j=i+1
2 =
Continuam separat cu cei 4 termeni, si la final, cand avem oexperisie pentru fiecare, revenim la expresia de aici
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple - Primul termen
n∑i=1
n∑j=i+1
n =n∑
i=1
(n − (i + 1) + 1) ∗ n =
=n∑
i=1
(n − i)n =n∑
i=1
(n2 − i ∗ n) =n∑
i=1
n2 −n∑
i=1
i ∗ n =
= n2 ∗ n − n ∗n∑
i=1
i = n3 − n ∗ n ∗ (n + 1)
2
=2 ∗ n3
2− n3 + n2
2=
n3 − n2
2
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple - Al 2-lea termen
n∑i=1
n∑j=i+1
i =n∑
i=1
(n − (i + 1) + 1) ∗ i =
=n∑
i=1
(n − i) ∗ i =n∑
i=1
n ∗ i −n∑
i=1
i2 =
= n∗n∑
i=1
i−n ∗ (n + 1) ∗ (2n + 1)
6= n∗n ∗ (n + 1)
2−(n2 + n) ∗ (2n + 1)
6=
=3n3 + 3n2
6− 2n3 + n2 + 2n2 + n
6=
n3 − n
6
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple - Al 3-lea termen
n∑i=1
n∑j=i+1
j =n∑
i=1
n ∗ (n + 1)
2− i ∗ (i + 1)
2=
n∑i=1
n2 + n − i2 − i
2=
1
2∗ (
n∑i=1
n2 +n∑
i=1
n −n∑
i=1
i2 −n∑
i=1
i) =
1
2∗ (n ∗ n2 + n ∗ n − n ∗ (n + 1) ∗ (2n + 1)
6− n ∗ (n + 1)
2) =
=1
2∗ (n3 + n2 − 2n3 + 3n2 + n
6− n2 + n
2) =
=1
2∗(6n3 + 6n2 − 2n3 − 3n2 − n − 3n2 − 3n
6) =
4n3 − 4n
12=
n3 − n
3
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple - Al 4-lea termen
n∑i=1
n∑j=i+1
2 =n∑
i=1
(n − (i + 1) + 1) ∗ 2 =n∑
i=1
2 ∗ (n − i) =
=n∑
i=1
2n −n∑
i=1
2 ∗ i = 2 ∗n∑
i=1
n − 2 ∗n∑
i=1
i =
= 2n2 − 2 ∗ n ∗ (n + 1)
2= 2n2 − n2 − n = n2 − n
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple - Inapoi la expresia anterioara
n3 − n2
2− n3 − n
6− n3 − n
3+ n2 − n =
=3n3 − 3n2 − n3 + n − 2n3 + 2n + 6n2 − 6n
6=
3n2 − 3n
6∈ Θ(n2)
Obs: In acest exemplu, termenul de gradul 3 (n3) dispare dinrezultat, deci doar faptul ca pe prima linie avem n3 nuınseamna automat ca vom avea complexitate Θ(n3).
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static void function(int n) for (int i = 1; i <= n/3; i++)
for (int j = 1; j <= n; j = j + 4) System.out.println(“*”);
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
In al doilea ciclu for, j nu se incrementeaza cu 1, deci nuputem scrie acel ciclu for sub forma unei sume.
In primul ciclu for, i merge de la 1, pana la n3 , si la fiecare pas
i creste cu 1. In total, ciclul se repeta de n3 ori.
In al doilea ciclu for, j merge de la 1, pana la n, si la fiecarepas creste cu 4. Valorile lui j vor fi:
1, 5, 9, 13, 17, 21, etc.
Daca j creste cu 1, ciclul se repeta de n ori. Daca j creste cu4, ciclul se repeta de n
4 ori.
Cele 2 cicluri fiind imbricate, ınmultim valorile. T (n) ∈ Θ(n2)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static void s1(n)for (int i = 1; i <= n; i++)
int j = n;while (j > 0)
j = j/2;System.out.println(“*”);
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Cand vedem ciclu while, trebuie sa verificam daca avem osituatie cand avem caz favorabil, defavorabil, mediu.
Aici nu avem caz favorabil, defavorabil si mediu, dar nici nuputem rescrie while ca o suma (La fiecare iteratie j se ımpartela 2, nu putem scrie acest lucru ca o suma).
Ciclul for se repeta de n ori.
Valoarea lui j tot timpul porneste de la n, si la fiecare iteratiese ınjumatateste.
Daca j e initial 100, vom avea: 100, 50, 25, 12, 6, 3, 1, 0Daca j e initial 500, vom avea: 500, 250, 125, 62, 31, 15, 7, 3,1, 0
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Numarul de iteratii pentru ciclul while este log2n (logbX ,arata de cate ori pot ımpartii ın mod repetat numarul X la bpana ajung la 0).
Complexitatea este: T (n) ∈ Θ(n ∗ log2n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static long factorial(int n) if (n <= 1)
return 1; else
return n * factorial (n-1);
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
factorial este functie recursiva (adica pentru a calculafactorial(n), trebuie sa calculam factorial(n-1).
La functii recursive, calculam altfel complexitatea decat lafunctii nerecursive.
Pornim de la relatia de recurenta (adica scriem valoarea luiT (n) ın functie de valoarea lui T (n − 1).
T (n) =
1 daca n <= 1
T(n-1) + 1 altfel
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Deocamdata ne ocupam de ramura recursiva
T (n) = T (n − 1) + 1
T (n − 1) = T (n − 2) + 1
T (n − 2) = T (n − 3) + 1
...
T (2) = T (1) + 1
Acum adunam toate aceste ecuatii. O mare parte dintretermeni (T (n − 1), T (n − 2), ... T (2)) apar si ın parteastanga si ın partea dreapta, deci se simplifica.
T (n) = T (1) + 1 + 1 + 1... + 1
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
T (1) este 1 (prima ramura din relatia recursiva)
Cate +1 avem?
Avem cate un +1 pentru fiecare ecuatie. Si avem ın totaln − 1 ecuatii.
T (n) = 1 + 1 + 1 + ... + 1 = n
Deci T (n) ∈ Θ(n)
Obs: La functii nerecursive, nu are importanta daca avem un+1 sau nu (pentru ca oricum avem ın general termeni maimari). La functii recursive trebuie sa avem acest termen, altfelnu vom avea rezultatul corect.
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static void recursiveFun4(int n, int m, int o) if (n<=0)
System.out.println(m + o); else
recursiveFun4(n-1, m+1, o);recursiveFun4(n-1, m, o+1);
Incepem din nou cu formula de recurenta
T (n) =
1 daca n <= 0
2*T(n-1) + 1 altfel
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static void recursiveFun4(int n, int m, int o) if (n<=0)
System.out.println(m + o); else
recursiveFun4(n-1, m+1, o);recursiveFun4(n-1, m, o+1);
Incepem din nou cu formula de recurenta
T (n) =
1 daca n <= 0
2*T(n-1) + 1 altfel
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
T (n) = 2 ∗ T (n − 1) + 1
Vrem din nou ca la final sa adunam ecuatiile, si vrem sadispara majoritatea termenelor. Pentru asta ne trebuie caacum sa scriem cat e 2 ∗ T (n − 1)
2 ∗ T (n − 1) = 22 ∗ T (n − 2) + 2
22 ∗ T (n − 2) = 23 ∗ T (n − 3) + 22
23 ∗ T (n − 3) = 24 ∗ T (n − 4) + 23
...
2n−2 ∗ T (2) = 2n−1 ∗ T (1) + 2n−2
2n−1 ∗ T (1) = 2n ∗ T (0) + 2n−1
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Adunam ecuatiile:
T (n) = 2n ∗ T (0) + 1 + 2 + 22 + 23 + ... + 2n−1
T (n) = 1 + 2 + 22 + 23 + ... + 2n−1 + 2n
T (n) =2n+1 − 1
2− 1∈ Θ(2n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static int recursiveFun5(int n) for (i = 0; i < n; i += 2)
// do somethingif (n <= 0)
return 1; else
return 1 + recursiveFun5(n/5);
T (n) =
1 daca n <= 0
T(n/5) + n altfel
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
public static int recursiveFun5(int n) for (i = 0; i < n; i += 2)
// do somethingif (n <= 0)
return 1; else
return 1 + recursiveFun5(n/5);
T (n) =
1 daca n <= 0
T(n/5) + n altfel
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Cand apelul recursiv se face pentru n ımpartit la un numar c ,ınainte de a ıncepe calculele, notam valoarea lui n ca fiind ck .
In cazul nostru, presupunem ca n = 5k
T (5k) = T (5k−1) + 5k
T (5k−1) = T (5k−2) + 5k−1
T (5k−2) = T (5k−3) + 5k−2
...
T (52) = T (51) + 52
T (51) = T (50) + 5
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE
Exemple
Adunam ecuatiile
T (5k) = T (1) + 5 + 52 + ... + 5k−2 + 5k−1 + 5k
T (5k) = 1 + 5 + ... + 5k−1 + 5k =5k+1 − 1
5− 1
5k ∗ 5− 1
4=
5n − 1
4∈ Θ(n)
Lect. dr. Onet - Marian Zsuzsanna PROGRAMARE SI STRUCTURI DE DATE