Sunteți pe pagina 1din 4

Universitatea Alexandru Ioan Cuza, Ias, i Numele:

Facultatea de Informatică Grupa:

Proiectarea Algoritmilor - Test Scris Săptămâna 16


Observat, ii:
1. Nu este permisă consultarea bibliografiei.
2. Toate ı̂ntrebările sunt obligatorii.
3. Fiecare ı̂ntrebare/item este notată cu un număr de puncte indicat ı̂n paranteză.
4. Algoritmii vor fi descris, i ı̂n limbajul Alk (cel utilizat la curs). În formularea solut, iilor se vor utiliza definit, iile s, i
notat, iile predate la curs. Descriet, i conceptele utilizate ı̂n răspunsuri.
5. Nu este permisă utilizarea de foi suplimentare.
6. Timp de răspuns: 1 oră.
7. Specificat, ii criterii: FP: correct formulation of problems; AD: algorithm design;
AA: algorithm analysis, complexity; PD: using algorithmic paradigms.
Evaluarea unui criteriu se face prin considerarea tuturor punctelor relevante pentru acesta.
1. (15p) Algoritmul KMP.
(a) (5p, AD) Fie pattern-ul P = ABABACABA.
Algoritmul pentru preprocesarea pattern-ului a calculat valorile funct, iei es, ec de la pozit, iile 0 până la 4 s, i
este pe punctul de a calcula f[5]:
i 0 1 2 3 4 5 6 7 8
P[i] A B A B A C A B A
f[i] 0 0 1 2 3 ? ? ? ?
Completat, i indicii ı̂n afirmat, ia de mai jos:
Pentru a calcula f[5], algoritmul compară, ı̂n această ordine:
i. P[5] cu P[3],
ii. P[5] cu P[1],
iii. P[5] cu P[0].
Justificat, i: Algoritmul ı̂ncearcă extinderea frontierei ABA, apoi A, apoi a frontierei vide.
(b) (5p, AA) Fie pattern-ul P = AAABAAA (funct, ia es, ec asociată este 0 1 2 0 1 2 3).
Fie text-ul T = AABAAABAAAA. Algoritmul KMP verifică actualmente dacă pattern-ul apare ı̂ncepând cu
pozit, ia i = 0 ı̂n text s, i a verificat deja că primele k = 2 caractere se potrivesc. Următorul caracter nu se
potrives, te.
Completat, i indicii ı̂n afirmat, ia de mai jos: Algoritmul avansează ı̂n starea i = 1 s, i k = 1. Justificat, i:
Frontiera este A. Se aliniază frontieră, vazută ca prefix al patternului, cu sufixul corespunzător din text.
i
v
AABAAABAAAA
=
AAABAAA
^
k
(c) (5p, AA) Fie pattern-ul P = AAABAAA (funct, ia es, ec asociată este 0 1 2 0 1 2 3).
Fie text-ul T = ABCAAABAABXXXXX. Algoritmul KMP verifică actualmente dacă pattern-ul apare ı̂ncepând
cu pozit, ia i = 3 ı̂n text s, i a verificat deja că primele k = 6 caractere se potrivesc. Următorul caracter nu
se potrives, te.
Completat, i indicii ı̂n afirmat, ia de mai jos: Algoritmul avansează ı̂n starea i = 7 s, i k = 2. Justificat, i:
Frontiera este AA.
i
v
ABCAAABAABXXXXX
==
AAABAAA
^
k

1
2. (13p) Drum crescător maximal. Fie următoarea descriere informală a unei probleme:
Pentru o matrice A cu numere ı̂ntegi de dimnesiune N ×M , determinat, i lungimea celui mai lung drum ce cont, ine
elemente ale matricii cu valori ı̂n ordine strict crescătoare. Primul element al unui drum este cel de pe prima
linie s, i prima coloană, iar orice alt element este fie cel de sub elementul anterior fie cel din dreapta (la fiecare
pas cres, te numărul liniei sau al coloanei). Lungimea unui drum este numărul de elemente pe care le cont, ine.
(a) (3p, FP) Descriet, i formal problema ca pereche (input, output) cu specificat, ii cât mai precise.
Input: N, M - numere naturale pozitive s, i A[1..N][1..M] cu numere ı̂ntregi
Output: k, astfel ı̂ncât ∃(l1 , c1 ), (l2 , c2 ) . . . (lk , ck ) cu: (l1 , c1 ) = (1, 1) s, i li ∈ 1, N ; ci ∈ 1, M ∀i ∈ 1, k s, i
(li , ci ) ∈ {(li−1 + 1, ci−1 ), (li−1 , ci−1 + 1)} ∀i ∈ 2, k s, i
k este cel mai mare număr cu această proprietate.
(b) (4p, AD, PD) Scriet, i relat, ia de recurent, ă pentru următoarea matrice care poate fi calculată pentru a
rezolva problema folosind paradigma Programare Dinamică. Specificat, i s, i cazurile de bază, ordinea de par-
curgere a subproblemelor s, i unde se găses, te răspunsul final.
len[i][j] = lungimea celui mai lung drum valid ce pleacă din (1,1) s, i ajunge la (i,j) sau 0 dacă nu există.
len[i][j] reprezintă răspunsul pentru subproblema asociată submatricii A[1..i][1..j].

