Sunteți pe pagina 1din 4

Universitatea Al. I.

Cuza, Iaşi Numele:


Facultatea de Informatică Grupa:

Proiectarea Algoritmilor - Test Scris (12 aprilie 2017), seriile B + E

Observaţ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ă. Descrieţi conceptele utilizate ı̂n
răspunsuri.
4. Algorimii vor fi descrişi ı̂n limbajul Alk (cel utilizat la curs).
5. Nu este permisă utilizarea de foi suplimentare.
6. Răspunsurile deosebite pot primi bonusuri.
7. Timp de răspuns: 1 oră.

1. (9p) Proiectare şi analiză, baza.


Un element-multiplu este o pereche formată dintr-un element x şi numărul de apariţii ale acestuia. O multi-
mulţime este o mulţime de elemente-multiple cu proprietatea că nu există două elemente-multiple care se referă
la acelaşi element x. Un element-multiplu apare ı̂ntr-o multi-mulţime S dacă numărul de apariţii ale elementul
curespunzător ı̂n S este mai mare sau egal cu cel din multi-elementul dat. De exemplu, a cu multiplicitatea
3 apare ı̂n S dacă şi numai dacă a apare ı̂n S cu multiplicitatea n ≥ 3. Se consideră problema determinării
apartenenţei unul element-multiplu la o multi-mulţime. Notăm această problemă cu INM.
(a) (2p) Să se formuleze INM ca pereche (input,output). Se vor da formulări cât mai precise şi riguroase.
Input. Un elelement-multiplu este reprezentat prin perechea (x, k), unde k reprezintă numărul de apariţii
ale lui x.
S = {(x0 , k0 ), . . . , (xn−1 , kn−1 )}, a = (y, k), a.ı̂. (∀i, j ∈ {0..n − 1})i 6= j =⇒ xi 6= xj .
Output.
true dacă a ∈ S, i.e. (∃i)0 ≤ i < n ∧ y == xi ∧ ni ≥ k,
false altfel, i.e. (∀i ∈ {0..n − 1}) ∧ y 6= xi ∨ ni < k.

(b) (3p) Să se scrie un algoritm determinist care rezolvă INM. Presupunem perechile reprezentate prin structuri
cu câmpurile x şi k, S reprezentată printr-o listă/tablou.
INM(S, a) {
for (i=0; i < S.size(); ++i)
if (S[i].n == a.n && S[i].k >= a.k) return true;
return false;
}
(c) (2p) Să justifice că algoritmul rezolvă corect problema.
Invariantul buclei for: (∀j ∈ {0..i − 1})z 6= xj ∨ nj < k (poate fi explicat şi ı̂n cuvinte).
Funcţia ı̂ntoarce true numai dacă S[i].n == a.n && S[i].k >= a.k, adică a ∈ S.
Funcţia ı̂ntoarce false numai dacă execuţia instrucţiunii for se termină normal, caz ı̂n care i = S .size() şi
care ı̂mpreună cu invariantul asigură că a 6∈ S.
(d) (2p) Să se calculeze complexitatea ı̂n cazul cel mai nefavorabil.
Dimensiunea unei instanţe.
n = S .size()
Operaţii numărate.
Comparaţii de elemente-multiple.
Cazul cel mai nefavorabil.
Când a nu apare ı̂n S (bucla for se execuă complet).
Timpul pentru cazul cel mai nefavorabil.
Bucla for se execută de n ori şi la fiecare iteraţie se execută exact o comparaţie.
Timpul = n = O(n).

