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 n1 1 Recuerde que: q , q 1 i 0 n i ( 2 a ) b ( 2b ) a 3 y (a.b)c (a c ).(bc )