Sunteți pe pagina 1din 11

Structuri de date

Tema 1

1. Scrieţi o funcţie recursivă care calculează coeficientul binominial C nk în funcţie de


Cnk −1 .Analizaţi funcţia de operaţii şi funcţia de locaţii şi comparaţi-o cu cazul iterativ. Aceiaşi
problemă însă C nk va fi scris în funcţie de C nk−1 şi Cnk−−11 .

2. Funcţia lui Akerman A(m,n) dată de:

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.

5. „Jocul vieţii„ este o problemă devenită clasică în matematică, introdusă în 1970 de


matematicianul englez J.H. Conway. Jocul se desfăşoară pe un careu rectangular nemărginit, în care
fiecare celulă poate fi ocupată sau neocupată, celulele ocupate numindu-se vii iar cele neocupate
numindu-se moarte; starea celulelor se schimbă de la o generaţie la alta, după următoarele reguli:
i) vecinii unei celule date sunt cele 8 celule ce o înconjoară pe verticală, orizontală şi
diagonală;
ii) dacă o celulă este vie şi are 0 sau un vecin viu, atunci ea va muri de singurătate în
următoarea generaţie;
iii) dacă o celulă este vie şi are patru sau mai mulţi vecini vii, atunci ea va muri sufocată
în următoarea generaţie
iv) o celulă moartă cu exact trei vecini va deveni vie în generaţia următoare
Sa se scrie un algoritm care generează următoarea configuraţie a careului pornind de la o
configuraţie dată, respectând regulile i)-iv).

6. Să se determine formula termenului general al şirului (Xn)n  N care satisface recurenţa:

Xn+2=Xn+1+Xn+3n+2, X0, Xi daţi.

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

8. Considerăm următorul algoritm de generare a numerelor aleatoare: se porneşte cu un număr de


două cifre X0= AB şi se ridică la pătrat, obţinându-se numărul de patru cifre Y= CDEF din care se
extrage următorul număr aleatoriu X1= DE şi se repetă procedeul cu el.

i) Să se demonstreze că şirul (Xn)n  N este periodic de perioadă TX 0 oricare ar fi X0  1,99

ii) Să se determine numărul X0 astfel încât şirul (Xn)n  N să aibă perioada maximă,
respectiv minimă.

iii) Să se calculeze funcţia de operaţii pentru algoritmul de la punctul ii).

9. Se dă funcţia F: N → N dată de relaţia


  x −1
2 F  2  + 1 dacă x impar
  
  x
F(x)= 2 F ( F  ), dacă x par, x  0
 2
0 altfel


Demonstraţi că expresia lui F(x) este corect definită, i.e. calculul lui F(x) se termină
într-un număr finit de paşi oricare ar fi x  N.

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.

12. Calculaţi timpul de execuţie al următoarelor funcţii:


a) f(n)=3n2-n+4
n
b) f (n) =  i
i =0
c) f(n)+g(n), unde f(n)=4n2-2n+3, g(n)=log n
d) f(n)+g(n), unde f(n)= n , g(n)=n log n+5
13. Numerele lui Fibonacci de ordin k>=2 sunt date de:

0 0  n  k -1

Fn = 1
(k )
n = k -1
n
 Fn(−ki) n  k
 i =1
Scrieţi variantele recursive şi nerecursive ale funcţiilor care calculează Fn( k −1) .

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.

15. Să se rezolve următoarele recurenţe:


a) T(1)=8 şi T(n)=3T(n-1)-15, pentru n>1
b) T(1)=2 şi T(n)=T(n-1)+n-1, pentru n>1
c) T(1)=3 şi T(n)=T(n-1)+2n-3, pentru n>1
d) T(1)=1 şi T(n)=2T(n-1)+n-1, pentru n>1
e) T(1)=5 şi T(n)=2T(n-1)+3n+1, pentru n>1
f) T(1)=3 şi T(n)=4T(n/3)+2n-1, pentru n>1
g) T(1)=1 şi T(n)=2T(n/2)+6n-1, pentru n>1

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:

( j)astfel încât a i = b i ,1 = i  j, a j  b j


A<B  
sau a i = b i ,1 = i = n, n  m
A=B  a i = b i ,1 = i  =n şi n=m
A>B  B<A.
Să se scrie o funcţie care are ca parametri cele două liste şi se returnează 0 dacă A=B,
1 dacă A<B şi -1 dacă A>B.

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.

3. Un tip particular de matrice rară este matricea “bandă” de forma:

x x 
x x x O 
 
 x x x 
 
 O 
 x x x
 
 x x
 
 

Scrieţi o funcţie care determină o reprezentare optimă a acestei matrici, memorând


numai elementele nenule, pentru cazul în care banda are 3 elemente. Generalizare
pentru cazul când matricea are b elemente.

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ă.

6. Se ştie că numerele de forma 2n , n  64 sunt foarte mari şi depăşesc posibilitatea de


memorare a întregilor pe calculator. De aceea se foloseşte tehnica memorării
numerelor sub formă de şir de caractere. Folosind această tehnică să se scrie un
program care calculează 2n , n  64. Ce cantitate de memorie este necesară?
7. Scrieţi o metodă nouă a clasei Polinom care implementează operaţia de împărţire a
două polinoame.