1
2. (9p) Algoritmi probabilişti, complexitate medie.
Se consideră următorul algoritm probabilist, descris informal, care determină minimul dintr-un tablou:
minim(a, n)
1. Se iniţializează min cu o valoare foarte mare (notată cu ∞);
2. elementele tabloului a sunt alese pe rând aleatoriu, utilizând o distribuţie uniformă, şi pentru fiecare element
a[i] ales
2.1. dacă a[i] < min atunci atribuie a[i] lui min (∗).
(a) (3p) Să se descrie ı̂n Alk algoritmul. Se poate considera o funcţie uniform(S), care ı̂ntoarce un element
ales aleatoriu uniform din S (de exemplu, S poate fi o mulţime de indici ı̂n tablou).
minim(a,n) {
min = ∞;
S = { 0 .. n };
while (n > 0) {
i = uniform(S);
S = S \ singletonSet(i);
if (a[i] < min) min = a[i];
n = S.size();
}
}
Se putea scrie şi un program care mai ı̂ntâi să pemute aleatoriu elementele tabloului a.
(b) Să se calculeze probabilităţile ca algoritmul să execute atribuirea (∗)
i. (1p) ı̂n n-a iteraţie:
Fie i1 , i2 , . . . , in secvenţa de indici aleşi aleatoriu.
În acest caz avem a[in ] elementul minim din a, iar celelalte elemente pot fi ı̂n orice ordine.
Echivalent, daca tabloul a este permutat aleatoriu şi apoi minimul căutat secvenţial, atunci minimuml
apare pe poziţia n − 1 ı̂n tabloul permutat.
(n − 1)! 1
Rezultă pn = = .
n! n
ii. (1p) ı̂n a (n − 1)-a iteraţie:
a[in−1 ] trebuie să fie cel mai mic din a[i1 ..in−1 ].
Echivalent, daca tabloul a este permutat aleatoriu şi apoi minimul căutat secvenţial, atunci elementul
de pe poziţia n − 2 este mai mic decât cele din faţa lui ı̂n tabloul permutat.
(n − 2)! 1
Rezultă pn−1 = = .
(n − 1)! n−1
iii. (2p) ı̂n a i-a iteraţie, 1 ≤ i ≤ n:
Raţionând la fel ca ı̂n cazul precedent, obţinem
(i − 1)! 1
pi = =
i! i
Justificaţi rezultatul ı̂n fiecare caz.
Hint. O descriere echivalentă a algoritmului constă ı̂n generarea unei permutări aleatorii uniforme a tabloului
şi apoi explorarea secvenţială a permutării. Această idee poate fi utilizată la partea de analiză.
(c) (2p) Să se exprime ca o sumă numărul mediu de execuţii ale atribuirii (∗).
Fie A variabila aleatoare care ı̂ntoarce numărul de atribuiri ale unei execuţii (= eveniment). Numărul
mediu de execuţii ale atribuirii (∗) este
Pn 1 1 1
M (A) = i=1 1 · pi = 1 + + · · · + + .
2 n−1 n
Echivalent, dacă Xi P este variabila aleatorie care ia valorea 1 dacă (∗) se execută la iteraţia i şi 0 altfel,
m
aunci Deoarece Pm A = PXmi , numărul mediu
i=1 Pm de execuţii ale atribuirii (∗) este
M (A) = M ( i=1 Xi ) = i=1 M (Xi ) = i=1 pi = . . ..

2
3. (9p) Geometrie computaţională.
(a) (3p) Să se scrie ı̂n Alk un algoritm care determină ı̂nfăşurătoarea convexă a unei linii poligonale simple.
Complexitatea algoritmului trebuie să fie O(n). Se presupune că primul element din listă este cel mai de
jos-dreapta.
Presupunem că lista poligonală este reprezentată de lista P . Dacă linia este deschisă, atunci o transformăm
ı̂ntr-o linie poligonală simplă ı̂nchisă. Apoi ı̂nfăşurătoarea convexă se se obţine doar cu scanarea Graham:
CHLPS(P) {
n = P.size();
if (P[0] != P[n-1]) {
P[n] = P[0];
n = n+1;
}
L[0] = P[0]; L[1] = P[1]; k = 2;
for (i = 2; i < n; ++i) {
while (ccw(L[k - 2], L[k - 1], P[i]) < 0) {
--k; // "sterge" ultimul element din L
}
L[k] = P[i];
++k;
}
return L;
}
(b) (2p) Exemplificaţi execuţia algoritmului pe un exemplu.

Omis.

(c) (2p) Să se justifice corectitudinea algoritmului.


Justificarea de la scanarea Graham:
Invariant for: Toate punctele din linia P se află ı̂n stânga liniei poligonale convexe L[0..k − 1]
La sfârşit L devine poligon convex şi toate punctele din P se afă pe L sau ı̂n interior (care e ı̂n stânga
mergând ı̂n sensul invers arcelor de ceasornic).
(d) (2p) Să se arate ca ı̂ntr-adevăr complexitatea este O(n).
Numarul de puncte din L[0..k − 1] ∪ P [i..n − 1] scade cu o unitate la fiecare iteraţie for + while.

3
Ciornă

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