len[1][j] = j, dacă A[1][1] < A[1][2] < ... < A[1][j] s, i 0 altfel (sau len[i][j] = 0, pt i = 0 sau j = 0)
len[i][1] = i, dacă A[i][1] < A[i][2] < ... < A[i][j] s, i 0 altfel
len[i][j] = i+j-1, dacă (A[i-1][j]<A[i][j] s, i len[i-1][j] > 0) sau (A[i][j-1]<A[i][j] s, i len[i][j-1] > 0)
0, altfel. pt. 1 < i ≤ N s, i 1 < j ≤ M.
Răspunsul este valoarea maximă din matricea len[1..N ][1..M ].
(c) (3p, AD, PD) Descriet, i cum se poate modifica algorimul astfel ı̂ncât să calculeze eficient s, i numărul total de
drumuri crescătoare maximale. Două drumuri sunt considerate distincte dacă au coordonate (line, coloană)
diferite pentru măcar un element de pe aceeasi pozit, ie din drum.
Se adaugă matricea paths[i][j] = numărul de drumuri distincte ce ajung ı̂n (i, j) dacă len[i][j] 6= 0.
Dacă ambele condit, ii din relat, ia de recurenta se ı̂ndeplinesc, paths[i][j] = paths[i − 1][j] + paths[i][j − 1].
Dacă doar una se ı̂ndeplines, te atunci se preia valoarea paths[][] respectivă din stânga sau deasupra.
Dacă len[i][j] = 0, atunci s, i paths[i][j] = 0.
La final, se adună toate valorile paths[i][j] pentru care len[i][j] e maxim.
(d) (3p, AD) Găsit, i o matrice A pentru care drumul crescător maximal cont, ine 3 elemente s, i există 4 = 22
drumuri crescătoare maximale. Specificat, i dimensiunea s, i valorile matricii s, i cele 4 drumuri.
A[3][3] cele 4 drumuri (^ ın general, valorile nu trebuie să fie distincte):
1 2 3 (1): 1, 2, 3 (2): 1, 2, 5
4 5 0 (3): 1, 4, 5 (4): 1, 4, 6
6 0 0

2
3. (12p) Selectarea activitat, ilor
În problema selectării activitat, ilor (inverval scheduling) cunoas, tem o mut, ime activităt, i specificate prin timpul
de ı̂nceput s, i sfârs, it al acestora. Problema cere determinarea cardinalului maxim al unei submult, imi de activtăt, i
astfel ı̂ncât nu există două activitat, i dintre acestea care să se suprapună.
(a) (3p, FP) Descriet, i formal problema ca pereche (input, output) cu specificat, ii cât mai precise.
Input: n, s[0 . . . n-1], f[0. . . n-1] - natural numbers: start and finish times of n activities, with  
s[i] < f [i], ∀ i ∈ 0, n-1. Activity i starts at s[i], ends right before f [i], so it takes s[i], f [i]
Output: A ⊆ {0, . .. , n-1}  maximum  cardinality set of activities such that:
s[i], f [i] ∩ s[j], f [j] = ∅, ∀ i 6= j ∈ A

(b) (3p, AD, PD) O strategie greedy care produce ı̂ntotdeauna o solut, ie optimă este să alegem la fiecare
pas activitatea care se termină prima, dintre activităt, ile rămase. O altă strategie similară este să alegem
activitatea care ı̂ncepe ultima. Arătat, i că pentru orice date de intrare, există ı̂ntotdeauna cel put, in o solut, ie
optimă care cont, ine activitatea care ı̂ncepe ultima.
Fie last activitatea cu cel mai târziu timp de ı̂nceput: s[last] = maxim global. Pentru orice solut, ie optimă
OP T avem fie last ∈ OP T s, i atunci cerint, a e adevărată, fie ∃ lastopt 6= last activitatea care ı̂ncepe ultima
din OP T . Submult, imea OP T \ lastopt ∪ last are:

i. aceelas, i număr de activitat, i ca si OP T ;


ii. oricare două activitat, i din OP T nu se suprapun ı̂ntre ele (OP T este validă)
iii. orice activitate a ∈ OP T \ lastopt are f [a] < s[lastopt ] (din validitatea solut, iei OP T ) dar
s[lastopt ] < s[last] deoarece last e activitatea cu cel mai tarziu timp de ı̂nceput global ⇒ f [a] < s[last]
⇒ activităt, ile din OP T \ lastopt nu se suprapun cu last.
iv. din ii. s, i iii. ⇒ OP T \ lastopt ∪ last este o solut, ie validă s, i din i. optimă. q.e.d. deoarece contine last.
(c) (3p, AA) Care este complexitatea timp a algoritmului de mai jos, ce implementeaza a doua strategie
descrisă? Argumentat, i.
sortActivities(); // descending by start time
nrAct = []; // indices of selected activities
start = 0; // start time of the latest-starting chosen activity
for (i = 0; i < n; i++) {
if (f[i] <= start) {
nrAct.pushBack(i); // include activity i
start = s[i]; // from time "start" mark as busy
}
}
Complexitatea sortării depinde de metoda de sortare, e.g. bubble sort O(N 2 ), merge sort O(N logN ).
După sortare, complexitatea este O(N ), deci complexitatea per ansamblu este dată de sortare.
(d) (3p, PD) Găsit, i un exemplu pentru care solut, ia optimă cont, ine 3 activităt, i, iar submult, imile returnate de
cele două strategii descrise la subpunctul (b) nu au nicio activitate ı̂n comun.
|-----| |-----| |-----| <- activităt, ile selectate de prima strategie
|-----| |-----| |-----| <- activitătile selectate de a doua strategie
1 2 3 4 5 6 7 8 9 1011 12 <- putem stabili s, i numere capete de interval:
[1, 3] [2, 4] [5, 7] [6, 8] [9, 11] [10, 12]

3
Ciornă

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