8.Scrieţi o procedură care, pentru două polinoame P şi Q reprezentate sub formă de


vector sortat, calculează CMMDC(P,Q).

9.Fie A  M(n;Z) o matrice pătratică de ordin n (n<=10). Să se scrie o funcţie

int MatrixDet (Matrix &A) ;

care calculează det(A) pe baza definiţiei determinantului.

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).Să se scrie o funcţie:

double PermArea(Permutare & p);


care calculează şi returnează aria figurii Fp corespunzătoare permutării p.

ii).Pentru o permutare p, Aria (Fp) este maximă? Justificaţi răspunsul.


iii).Pentru două permutări p şi q şi doi întregi consecutivi 1<=i<i+1<=n
definim figurile F ip dată de punctele
(i,0) (i, p(i)) (i+1, p(i+1)) (i+1, 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 .

iv).Folosind rezultatul de la iii), să se scrie o funcţie:

double PermIntersect(Permutere & p, Permutere & q) ;

care calculează şi returnează aria figurii Fp  Fq.

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.

7. Scrieţi forma poloneză inversă a următoarelor expresii:


a) A*B*C+D*E
b) A+B-C+D
c) A*B+C*D+E*F*G
d) A-B+C-D*E

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.

11. (Jocul Tetris) Se consideră următoarele figuri geometrice plane:


a) pătratul de latură 1;
b) pătratul de latură 2;
c) figura L;
d) figura Z;
Se consideră o coadă în care sunt introduse obiecte din cele patru tipuri enunţate anterior şi
din care se extrag obiecte pe rând, astfel încât la fiecare pas să se ştie obiectul curent de
introdus în stivă şi obiectul care îl urmează. Dându-se un caroiaj dreptunghiular de
dimensiune m x n compus din pătrate elementare ca cel de mai jos şi o coadă de obiecte, se
cere să se dispună obiectele scoase din coadă şi introduse pe sus (ca o stivă) în caroiaj (vezi
figura de mai jos) în aşa fel încât să nu existe obiect apărut mai devreme şi să fie peste unul
apărut mai târziu, iar în final numărul de linii completate cu obiecte să fie maxim.

12. Se consideră un careu dreptunghiular M de m x n celule care au valoarea 0 sau 1. Definim


acţiunea Reverse(i,j,k) care inversează lista valorilor celulelor de pe linia i de la coloana j la
coloana k astfel încât M(i,j)  M(i,k), M(i,j+1)  M(i,k+1), etc. Se cere:
i. Să se scrie o funcţie care implementează procedura Reverse.
ii. Pornind de la o configuraţie dată a careului, să se scrie o secvenţă de execuţii ale
procedurii Reverse care are ca rezultat faptul că toate celulele cu valoarea 1 se vor
grupa în colţul din stânga sus.

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;
}

a) Ce returnează algoritmul anterior pentru coada Q? Justificaţi răspunsul.


b) Pentru o coadă dată de n elemente, în câţi paşi se termină algoritmul?

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.

4. Scrieţi o funcţie care şterge un nod dintr-o listă circulară.

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.

7. Dezvoltaţi un proiect care implementează principalele operaţii cu polinoame memorate sub


formă de listă:
• Adăugare/ scădere a doua polinoame;
• Înmulţire a două polinoame;
• Înmulţire polinom cu scalar
• Derivata/integrala unei polinom
• Calculul rădăcinilor reale
• Evaluarea polinomului într-un punct dat

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.

2. Scrieţi o funcţie care contorizează numărul de noduri dintr-un arbore binar.

3. Scrieţi o funcţie care determină înălţimea unui arbore binar.

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.

6. Scrieţi o funcţie care determină lăţimea maximă a unui arbore binar.

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 ,..., xn , atunci putem reconstrui în mod unic arborele binar. Scrieţi o funcţie

Btree * BtreeRecover(int x[], int x1[], int n);

care implementează acest algoritm.

9. Dându-se secvenţa x1, x2, …, xn (xi  xj, i  j) şi x 1 , x 2 ,..., xn 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.

11. (Problema dicţionarului) De la intrare se construieşte un dicţionar prin citirea


perechilor de cuvinte:
cuvânt_română cuvânt_engleză
unde cele două cuvinte reprezintă un termen în limba română şi traducerea lui în
limba engleză. După terminarea citirii, se vor efectua operaţii de căutare care constau
în citirea unui cuvânt în limba română şi afişarea echivalentului în limba engleză.
Folosind un arbore de căutare binară, se cere:
a) Scrieţi un program care efectuează aceste operaţii.
b) Implementaţi cazul când se caută folosind cuvântul în limba engleză.

12. (Problema alfabetului) Un cercetător a găsit un dicţionar explicativ al unei limbi


necunoscute, care are intrări de forma:
cuvânt1=explicaţie1
cuvânt2=explicaţie2

cuvânt n=explicaţie n
Ştiind că şirul format (cuvânt1, cuvânt2,…, cuvânt n) este în ordinea corespunzătoare
alfabetului necunoscut, se cere să se determine acest alfabet (ordinea literelor în acest
alfabet).

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.

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