Sunteți pe pagina 1din 8

AA - Tema 1

Punctaj
:Punctajultotalcumulataltaskurilordintemaeste10p.
Datapublicare
:30.10.2015
Termenpredare
:13.11.2015,ora23.55(deadlinehard)
Responsabilitema
:GeorgianaCiocirdel,LoredanaGroza,DavidIancu

(4p) Problema 1 - Warm up


Pentruurmatoarele3probleme,scrietirezolvarileinREADME.

(1.2p) Clase de complexitate


Aratatica T (n) = 5 * n * log2n + 500 * n = (n)siO(n1+), > 0 .

(1.2p) Rezolvarea unei recurente


Gasiticlasadecomplexitatepentru T (n) = 4 * T (n/4) + 4 ,presupunandca T (1) = 1 .

(1.6p) Gasirea si rezolvarea unei recurente


Fieurmatoareasecventadepseudocod,careinverseazaunsirdecaractere:

reverse(s) {
n = lungime(s)
daca n <= 1 {
intoarce s;
} altfel {
intoarce concat(reverse(substring(s, n/2, n)),
reverse(substring(s, 0, n/2)));
}
}

Seconsideracaatatvaloareadereturn,catsiparametrulfunctieisuntsiruridecaractere.

Gasiti o recurenta de complexitatepentrufunctia


reverse
,considerandcasuntnecesari j i
pasi pentru a forma un substring intre indicii i si j 1 si ca pentru un sir de caractere
primit/intors de functie se retine implicit,ininteriorulsirului,lungimeasa (decinuestenecesara
parcurgerea sirului in momentul apelului metodei lungime ). De asemenea, concat sevaevalua
intimpconstant.

Dupa ce ati gasit functia, aplicati una dintre cele patru metode predatelacurs(iterativa,arbore
derecurenta,substitutiesauMaster)pentruadeterminaclasadecomplexitate.

(6p) Problema 2 - Introducere in Programare Dinamica


Programarea dinamica este o metoda de a rezolva probleme complexe, prin spargerea lor in
subprobleme echivalente, metoda care produce complexitati scazute fata de alti algoritmi,
atuncicandesteaplicatacorect.

Tiparul general al unui algoritmdeprogramaredinamicaararataastfel(


criteriu_de_optim
reprezinta un criteriu pe care va trebui sa il satisfaca solutia problemei, pentru a fi considerata
optima):

