1 Pregunta 1a 2 Pregunta 1b 3 Pregunta 2a 4 Pregunta 2b 5

Anuncio
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
Descargar