Documente Academic
Documente Profesional
Documente Cultură
Tema 1
n + 1 dacă m = 0
A(m,n)= A(m − 1,1) dacă n = 0
A(m − 1, A(m, n − 1)), altfel
are proprietatea că pentru valori relativ mici ale lui m şi n are o creştere foarte mare. Scrieţi o
funcţie recursivă pentru calculul valorii A(m,n).
3. Fie funcţia F:{1,2,…,n} → {1,2,…,n} bijectivă, fără puncte fixe. Să se scrie un algoritm care
determină (dacă există) cea mai mare submulţime S {1,2,…,n} cu proprietatea că F(S)=S.
4. Dacă S este o mulţime cu n elemente, atunci mulţimea părţilor lui S este mulţimea tuturor
submulţimilor lui S incluzând mulţimea vidă şi mulţimea totală. Scrieţi o procedură recursivă care
generează toate submulţimile mulţimii S.
n n
7. Fie (ai)i=1,n un şir de numere reale şi P(x)= ( x − ai ) = bk x k . Să se scrie un algoritm care
i =1 k =0
calculează coeficienţii (bk)k=1,n.
n
Indicaţie. Se vor considera polinoamele P(x)= ( x − ai ) , k= 1, n şi se va observa ce relaţie există
i =1
între coeficienţii lui Pk şi Pk+1. În plus, se va observa că :
Pk+1(x)=(x-ak+1) Pk
ii) Să se determine numărul X0 astfel încât şirul (Xn)n N să aibă perioada maximă,
respectiv minimă.
10. Să considerăm problema evaluării unui polinom într-un punct. Fiind daţi n coeficienţi, a0,a1, …,
n −1
an-1 şi un număr real x, dorim să calculăm a x
i =0
i
i
. Descrieţi un algoritm simplu în timp O(n2)
pentru această operaţie. Descrieţi şi un algoritm în timp O(n) care foloseşte următoarea metodă de
rescriere a unui polinom, numită schema lui Horner:
n −1
a x
i =0
i i = (...(a n −1 x + a n −2 ) x + ... + a1 ) x + a0
11. Descrieţi un algoritm al cărui timp de execuţie să fie O(n lg n) şi care, pornind de la o mulţime
dată S de n numere reale şi un alt număr real x, să decidă dacă printre elementele lui S există două
elemente având suma x.
14. Scrieţi câte o variantă recursivă pentru metodele coardei şi a înjumătăţirii intervalului şi
comparaţi funcţiile lor de operaţii cu cele ale variantelor iterative.
16. Scrieţi un algoritm recursiv şi unul iterativ pentru calculul factorialului şi comparaţi funcţiile de
operaţii în cele două cazuri.
Structuri de date
Tema 2
1. Dacă A=(a1 ,…,an), B=(b1 ,…, bm ) sunt două liste ordonate, definim relaţia “<”
astfel:
2. Scrieţi o metodă care calculează transpusa unei matrici rare. Analizaţi funcţia de
operaţii şi funcţia de locaţii pentru algoritmul folosit.
x x
x x x O
x x x
O
x x x
x x
4. O matrice A M(m,n) se spune că are un “punct şa” dacă ( ) i,j astfel încât A(i,j)
este cel mai mic element de pe linia i şi cel mai mare element de pe coloana j. Scrieţi
un program C care determină locaţiile punctelor şa pentru o matrice. Care este ordinul
funcţiei de operaţii pentru metoda aleasă?
5. Matricile sunt folosite petru memorarea structurilor de date algebrice de tip relaţie.
O relaţie R între elementele unei mulţimi M este memorată sub formă de tablou
bidimensional A(a;u1,1;u1) cu proprietatea că A(i,j)=1 i R j, ( ) i,j M şi
A(i,j)=0 în caz contrar. Să se scrie un algoritm care verifică dacă o relaţie este
simetrică, reflexivă, tranzitivă.
10.Pentru o permutare p Sn, fie Fp figura determinată de următoarele puncte din plan:
(1,0) (1,p(1)) (2, p(2)) …(n,p(n)) (n,0).
şi F iq delimitată de punctele
(i, 0) (i, q(i)) (i+1, q(i+1)) (i+1, 0)
Să se scrie o funcţie
double PermSliceIntersect(Permutare &p, Permutare & q, int i);
care calculează şi returnează aria figurii F ip F iq .
11. Şirul Farey de ordin n este (x1,y1),(x2,y2),…,unde xi,yi sunt numere naturale care
satisfac relaţiile:
i) 0<yi n, () i 1;
x x
ii) i < i +1 () i 1;
y i y i +1
x
iii) 0 i 1 () i 1.
yi
Să se scrie o procedură care pentru un număr natural dat n>0, care generează şi
afişează şirul Farey de ordin n.
Structuri de date
Tema 3
1. Fie S o stivă de numere întregi şi x o variabilă întreagă. Folosind operaţiile standard pe stivă
(Push, Pop, isEmpty, isFull) scrieţi cîte o metodă care să efectueze următoarele operaţii:
a) citeşte un element din vârful stivei, fără a-l şterge; dacă S este vidă, x=MAXINT;
b) citeşte în x al treilea element din vârful stivei, dacă există cel puţin trei elemente;
dacă nu, x=MAXINT;
c) citeşte în x elementul de la baza stivei (x=MAXINT dacă stiva este goală) şi lasă
stiva neschimbată;
d) şterge toate elementele egale cu x din stivă, lăsând celelalte elemente nealterate.
2. Uneori, un program necesită două stive conţinând acelaşi tip de elemente. Dacă cele două
stive sunt memorate în vectori diferiţi, atunci o stivă poate să depăşească maximul
capacităţii în timp ce cealaltă stivă are mult spaţiu nefolosit. O cale de a evita această
situaţie este să punem ambele stive “împreună” într-un vector şi să permitem unui vector să
crească de la un capăt, iar celuilalt să crească de la celălalt capăt, ambele stive crescând din
direcţii diferite. În acst fel, dacă o stivă se umple prea tare şi cealaltă are spaţiu liber, atunci
ele pot să coexiste fără să apară vreo eroare. Declaraţi şi implementaţi o nouă clasă numită
DoubleStack care să conţină doi indici topA şi topB şi metodele PushA ,PushB, PopA, PopB
care gestionează cele două stive.
3. Scrieţi un program care utilizează o stivă pentru a citi un întreg şi tipăreşte toţi divizorii săi
primi.
4. O stivă poate fi utilizată ca o linie de cale ferată ce schimbă sensul ca în figura de mai jos.
Vagoanele numerotate 1,2,...,n sunt puse pe linia de intrare în această ordine. Să se demonstreze,
că folosind o stivă de capacitate n se poate obţine la ieşire orice permutare σ Sn a vagoanelor.
Pentru o permutare dată σ, să se scrie o funcţie care afişează succesiunea operaţiilor care au loc.
5. Să se scrie o funcţie care citeşte de la tastatură o linie de caractare care se presupune că este
compusă din două părţi, separate între ele prin “<”. Ca rezultat funcţia trebuie să returneze:
- 1 dacă nu există “<” în şirul de intrare;
- 2 dacă partea dinaintea lui “<” este mai lungă decât cea de după “<” ;
- 3 dacă partea dinaintea lui “<” este mai scurtă decât cea de după “<” ;
- 4 dacă părţile stânga şi dreapta a lui “<” au aceiaşi lungime dar sunt diferite;
- 0 dacă partea stângă este identică partea dreaptă.
Se va folosi ocoadă circulară pentru rezolvarea problemei.
6. Implementaţi clasa Scroll, care este o structură de date intermediară între stivă şi coadă.
Într-un Scroll, toate intrările se fac la sfârşitul listei însă ştergerile se pot face la ambele
capete.
8. Scrieţi un algoritm care transformă o expresie din formă prefixată în formă postfixată.
Analizaţi complexitatea lui.
9. Considerăm un aeroport mic, cu o singură pistă. La fiecare moment poate ateriza sau decola
un singur avion, prioritate având avioanele care vor să aterizeze. Se pune problema simulării
traficului în aeroport. Pentru aceasta vom construi două cozi „de aşteptare”, una pentru
avioanele ce aşteaptă să aterizeze, alta pentru cele care vor să decoleze. Scrieţi un program
în limbajul C care să conţină două funcţii concurente care gestionează cele două cozi
asociate.
10. Se dau n+1 tije dintre care n sunt ocupate şi una este liberă. Fiecare tijă din cele ocupate are
capacitate de exact n bile. Fiecare tijă conţine exact n bile identice, de aceiaşi culoare
(fiecare tijă conţine câte o culoare diferită). Ştiind că pe o tijă nu pot exista mai mult de n
bile să se scrie o funcţie care arată şirul mutărilor astfel încât, folosind tija liberă, să se
ajungă în final la situaţia în care pe fiecare tijă există exact n bile, toate de culori diferite.
13. Să se scrie o funcţie care interclasează valorile presupuse sortate din două stive S1 şi S2 şi
depune rezultatul într-o coadă Q.
14. Să se scrie un program care afişează un prompter „>” şi citeşte de la acest prompter linii de
comenzi, după care afişează rezultatul lor după cum urmează:
>S identificator creează o stivă care va fi referită cu numele dat de identificator;
>Q identificator creează o coadă care va fi referită cu numele dat de identificator;
>D identificator şterge conţinutul şi variabilele referite de identificator;
>A identificator listă_valori adaugă în identificatorul specificat valorile din listă;
>X identificator număr extrage din identificator un număr specificat de valori;
>P identificator extrage din identificator toate valorile pe rând şi le afişează;
>M identificator1 identificator2 identificator3 concatenează valorile din identificator1 cu
cele din identificator2 şi le adaugă în identificator3;
>E termină programul.
15. Se consideră coada Q cu elemente numere întregi asupra căreia se aplică algoritmul
următor:
While(!Q.SqueueEmpty())
{
Q.SqueueDelete(x);
if(!Q.SqueueEmpty())
{
Q.SqueueDelete(y);
Q.SqueueAdd(x+y);
}
else
return x;
}
16. Arătaţi cum se poate implementa o coadă prin două stive. Analizaţi timpul de execuţie
pentru operaţiile cozii.
17. Arătaţi cum se poate implementa o stivă prin două cozi. Analizaţi timpul de execuţie pentru
operaţiile stivei.
Structuri de date
Tema 4
1. O lista L=(e1,…en) se zice ca este sortată crescător dacă e1 … en. Să se construiască o
listă sortată pe măsură ce se citesc elementele ei de la tastatură. Să se calculeze funcţia de
operaţii f şi să se arate că f(n) O(n).
2. Scrieţi o funcţie care inversează o listă simplu înlănţuită dintr-o singură trecere.
3. Scrieţi o funcţie care separă o listă simplu înlănţuită în două liste înlănţuite astfel încât
nodurile primei liste să meargă alternant în cele două liste.
5. Scrieţi o funcţie care concatenează două liste circulare creând o nouă listă circulară.
6. Scrieţi o funcţie care separă o listă circulară în două subliste circulare conţinând nodurile ei
alternante.
8. Scrieţi o funcţie care numără câte elemente sunt într-o listă. Care este ordinul funcţiei de
operaţii?
int List_Length(LinkedList*);
9. Fie X=(x1,..,xn) şi Y=(y1,…,ym) două liste simplu înlănţuite. Scrieţi un algoritm care
interclasează cele doua liste într-una singură. Care este ordinul funcţiei de operaţii?
10. Dezvoltaţi un proiect care implementează principalele operaţii cu liste dublu înlănţuite:
creare, adăugare, ştergere, modificare, căutare, afişare.
11. Considerăm operaţia XOR (sau exclusiv) definită la nivel binar astfel:
0 daca i = j
i j=
1 altfel
Să se arate că
a (a b)=(a a) b=b
(a b) b=a (b b)=a
Aceste relaţii ne oferă o idee de a salva memoria necesară atât legăturii stângi cât şi celei
drepte (prev şi next) din lista dublu înlănţuită. Nodurile vor avea doar două câmpuri: info şi
link. Dacă L1 este la stânga nodului X şi R1 este la dreapta nodului X atunci
link(X)=L1 R1. Pentru cel mai din stânga nod L1=0 şi pentru cel mai din dreapta nod R1=0;
a) scrieţi un algoritm care, pentru o listă dublu înlănţuită cu câmpurile info şi link ca mai
sus, traversează lista de la stânga la dreapta;
b) aceeaşi problemă pt traversarea inversă.
Structuri de date
Tema 5
1. Pentru un arbore binar scrieţi o funcţie care determină numărul de noduri frunză dintr-
un arbore.
4. Scrieţi o funcţie care tipăreşte un arbore în forma cu paranteze, adică sub forma
(Key(Left_Tree, Right_Tree))
unde Left_Tree şi Right_Tree sunt afişările corespunzătoare subarborilor stâng şi drept.
5. Scrieţi o funcţie care va elimina un nod dintr-un arbore binar, folosind următoarea
metodă, aplicabilă în cazul când nodul ce urmează să fie şters are ambii subarbori
nevizi. Mai întâi, se determină predecesorul imediat al nodului de şters, predecesor
raportat la traversarea în inordine, prin parcurgerea la fiul stâng şi apoi cât se poate în
dreapta. Acest predecesor imediat are proprietatea că are cel mult un fiu, şi deci poate
fi şters din poziţia sa fără dificultate. Apoi va fi instalat în arbore în poziţia ocupată de
nodul curent ce trebuia iniţial şters. Demonstraţi că, urmând acest procedeu, se
păstrează proprietatea de arbore de căutare.
7. Scrieţi o funcţie care converteşte un arbore binar într-o listă dublu înlănţuită, în care
nodurile sunt puse în ordinea dată de traversarea în inordine a arborelui.
8. Fie x1, x2, …, xn (xi xj, i j) secvenţa de parcurgere în preordine a unui arbore
binar. Arătaţi că, dacă cunoaştem secvenţa de parcurgere în inordine a arborelui binar
x 1 , x 2 ,..., xn , atunci putem reconstrui în mod unic arborele binar. Scrieţi o funcţie
9. Dându-se secvenţa x1, x2, …, xn (xi xj, i j) şi x 1 , x 2 ,..., xn care reprezintă
rezultatul traversării în inordine şi postordine, este posibilă refacerea în mod unic a
arborelui binar de start? Dacă nu, găsiţi un contraexemplu.
10. Aceeaşi problemă ca la ex. 9, dar cele două secvenţe conţin traversările în preordine şi
postordine.
13. (Arborele cu memorie suplimentară) Pentru a traversa arborele binar fără recursivitate
şi fără stivă auxiliară, se foloseşte o tehnică specială, ce presupune existenţa unui
câmp pointer suplimentar, ce pointează spre nodul părinte al fiecărui nod. Folosind
această implementare:
a) scrieţi o metodă care construieşte un asemenea arbore
b) scrieţi o funcţie are traversează arborele recursiv, folosind un indice al legăturii
curente.