algoritm_programare_dinamica(criteriu_de_optim, Problema) {
// Fie Problema_0, Problema_1, , Problema_n subprobleme ale
// Problemei transmise ca parametru. Subproblemele se pot
// suprapune (in sensul ca solutia unei probleme P_i participa
// in procesul de constructie a solutiei problemei P_i+1), dar
// sunt similare si scad in complexitate:
// Problema_n mai putin complexa decat Problema, , Problema_1
// mai putin complexa decat Problema_2. Problema_0 este cel mai
// putin complexa si va contribui la solutia initiala.
Solutii = solutii_initiale(criteriu_de_optim, Problema_0)
pentru fiecare problema i
// Se construieste solutia problemei Problema_i cu
// ajutorul solutiilor problemelor Problema_0,
// Problema_1 Problema_(i-1).
Solutie_i = solutii(
Solutii, criteriu_de_optim, Problema_i)
Solutie = Solutie Solutie_i
// La final, se selecteaza sau se reconstruieste solutia finala
// din multimea totala de solutii.
Solutie_finala = solutie_pentru_Problema(Solutii)
intoarce Solutie_finala
Pentru a doua problema a temei, va trebui sa gasiti lungimea
celei mai lungi subsecvente
comun
edintredouasecventedecaracteresisarezolvatitaskurileprezentatemaijos.

Cateva definitii

o
secventa
reprezintaocolectieordonatadeelemente[
a
i]

o
subsecventa reprezinta o
secventa initiala, din care se omit elemente de pe anumite
pozitiisicare,totusi,pastreazaordineainitialarelativaaelementelor
secventei

un
prefix
delungime
k
reprezintaprimele
k
elementealeuneisecvente.


Exemple:
S1 = [1, 2, 3, 4, 5] esteosecventa
S2 = [2, 2, 2, 2, 2] esteosecventa

S1 = [1, 4, 5] esteosubsecventaalui S1
S1 = [1, 2, 3] esteprefixuldelungime k = 3 asecventei S1
[] esteprefixuldelungime 0 altuturorsecventelordemaisus

Algoritmul de programare dinamica


Vomexplicaalgoritmuldeprogramaredinamicapentruexemplulurmator:
Sapresupunemcaavemdouasecvente,
A = [A, B, 1, 2, C, 0, 9, D, F ] si
B = [3, B, 5, A, 4, D, F , 10]
Ceamailungasubsecventacomuna,pentrucazulacestaeste:
[B, D, F ] sau [A, D, F ] siarelungimea3.

Algoritmuldeprogramaredinamicadescrisincontinuarerezolvaproblemapentruexempluldat:
Initial, inainte de a aplica orice algoritm, cea mai lunga subsecventa are lungimea 0 si
estesecventavida []
Consideram, pe rand, elementele A[i] si B[j] , unde i si j vorluavaloridela1,panala
lungimeasecventelor A ,respectiv B
Pentru un i si j oarecare, fie A[i] = B[j] , fie A[i] =/ B[j] . Deci vom avea doua cazuri
cetrebuiesctratateseparat
In primul caz ( A[i] = B[j] ), cea mai lunga subsecventa dintre prefixul de lungime i al
secventei A si prefixul de lungime j al secventei B va avea lungimea cu 1 mai mare
decat cea mai lunga subsecventa dintre prefixul de lungime (i 1) al secventei A si
prefixuldelungime (j 1) alsecventei B
In caz contrar ( A[i] =/ B[j] ), nu am gasit o subsecventa mai lunga decat a prefixelor
anterioare ( (i 1) si (j 1) ). Cea mai lunga subsecventa pana la pasul (A[i], B[j]) va
fi maximul dintre cele mai lungi subsecvente descoperite la pasii (A[i 1], B[j]) sau
(A[i], B[j 1]) ,pecareiamparcursinaintesaajungemlapasulcurent.

Sacombinamacestalgoritmsiceldeprogramaredinamicagenerala:

criteriu_de_optim = cea mai lunga subsecventa


algoritm_programare_dinamica(criteriu_de_optim, Sirul A, Sirul B) {
// Initial, cea mai lunga subsecventa este subsecventa []
// (vida), care are lungimea 0.
Solutii = {0}
pentru i si j intre 1 si lungimea sirului A, respectiv B
daca A[i] = B[j]

Solutie_ij = 1 + Solutie_(i-1)(j-1)
altfel
Solutie_ij = max (Solutie_i(j-1), Solutie_(i-1)j)
Solutie = Solutie Solutie_ij // pentru a o folosi la
// urmatoarea iteratie
// La final, vom alege cea mai lunga subsecventa obtinuta la
// pasul i = lungime A si j = lungime B, pentru ca ia in
// considerare solutiile tuturor subproblemele ce se pot forma
// din subsiruri ale sirurilor A si B.
Solutie_finala = Solutie_(lungime A)(lungime B)
intoarce Solutie_finala

Folosind acest algoritm, putem, deci, gasi o recurenta care sa descrie problema in functie de
subproblemesimilare.

(2p) Task 1 - Un alt algoritm


Descrieti in README un algoritm bruteforce sau recursiv pentru problema data, rezolvand
urmatoarelecerinte:
a. (0.6p)Scrietipseudocodulpentrualgoritmulgasitdevoi.
b. (0.6p) Explicati, pe scurtcumrezolvaalgoritmuldatdevoiproblemaanterioara,utilizand
un exemplu si aratand pas cu pas ce seintampla.(Atentie:Limitativa launexemplude
celmult6elementepentrufiecaresecventa)
c. (0.8p) Specificati complexitatea algoritmului vostru si explicati pe scurt cum ati ajuns la
aceastacomplexitate.Putetiadaugaoricedemonstratiedoriti,dacavaesteutila.

(2p) Task 2 - Inapoi la algoritmul de programare dinamica


TotinREADME,rezolvatiurmatoarelecerinte:
a. (0.4p) Recititi algoritmul de programare dinamica descris anterior. Ce fel de tablou
(matrice/vector/tablou tridimensional ...) ati folosi pentru a rezolva problema ? Nu este
necesar sa optimizati spatiul folosit. Notati dimensiunea/dimensiunile in functie de
numarul de elemente din cele doua secvente intiale. (Atentie: Considerati un numar de
elementegeneric)
b. (0.4p) Folosindtablouldefinitanterior(lapunctula),specificatiinREADMEorelatieintre
elementele tabloului, pe baza algoritmului de programare dinamica, care rezolva
problemagasiriilungimiiceleimailungisubsecventecomune.
c. (0.4p)Specificaticomplexitateaalgoritmuluisiexplicatipescurtdeceesteceanotata.
d. (0.4p) Scrieti pseudocodul pentru acest algoritm (folosind tabloul si relatia definite de
voi).
e. (0.4p) Folosind tabloul de la punctul (a) si relatia gasita la punctul (b), gasiti lungimea
celeimailungisubsecventedintresecventeledemaijos.Desenatipascupastabloul.

A = [A, B, G, I, 0, 14, O, O, P , H, 0]
B = [A, I, 0, 14, U, V , Z, 0, P , P , P ]

(2p) Task 3 - In cele din urma, un pic de cod


PentruacesttaskvatrebuisascrietiunprogramCsisarezolvatiurmatoarelecerinte:
a. (1p, 0.5p/algoritm) Implementati algoritmul de programare dinamica si algoritmul
bruteforcesaurecursivpecarelatigasitanterior(infunctiiseparate).
b. (0.2p) Implementati o functie care genereaza unvector delungimetrimisacaparametru
sicuelementealeatorii(potfideoricetipdoritivoi).
c. (0.2p) Implementati o functie care sa testeze ca cele doua metode de la punctul (a)
functioneaza corect pentru un exemplu de doi vectori alesi de voi: functiile vortrebuisa
intoarca de fiecare data acelasi rezultat. Alegeti o lungime diferita pentru cele doua
exemple de siruri (incercati sa alegeti un vector de lungimemaimicasiunuldelungime
mai mare). Atentie:Nualegetilungimimaimaride20.Infunctia
mainapelatimetodade
verificareanterioarasiasigurativacaatiimplementatcorectceledouametode.
d. (0.1p) Notati in README vectorii alesi si rezultatele intoarse de functii (adica lungimea
celeimailungisubsecventecomune).
e. (0.3p) Tot in
main
, generati doi vectori (cu metoda de la punctul b). Pentru fiecare
algoritm
masurati timpul de executie al fiecarui apel de functie. Va trebui sa obtinetidoi
timpi: unul pentru algoritmul de programare dinamica si unul pentru algoritmul clasic.
Variati dimensiunile celor doi vectori. La un moment dat, veti observa ca incepeti sa
asteptatipreamultpanasaobtinetiunrezultat.Putetisavaopriti.
f. (0.2p) Notati in README dimensiunile la care vati oprit din testat, precum si timpii de
executiepentrucatevadintredimensiunilealesedevoi.Notatiintruntabeldeforma:

dimensiunevector1x
dimensiunevector2

Timpdeexecutiealgoritm
programaredinamica

Timpdeexecutiealgoritm
recursiv/bruteforce

In prima coloana treceti dimensiunea primului vector generat x dimensiunea celui deal doilea
vector (ex: |vect 1| = 10, |vect 2| = 2 => veti trece intabel10x2).Adouasiatreiacoloanavor
contine timpul de executie necesari pentru algoritmul de programare dinamica si, respectiv,
pentrucelrecursiv.

Ordonati tabelul dupa dimensiunea totala a tabloului folosit pentru algoritmul de programare
dinamica.

Descrieti in README, pe scurt, cum variaza timpul de executie al algoritmului recursiv /


bruteforcefatadeceldeprogramaredinamicasidece.

Observatii:

Rezolvati acest task in cate fisiere C doriti (puteti adaugaheaderesaunu,estelalibera


voastraalegere),darscrietisiunfisier
Makefile
care:
i. lacomanda
build
vageneraunexecutabilcunumele
aa-tema1-2

ii. lacomanda
clean
vastergeexecutabilulsioricealtfisiergeneratlacompilare
iii. lacomanda
run
varulaexecutabilulobtinut:
1.
lasati in functia main apelurile catre cele doua functii de gasire a
subsecventeicomunemaxime
2.
vectoriigeneratiicudimensiunimici(sub10fiecare)
3.
lasatiapelulcatrefunctiacareverificadacaceledouafunctiiintorcacelasi
rezultatsiscrietilaconsolaunmesajcorespunzator.
Toate fisierele sursa, precum si Makefileul vor trebui semnate cu numele si grupa
voastrapeprimulrandalfisierului
AdaugatitoatesurselesiMakefileulintrunfolderdenumit
aa-tema1-2
.

Precizari generale pentru trimiterea temei

Cumsetrimitetema?
Creati o arhiva cu denumirea
nume_prenume_grupa.zip
. De exemplu,
studentul Ana Popescu de la grupa 327CF va crea arhiva
popescu_ana_327CF.zip.
Arhivatrebuiesafie
zip
.
Incarcatiarhivape
cs.curs.pub.ro
.
Cetrebuiesacontinaarhiva?
Un fisier README format
PDF
, care sa fie semnatcu
nume
,
prenumesi
grupa
si sa contina raspunsul la intrebarile si cerintele din enunt. Pentru redactarea
fisierului
PDF
, puteti utiliza, de exemplu, LaTeX sau orice procesor de
documente pentru desktop sau online si in care sa puteti edita ecuatii (exemple
arfi:GoogleDocs,LibreOfficeWriter,MicrosoftWord).
Folderul
aa-tema1-2
, care sa contina sursele si fisierele Makefile cerute la
taskul(2).

Punctare
Punctajul
complet pe fiecare task se acorda doar daca taskul a fost
completsi
corectrezolvat.
Amnotatindreptulfiecaruiexercitiupunctajulsau.Sevaacordasipunctaj
partial
petask:
pentru taskuri incare nusecererezolvarein README,sepoateacordapunctaj partial,
infunctiedecatdemultdintasksarezolvat
pentru taskuri in care se cere cod C, in cazul in care fisierele sursanucompileazasau
nu ruleaza corect (conform specificatiilor din enunt), punctajul maxim pe task va deveni
70% din punctajul maxim specificat anterior si se vaacordapunctajpartial,in functiede
catdemultdintaskafostrezolvat.

De asemenea, nerespectarea indicatiilor legate de organizarea codului in foldere, absenta


fisierelor Makefile sau reguli gresite in fisierele Makefile vor insemna un cod care nu
functioneaza si, prin urmare, se vor aplica regulile de notare mentionate in paragraful anterior.
Noi ne vom uita si pe surse, dar nu este obligatorie structurarea codului (in fisierele .c) intrun
modsaualtul,intrucatnuacestaestescopultemeicurente.

Nu in ultimul rand, temelecopiate(sursasau fisierPDF)vorfipunctate cu0,atatsursa/sursele,


catsidestinatia/destinatiile.

Changelog
Enunt problema 2:
Pentru
prima problema a temei, va trebui sa gasiti
cea mai lunga
subsecventa comuna dintre doua secvente de caractere si sa rezolvati task
urile prezentate
mai jos. =>
Pentru
a doua problema a temei, va trebui sa gasiti
lungimea
celei mai lungi
subsecvente comun
e dintre doua secvente de caractere si sa rezolvati taskurile prezentate
maijos.

Problema 2, Task 1:
Descrieti in README un algoritm brute
force sau recursiv
(deci nu cel
dinamic) pentru problema data, rezolvand urmatoarele cerinte
=>
Descrieti in README un
algoritm bruteforce sau recursiv pentru problemadata,rezolvandurmatoarelecerinte
(asadar,
puteti gasi un algoritm bruteforce sau va puteti folosi de ideea algoritmului de programare
dinamicasisaconstruitiunalgoritmrecursiv).

Problema 2, Task 2b:


Folosind tabloul definit anterior (la punctul a), specificati in README
functia de recurenta pentru algoritmul de programare dinamica care rezolva problema
celor mai lungi subsecvente
.
=>
Folosind tabloul definit anterior (la punctul a), specificatiin
README
o relatie intre elementele tabloului, pe baza algoritmului de programare
dinamica
,carerezolvaproblema
gasiriilungimiiceleimailungisubsecventecomune

Problema 2, Task 2d:


Scrieti pseudocodul pentru acest algoritm (folosind tabloul si
functiade
recurenta definite de voi)
=>
Scrieti pseudocodul pentru acest algoritm (folosind tabloul si
relatia
definitedevoi)

Problema 2, Task 2e:


Folosindtabloul delapunctul (a)si
recurentagasitalapunctul(b),gasiti
cea mailungasubsecventadintresecventeledemaijos
=>
Folosindtablouldelapunctul(a)
si
relatia gasita la punctul (b), gasiti
lungimea celei mai lungisubsecventedintresecventele
demaijos

Problema 2, Task3c:
Implementatiofunctiecaresatestezecaceledouametodedelapunctul
(a) si (b) functioneaza corect pe
doua exemple alese de voi: functiile vortrebuisaintoarcade
fiecare data acelasi rezultat
=>
Implementatiofunctiecaresatestezecaceledoua metodede
la punctul
(a) functioneaza corect
pentru un exemplu de doi vectori alesi de voi:functiilevor
trebuisaintoarcadefiecaredataacelasirezultat


Precizari generale pentru trimiterea temei:
Un fisier README format PDF, care sa fie semnat
cu nume, prenume si grupa si sa contina raspunsullaintrebarilesicerinteledinenunt,
precum
si graficul cerut in cerinta (2.2f)
=>
Un fisier README format PDF, care sa fie semnat cu
nume,prenumesigrupasisacontinaraspunsullaintrebarilesicerinteledinenunt.

Problema 2, Task 3b:


Implementati o functie care genereaza un vector
de numere intregi de
lungime trimisa ca parametru si cu elemente aleatorii (pot fi de orice tip).
=>
Implementati o
functie care genereazaunvectordelungimetrimisacaparametrusicuelementealeatorii(potfi
deoricetip
doritivoi
)

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