Complemento Práctico 2

Anuncio
Práctico 2 Complemento
Análisis de algoritmos
EJERCICIO 1 (R)
Dado el siguiente algoritmo:
bool funcion (int* a, int i, int j){
int medio;
if (i == j)
return calcular(a, i, i);
else {
if (i < j){
medio = (i+j-1)/2;
if(funcion(a, i, medio))
return calcular(a, i, medio);
else
if(funcion(a, medio + 1, j))
return calcular(a, medio + 1, j);
else return false;
}
}
}
La función calcular tiene el siguiente encabezado: bool calcular(int* a, int i, int j)
Ambas funciones reciben como parámetro de entrada un arreglo a y dos índices i y j que
representan que en esa invocación se consideran los elementos ubicados entre los lugares
i y j del arreglo a.
Inicialmente se invoca a funcion con los siguientes parámetros: funcion(a, 1, n)
La función calcular es quién realiza las operaciones básicas, y la cantidad de dichas
operaciones es 2(j-i) + 1.
Se pide:
a) Analizar las distintas alternativas en un paso genérico del algoritmo e indique la
cantidad de operaciones básicas en cada alternativa.
Programación 3
Indique en cuales de las situaciones anteriores se da el peor caso.
b) Plantear la recurrencia que calcula la cantidad de operaciones básicas que se
realizan en el peor caso definido en el punto anterior.
c) Resolver la recurrencia definida en el punto anterior para un n conveniente.
EJERCICIO 2 (C)
n
Dada la función: f(x) =
a x
i 0
i
i
Analice el orden del tiempo de ejecución y compare los órdenes en los siguientes casos
(considere n potencia de 2):


Utilizando una rutina simple para realizar la exponenciación.
Utilizando la siguiente rutina
int potencia (int x, int n){
int resultado;
if (n == 0)
resultado = 1;
else if (n == 1)
resultado = x;
else if (n % 2 == 0)
resultado = potencia (x * x, n / 2);
else
resultado = potencia (x * x, n / 2) * x;
return (resultado);
}
2
Programación 3
EJERCICIO 3 (R)
Dado el siguiente algoritmo:
bool funcion (int* a, int i, int j){
(1)
int corte; bool x, y;
(2)
if (i == j)
(3)
return calcular(a, i, i);
(4)
else {
(5)
if (i < j){
(6)
corte = (i+j-1)/2;
(7)
if(funcion(a, i, corte))
(8)
return calcular(a, i, corte);
(9)
else
(10)
if(funcion(a, corte + 1, j))
(11)
return calcular(a, corte + 1, j); (12)
else {
(13)
x = calcular(a, i, corte);
(14)
y = calcular(a, corte + 1, j); (15)
return x && y;
(16)
}
}
}
}
La función calcular tiene el siguiente encabezado: bool calcular(int* a, int i, int j)
Ambas funciones reciben como parámetro de entrada un arreglo a y dos índices i y j que
representan que en esa invocación se consideran los elementos ubicados entre los lugares
i y j del arreglo a.
Inicialmente se invoca a funcion con los siguientes parámetros: funcion(a, 1, n)
El procedimiento calcular es quién realiza las operaciones básicas, y la cantidad de
dichas operaciones es:
 (j-i +1) + j2 si i  j .
 2 si i = j
Se pide:
a) Analizar las distintas alternativas en un paso genérico del algoritmo e indique la
cantidad de operaciones básicas en cada alternativa.
Indique en cuales de las situaciones anteriores se da el peor caso.
b) Plantear la recurrencia que calcula la cantidad de operaciones básicas que se
realizan en el peor caso definido en el punto anterior.
c) Resolver la recurrencia definida en el punto anterior para un n conveniente.
q n1  1
Recuerde que:  q 
,
q 1
i 0
n
i
( 2 a ) b  ( 2b ) a
3
y
(a.b)c  (a c ).(bc )
Descargar