INTRODUCERE Laborator 1: ÎN ALGORITMI Întocmit de: Claudia Pârloagă Îndrumător: Asist. Drd. Gabriel Danciu
I. NOŢIUNI TEORETICE A. Sortarea prin selecţie Date de intrare: un şir A, de date Date de ieşire: şirul A, sortat crescător Figura 1: Sortarea prin selecţie Cum funcţionează: pornind de la primul element din şir: minj reţine poziţia celui mai mic element din şir minx reţine cel mai mic element din şir, aflat pe poziţia minj se parcurge subşirul ce urmează elementului actual(linia 4 din pseudocod) şi se caută şi se reţine cel mai mic element şi poziţia acestuia; Se va interschimba acest element nou găsit cu elementul actual se continuă până când şirul este parcurs până la penultimul element, moment în care şirul este sortat. 2
B. Sortarea prin inserţie Date de intrare: un şir A de n numere Date de ieşire: şirul A, sortat Figura 2: Sortarea prin inserţie Cum funcţionează: se parcurge şirul de la stânga la dreapta la fiecare iteraţie se selectează elementul A[j] începând cu poziţia j 1 elementele sunt mutate cu o poziţie la dreapta până când se va găsi o poziţie potrivită pentru inserarea elementului A[j](liniile 4-8). Şirul lui Fibonacci este definit prin recurenţa: Metode de descriere: C. Calculul şirului lui Fibonacci { f 0 = 0; f 1 = 1 f n = f n 1 + f n 2 pentru n 2 recursiv: 1 FIBONACCI1( n ) 2 i f ( n<2) 3 return n 4 e l s e 5 return FIBONACCI1( n 1)+FIBONACCI1( n 2) 3
iterativ: 1 FIBONACCI2( n ) 2 i < 1; j < 0 3 f o r k< 1 t o n do 4 j< i +1 5 i < j i 6 return j D. Înmulţirea a două matrici Condiţie: - lăţimea primei matrici trebuie să fie egală cu înălţimea celei de-a doua matrici(dacă avem două matrici A m n şi B p q atunci, dacă dorim să le înmulţim trebuie ca n = p) Parcurgerea unei matrici 1 TRAVERSEZ(A) 2 f o r i =1 t o m do 3 f o r j =1 t o n do 4 => accesăm valoarea elementului A [ i, j ] Date două matrici A m n şi B n p produsul se va calcula astfel: 1 PRODUS(A, B) 2 f o r i =1 t o m do 3 f o r j =1 t o p do 4 f o r k=1 t o n do 5 C i,j = C i,j + A i,k B k,j 6 7 return C E. Algoritmul lui Euclid pentru calculul celui mai mare divizor comun Algoritmul lui Euclid este o metodă de calcul a celui mai mare divizor comun a două numere. Prezentăm, mai jos, pseudocodul acestui algoritm. Figura 3: Algoritmul lui Euclid 4
F. Turnurile din Hanoi Joc matematic în care: se dau 3 tije(numerotate tija1, tija 2 şi tija 3) şi un număr de N discuri de mărimi diferite ampasate pe tija 1. Scopul este de a muta discurile de pe tija 1 pe tija 3, utilizând tija 2 ca intermediar. Metoda iterativă de rezolvare presupune: 1 HANOI( n, A, B, C) 2 i f n 0 then 3 HANOI( n 1, A, B, C) 4 a f i s e z <<mută d i s c u l de pe>> A <<pe >>C 5 HANOI(n 1,A, B,C) G. Înmulţirea a la russe Metoda nu presupune folosirea înmulţirii ci divizarea cu 2 şi adunarea. Algoritmul este: Figura 4: Inmultirea a la russe 5
II. PREZENTAREA LUCRĂRII DE LABORATOR A. Înmulţirea a la russe Codul de mai jos exemplifică modul de implementare al algoritmului: 1 i m p o r t j a v a. u t i l. S c a n n e r ; 2 3 public c l a s s Russe { 4 5 public s t a t i c i n t a r u s s e ( i n t a, i n t b ) 6 { 7 i n t [ ] x, y ; 8 i n t i =1, prod =0; 9 x=new i n t [ 1 0 0 0 ] ; 10 y=new i n t [ 1 0 0 0 ] ; 11 x [ 1 ] = a ; 12 y [ 1 ] = b ; 13 14 while ( x [ i ] >1) 15 { 16 x [ i +1]=x [ i ] / 2 ; 17 y [ i +1]=y [ i ]+y [ i ] ; 18 i=i +1; 19 } 20 while ( i >0) 21 { 22 i f ( ( x [ i ]%2)!=0) prod=prod+y [ i ] ; 23 i=i 1; 24 } 25 return prod ; 26 27 } 28 29 30 public s t a t i c void main ( String [ ] args ) { 31 Scanner s=new Scanner ( System. i n ) ; 32 System. out. p r i n t l n ( Se e f e c t u e a z a i n m u l t i r e a a doua numere : ) ; 33 System. out. p r i n t l n ( Primul numar : ) ; 34 i n t a=s. n e x t I n t ( ) ; 35 System. out. p r i n t l n ( Al d o i l e a numar : ) ; ; 36 i n t b=s. n e x t I n t ( ) ; 37 System. out. p r i n t l n ( P r o d u s u l c e l o r 2 numere e s t e +a r u s s e ( a, b ) ) ; 38 39 } 40 41 } Observatie! Cele două numere a căror produs se calculeaza vor fi introduse de către cel care rulează programul. B. Algoritmul lui Euclid pentru calculul celui mai mare divizor comun Implementarea algoritmului: 1 i m p o r t j a v a. u t i l. S c a n n e r ; 2 3 public c l a s s A l g E u c l i d { 4 5 public s t a t i c i n t cmmdc( i n t m, i n t n ) 6 { 7 i n t temp ; 8 9 while ( n!=0) 10 { 11 temp=n ; 12 n=m%n ; 13 m=temp ; 14 } 15 return m; 16 } 17 18 public s t a t i c void main ( String [ ] args ) { 19 Scanner s=new Scanner ( System. i n ) ; 20 System. out. p r i n t l n ( C a l c u l u l c e l u i mai mare d i v i z o r comun f o l o s i n d a l g o r i t m u l l u i E u c l i d ) ; 21 System. out. p r i n t l n ( Primul numar : ) ; 22 i n t m=s. n e x t I n t ( ) ; 23 System. out. p r i n t l n ( Al d o i l e a numar : ) ; 24 i n t n=s. n e x t I n t ( ) ; 25 System. out. p r i n t l n ( Cel mai mare d i v i z o r comun e s t e : +cmmdc(m, n ) ) ; 26 } 27 } 6
III. TEMĂ Problema 1: Se dau: Date de intrare: o secvenţă de n numere A = (a 1, a 2,..., a n ) şi o valoare v Date de ieşire: poziţia i astfel încât v = A[i] sau 1 în cazul în care v nu apare în A. Scrieti o aplicaţie pentru căutarea secvenţială, care caută în secvenţa de numere pentru a-l găsi pe v. Problema 2: Să se adune 2 numere întregi în formă binară pe n-biţi, reţinute în 2 vectori A şi B de n elemente. Suma celor 2 numere se va reţine în formă binară, într-un vector C de n + 1 elemente. Problema 3: Se consideră problema evaluării unui polinom. Se dau n coeficienţi a 0, a 1,..., a n 1 şi un număr real x să se calculeze n 1 i=0 a ix i. Implementţi un algoritm de complexitate Θ(n 2 ) pentru această problemă. Implementaţi un algoritm de complexitate Θ(n) care utilizează următoarea metodă(numită regula lui Horner) pentru a rescrie polinomul: n 1 i=0 a ix i = ( (a n 1 x + a n 2 )x + + a 1 )x + a 0 Pentru schema lui Horner: http://ro.wikipedia.org/wiki/schem%c4%83_horner 7