Sunteți pe pagina 1din 4

Universitatea Alexandru Ioan Cuza, Iaşi Numele:

Facultatea de Informatică Grupa:

Proiectarea Algoritmilor - Exemple de probleme date la test

1. (7p) Căutare peste s, iruri. Context: algoritmul Boyer-Moore.


(a) (4p) Se presupune că alfabetul este {0, 1, 2, . . . , k − 1}. Să se scrie un algoritm cu complexitatea timp O(k),
care calculează funct, ia salt.
detsalt(k, a, out salt) {
n = a.size();
for (i = 0; i < k; ++i)
salt[i] = n;
for (i = n-1; i >= 0; --i)
if (salt[a[i]] == n) salt[a[i]] = n-1-i;
}
(b) (2p) Să se arate cum se modifică regula caracterului rău dacă ı̂n loc de funct, ia salt se consideră salt1
definită prin salt1(C) = max({0} ∪ {j | p[j] = C}).
Saltul pentru un caracter C este acum m − 1 − salt1(C).
if ((m-j) > m-salt1[s[i]]) i = i+m-j;
else i = i+(m-1-salt1[s[i]]);
(c) (1p) Să se descrie un caz când regula sufixului bun nu este eficientă.
Când patternul nu include subs, iruri repetate.
2. (7p) Căutare peste s, iruri. Context: algoritmul KMP (Knuth-Morris-Pratt).
(a) (4p) Să se scrie un algoritm care, pentru un s, ir dat, determină cel mai lung subs, ir propriu ce este s, i prefix
s, i sufix al s, irului dat (fără a calcula funct, ia es, ec).
sufpref(a) {
m = a.size();
ipref = -1; // empty prefix and suffix
for (i = 0; i < m-1; ++i) {
// check if a[0..i] is a suffix
j = 0;
while ( j <= i && a[i-j] == a[m-1-j]) {
++j;
}
if (j > i) ipref = i; // sufix and (prefix at the end position i)
}
return ipref; // the end position of the longest prefix that is suffix as well
}
(b) (2p) De ce nu se preferă un astfel de algoritm pentru calculul funct, iei es, ec?
Complexitatea timp a algoritmului sufpref este O(m2 ), ceea ce duce la o complexitate timp O(m3 ) pentru
calculul funct, iei de es, ec. Similar dacă s-ar găsi un algoritm cu complexitate timp O(n) pentru problema de
mai sus.
(c) (1p) Să se descrie un caz când KMP execută n comparat, ii (fără a t, ine cont de comparat, iile necesare pentru
calculul funct, iei es, ec), unde n este lungimea textului (subiectului).
Textul (subiectul) este format numai din litere s, i patternul numai din cifre.

1
3. (12p) Greedy.
Context: proiectarea unui algoritm greedy pentru următoarea problemă computat, ională, descrisă informal. Un
număr de n student, i au luat punctajele x1 ≤ x2 ≤ . . . ≤ xn (numere naturale). Profesorul vrea să ı̂mpartă
student, ii ı̂n grupe, astfel ı̂ncât o grupă să cont, ină student, i ı̂ntre care să nu fie o diferent, a mai mare de k puncte.
Dacă x este cel mai mic punctaj al unui student dintr-o grupă, atunci acea grupă poate cont, ine student, i cu
punctaje din intervalul [x, x + k]. Scopul este minimizarea numărului de grupe.
Cerint, e:
(a) (2p) Să se formuleze problema de mai sus ca pereche (input,output). Se vor da formulări cât mai precise şi
riguroase.
Input: n ∈ N, x[1..n] - punctajele student, ilor, ordonate crescător (opt, ional, se poate considera k ca făcând
parte din input; sau se poate considera un parametru al problemei)
Output: cel mai mic număr natural l a.ı̂. ∃y1 , . . . , yl cu proprietatea că ∀i ∈ {1, . . . , n}.∃j ∈ {1, . . . , l}.xi ∈
[yj , yj + k].

