UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACION ALGORITMOS Y ESTRUCTURAS DE DATOS SOLUCION PARCIAL 1 1 Pregunta 1a Falso. Se calcula para cualquier tamano de N 2 Pregunta 1b Cualquier orden mayor o igual a O(n3 ) 3 1 2 3 4 5 6 7 8 9 10 Pregunta 2a function suma ( array A of integer [ ] , integer i , n ) : integer i f i==n t h e n return A [ i ] else r e t u r n A [ i ] + s u m a ( A , i +1 , n ) end end integer N = . . . array arr of integer [ 1 . . N ] p r i n t ( s u m a ( arr , 1 , N ) ) El analisis de este algoritmo puede ser visto de la siguiente manera: suma(A,1,4) = arr[1] + (arr[2] + (arr[3] + (arr[4]))) 4 Pregunta 2b El promedio se calcula de la siguiente manera: promedio = n 1X i n i=1 aplicando la distributiva de la suma, tenemos: promedio = n X i i=1 n entonces, 1 2 3 4 5 6 7 8 9 10 function promedio ( array A of integer [ ] , integer i , n ) : real i f i==n t h e n return A [ i ]/ n else r e t u r n A [ i ] / n + p r o m e d i o ( A , i +1 , n ) end end integer N = . . . array arr of integer [ 1 . . N ] p r i n t ( p r o m e d i o ( arr , 1 , N ) ) 5 1 2 3 Pregunta 2c function estaOrdenado ( array A of integer [ ] , integer i , n ) : boolean i f i==n t h e n r e t u r n t r u e // e s t a o r d e n a d o 1 4 5 6 7 8 9 10 11 12 13 14 else i f A [ i ] <= A [ i +1] t h e n r e t u r n e s t a O r d e n a d o ( A , i +1 , n ) else r e t u r n f a l s e // no e s t a o r d e n a d o ( a s c e n d e n t e ) end end end integer N = . . . array arr of integer [ 1 . . N ] p r i n t ( e s t a O r d e n a d o ( arr , 1 , N ) ) Realmente es indiferente si es ascendente o descendente, lo importante es decir si presenta algun orden. Obviamente si cambiamos el operador <= por >= verificamos descendente. 6 1 2 3 4 5 6 7 8 9 10 11 12 13 function mayor ( array A of integer [ ] , integer i , n , M ) : integer i f i==n t h e n return A [ i ] else i f A [ i ] > M then M = A[i] end r e t u r n m a y o r ( A , i +1 , n , M ) end end integer N = . . . array arr of integer [ 1 . . N ] p r i n t ( m a y o r ( arr , 1 , N ) ) 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 Pregunta 2d Pregunta 3 void activacion ( integer previousActivation , i n t e g e r acum , integer n , i n t e g e r TA , integer currentSeqPos , array A of real [ ] , array C of real [ ] [ ] , array seq of integer [ ] ) end f o r i n t e g e r i=0 t o n−1 do i f n o t i n c l u y e ( seq , i , n ) t h e n seq [ currentSeqPos ] = i acum = acum + C [ i ] [ previousActivation ] ∗ A [ i ] i f a c u m <= T A t h e n i f c u r r e n t S e q P o s == n t h e n p r i n t ” s e q u e n c e consumes ”+a c u m+”amp/h” printArray ( seq ) else a c t i v a c i o n ( i , a c u m , n , TA , c u r r e n t S e q P o s +1 , A , C , s e q ) end end seq [ currentSeqPos ] = 0 end end // f u n c i o n a u x i l i a r function incluye ( array X of integer , integer k , n ) : boolean i f n==0 t h e n return f a l s e e l s e i f X [ n]==k t h e n return true else r e t u r n i n c l u y e ( X , k , n −1) end end i n t e g e r N=5 // v a l o r e s d e m o s t r a t i v o s , no r e q u e r i d o s en e l e n u n c i a d o real TA = . . . a r r a y A o f r e a l [ 1 . . N ] = { 0 . 1 2 , 0 . 2 5 , 1 , 5 , 1 . 4 0 } // v a l o r e s d e m o s t r a t i v o s , no r e q u e r i d o s array C of real [ 1 . . N ] [ 1 . . N ] = { // v a l o r e s d e m o s t r a t i v o s , no r e q u e r i d o s en e l e n u n c i a d o {1.000 , 0.500 , 0.250 , 0.125 , 0.625} , {2.000 , 1.000 , 0.500 , 0.250 , 0.125} , 2 44 45 46 47 48 49 {3.000 , 2.000 , 1.000 , 0.500 , 0.250} , {4.000 , 3.000 , 2.000 , 1.000 , 0.500} , {5.000 , 4.000 , 3.000 , 2.000 , 1.000} } a r r a y s e q u e n c e o f i n t e g e r [ 1 . . N ]={} a c t i v a c i o n ( 1 , 0 , N , TA , 1 , A , C , s e q u e n c e ) 8 1 2 3 4 5 6 7 8 Pregunta 4A I n t e g e r x =0; f o r I n t e g e r i=1 t o n do f o r I n t e g e r j=1 t o i do f o r I n t e g e r k=j t o 1 do // d e c r e c i e n t e x = x + 2; end end end Considerando el peor caso, cada for se ejecutara n veces. El tercer for es indiferente si va creciente o decreciente, en el peor caso se ejecuta tambien n veces. Entonces es posible reescribir el algoritmo para su analisis, como sigue: 1 2 3 4 5 6 7 8 I n t e g e r x =0; f o r I n t e g e r i=1 t o n do f o r I n t e g e r j=1 t o n do f o r I n t e g e r k=1 t o n do x = x + 2; end end end Entonces comenzamos calculando el tercer for T4−5 (n). Aplicamos la regla 6 (i.e. regla del for) T4 (n) = 1 + 1 + n−1 X (1 + T5 (n) + 2) k=1 T4 (n) = 2 + n−1 X (1 + 2 + 2) k=1 T4 (n) = 2 + n−1 X 5 k=1 T4 (n) = 2 + 5(n − 1) T4 (n) = 5n − 3 ahora calculamos el segundo for, T3 (n) T3 (n) = 1 + 1 + n−1 X (1 + T4 (n) + 2) k=1 T3 (n) = 2 + n−1 X (1 + 5n − 3 + 2) k=1 T3 (n) = 2 + n−1 X (5n) k=1 T3 (n) = 2 + 5(n − 1)n T3 (n) = 5n2 − 5n + 2 de igual manera con el primer for, T2 (n) 3 n−1 X T2 (n) = 1 + 1 + (1 + T3 (n) + 2) k=1 T2 (n) = 2 + n−1 X (1 + 5n2 − 5n + 2 + 2) k=1 T2 (n) = 2 + n−1 X (5n2 − 5n + 5) k=1 T2 (n) = 2 + (n − 1)(5n2 − 5n + 5) T2 (n) = 2 + (n − 1)(5n2 − 5n + 5) T2 (n) = 5n3 − 25n2 + 25n − 3 Ahora sustituimos, para calcular el T (n) T (n) = T1 (n) + T2 (n) T (n) = 1 + 5n3 − 25n2 + 25n − 3 T (n) = 5n3 − 25n2 + 25n − 2 por la regla de la suma T (n) = 5n3 hacemos c = 5 y d = 3 Si T (n) = cnd −→ T (n) = O(nd ) finalmente T (n) ∈ O(n3 ) 9 1 2 3 4 5 6 7 Pregunta 4B f o r I n t e g e r i=1 t o n do I n t e g e r j =1; W h i l e ( j<=i ) do j = j ∗ 2; x = x + 2; end end Para el siguiente ejercicio es posible analizar de manera intuitiva que el for es de orden O(n). Por otro lado en el while los incrementos no son constantes y varian en el transcurso del algoritmo. La condicion j ≤ i (linea 3) es quien regula el numero de iteraciones. Asi, es importante estudiar el comportamiento del numero de iteraciones de este ciclo (representado como k). En este caso, la variable j toma el valor de 1 y finaliza en n y durante su ejecucion j se modifica por el valor de j = j ∗ 2 , donde reduce el numero de ejecuciones cada vez en multiplos de 2. El numero de veces que se ejecuta el while se puede representar por la funcion log2 basado en la entrada n. calculamos T3 (n), usando la regla del while log2 n T3 (n) = 1 + X (1 + T4 (n) + T5 (n)) k=1 log2 n T3 (n) = 1 + X k=1 4 (1 + 2 + 2) log2 n T3 (n) = 1 + X 5 k=1 T3 (n) = 1 + 5log2 n por la regla de la suma: T3 (n) = log2 n ahora el T1 (n), aplicando la regla del for T1 (n) = 2 + n−1 X (4 + T3 (n)) k=1 T1 (n) = 2 + n−1 X (4 + log2 n) k=1 T1 (n) = 2 + (n − 1)(4 + log2 n) T1 (n) = 2 + 4n + nlog2 n − 4 − log2 n Por la regla de la suma T (n) ∈ O(nlog2 n) GDAYED 2015 5