Práctica 4 Introducción a la computación Primer cuatrimestre de 2010 Ejercicio 1. Decida si las siguientes afirmaciones son verdaderas o falsas: n2 − 4n + 2 ∈ O(n2 ) n! + n2 ∈ O(n2 ) (n2 + 3n)3 ∈ O(n6 ) Si una función h(n) ∈ O(f (n)) y además f (n) ∈ O(g(n)), entonces h(n) ∈ O(g(n)). Ejercicio 2. Ordene de menor a mayor los siguientes órdenes de complejidad. O(1) √ O( 2) O(n!) O(2n ) √ O( n) O(n2 ) O(log(n)) O(n log(n)) O(nn ) O(n + 1) Ejercicio 3. Determine el orden de complejidad temporal de peor caso de los siguientes algoritmos, presumiendo que todas las operaciones sobre arreglos y matrices son O(1): 1 2 3 4 i n t s u m a t o r i a ( i n t * a , i n t tam ) { // p r e : {tam es el tamaño del arreglo a} // p o s : {ret value == la suma de los elementos del arreglo a@pre} i n t suma = 0 ; 5 f o r ( i n t i =0; i <tam ; i ++){ total = total + a[ i ]; } 6 7 8 9 return total ; 10 11 1 2 3 } // p r e : {tam es el tamaño del arreglo a} // p o s : {a tiene los mismos elementos que a@pre y está ordenado de menor a mayor} v o i d i n s e r t i o n S o r t ( i n t * a , i n t tam ) { 4 f o r ( i n t i = 0 ; i < tam ; i ++) { f o r ( i n t j = i ; 0 < j && a [ j ] < a [ j − 1 ] ; j −−) { i n t aux = a [ j ] ; a [ j ] = a [ j −1]; a [ j −1] = aux ; } } 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 } // p r e : {tam es el tamaño del arreglo arr} // p o s : {ret value == true si y solo si n@pre está en el arreglo arr@pre} b o o l b u s q u e d a B i n a r i a ( i n t * a r r , i n t tam , i n t n ) { i n t d e s d e = 0 ; i n t h a s t a = tam ; i n t a c t u a l ; bool res = f a l s e ; w h i l e ( d e s d e < h a s t a && ! r e s ) { a c t u a l = ( desde + hasta ) /2; i f ( a r r [ a c t u a l ] == n ) { res = true ; } else { i f ( arr [ actual ] > n){ hasta = actual ; } else { d e s d e = a c t u a l +1; } } } return res ; } 1 1 2 3 4 5 6 7 // p r e : {m1 y m2 son matrices cuadradas de dimensión dim} // p o s : {ret value es la matriz resultante de la suma entre m1@pre y m2@pre} i n t ** s u m a M a t r i c e s ( i n t ** m1 , i n t ** m2 , i n t dim ) { i n t ** r e s = new i n t * [ dim ] ; f o r ( i n t i =0; i <dim ; i ++){ r e s [ i ] = new i n t [ dim ] ; } 8 f o r ( i n t f i l =0; f i l <dim ; f i l ++){ f o r ( i n t c o l =0; c o l <dim ; c o l ++){ r e s [ f i l ] [ c o l ] = m1 [ f i l ] [ c o l ] + m2 [ f i l ] [ c o l ] ; } } 9 10 11 12 13 14 return res ; 15 16 } Ejercicio 4. Para los siguientes ejercicios, dar una especificación, un programa en C++ y determine el orden de complejidad temporal de peor caso: a) Dado un entero n, devolver un arreglo de enteros que contenga a todos los divisores positivos de n. b) Dados dos enteros no negativos n y m y una matriz de reales M de n × m, devolver M t , la matriz traspuesta de M . (Recordar que (M t )i,j = Mj,i .) c) Escribir un algoritmo que dadas dos matrices devuelva una tercera con el resultado de la suma entre ellas. 2