(b) (3p) Să se găsească un contraexemplu care arată că strategia de a alege la fiecare pas o grupă cu cât mai
mult, i student, i (respectând restrict, ia) nu conduce la solut, ia optimă.
Pentru k = 10, n = 7, x1 = 0, x2 = 8, x3 = 9, x4 = 10, x5 = 11, x6 = 12, x7 = 20, strategia va alege grupa
[8, 18] (care cont, ine 5 student, i) s, i va mai fi nevoie de ı̂ncă două grupe pentru x1 = 0, x7 = 20. În total,
strategia propusă ar alege 3 intervale, ı̂n timp ce solut, ia optimă are doar 2: intervalele [0, 10] s, i [10, 20].

(c) (4p) Să se descrie o strategie greedy care conduce la solut, ia optimă. Argumentat, i că strategia propusă
produce solut, ia optimă.
La fiecare pas, se alege un interval de punctaje cu cât mai mult, i student, i care ı̂ncepe exact cu cel mai mic
punctaj (neacoperit ı̂ncă).
Presupunând că ar exista o solut, ie optimă ı̂n care al i-lea interval (ı̂n ordinea crescătoare a punctajelor de
ı̂nceput) nu ar ı̂ncepe cu cel mai mic punctaj neacoperit de primele i−1 intervale, acesta (al i-lea interval) ar
putea fi putea “mutat” spre dreapta până la primul punctaj neacoperit, fără a afecta optimalitatea solut, iei.

(d) (3p) Să se scrie ı̂n Alk un algoritm pentru problema de mai sus care implementează strategia greedy propusă
la punctul anterior.
greedy(k, n, x)
{
start = x[1];
count = 1;
for (i = 1; i <= n; ++i) {
if (x[i] > start + k) {
start = x[i];
count++;
}
}
return count;
}

Ciornă.

2
4. (12p) Programare Dinamică.
Context: proiectarea unui algoritm, bazat pe paradigma programării dinamice, care găses, te lungimea celei mai
mari subsecvent, e contigue care apare atât ı̂n sens direct cât s, i invers ı̂ntr-un s, ir de numere. De exemplu, pentru
s, irul 0 1 4 3 5 6 3 4 1, cea mai lungă astfel de subsecvent, ă are lungime 3 (secvent, a 1 4 3, care apare s, i invers:
3 4 1).
Cerint, e:
(a) (2p) Să se formuleze problema de mai sus ca pereche (input,output). Se vor da formulări cât mai precise şi
riguroase.
Input: n ∈ N, S[0..n − 1]
Output: cel mai mare număr l a.ı̂. ∃i, j cu proprietatea că S[i..i + l − 1] = S[j..j − l + 1].

(b) (3p) Fie i, j două pozit, ii ı̂n s, ir; notăm cu d(i, j) lungimea celei mai lungi subsecvent, e contigue care apare
atât ı̂n sens direct, pe pozit, iile i, i + 1, . . . , i + d(i, j) − 1, cât s, i ı̂n sens invers, pe pozit, iile j − d(i, j) + 1, j −
d(i, j) + 2, . . . , j.
Fie i, j pozit, ii ı̂n s, ir. Să se determine valorile d(n − 1, j) s, i d(i, 0).
 
1 dacă S[n − 1] = S[j] 1 dacă S[0] = S[i]
d(n − 1, j) = d(i, 0) =
0 altfel 0 altfel

(c) (4p) Fie i < n − 1 s, i j > 0 două pozit, ii ı̂n s, ir. Să se determine o relat, ie de recurent, ă pentru d(i, j), ı̂n
funct, ie de d(i + 1, j − 1).

0 dacă S[i] 6= S[j]
d(i, j) =
1 + d(i + 1, j − 1) dacă S[i] = S[j]

(d) (3p) Să se enunt, e proprietatea de substructură optimă specifică problemei.


Fie i < n − 1, j > 0. Dacă d(i, j) = l este lungimea cea mai mare a unei secvent, e contigue care ı̂ncepe ı̂n
i s, i se termină (ı̂n sens invers) ı̂n j s, i l > 0, atunci d(i + 1, j − 1) este lungimea celei mai mari secvent, e
contigue care ı̂ncepe ı̂n i + 1 s, i se termină (ı̂n sens invers) ı̂n j − 1.

Ciornă.

3
Ciornă.

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