Algoritmos y Complejidad - Departamento de Ciencias e Ingeniería
Transcripción
Algoritmos y Complejidad - Departamento de Ciencias e Ingeniería
Departamento de Cs. e Ingenierı́a de la Computación Universidad Nacional del Sur Algoritmos y Complejidad Trabajo Práctico 3 Análisis de Algoritmos Primer cuatrimestre de 2014 1. Analice la relación que existe entre los siguientes conceptos: Tiempo de ejecución Tiempo de ejecución en el mejor caso Tiempo de ejecución en el peor caso Tiempo de ejecución en el caso promedio 2. Considere un algoritmo que tiene un tiempo de ejecución en el mejor caso tm , y un tiempo de ejecución en el peor caso tp . Suponga que tp ∈ O(g(n)) y tm ∈ Ω(g(n)). ¿Se puede afirmar que el tiempo de ejecución de este algoritmo pertenece a Θ(g(n))? ¿Por qué?. 3. Análisis de secuencias. ¿Qué enuncia la regla de secuencia? ¿cuándo es válido aplicar esta regla? 4. Análisis de for loops. Considere el siguiente algoritmo. for i ← 1 to m do P(i) end Analizar el tiempo que consume cuando: a) el tiempo de ejecución de P (i) es igual a una función constante t b) el tiempo de ejecución de P (i) es igual a una función t(i) 5. Análisis de while loops. Considere el siguiente algoritmo. i←1 j←n while i < j do i ← ((i + j) ÷ 2) + 1 end Analizar el tiempo que consume este algoritmo: a) a través de alguna función de sus variables que permita determinar la cantidad de veces que se ejecuta el bucle. b) haciendo un planteo recursivo de su comportamiento. c) utilizando un barómetro. Pag. 1 6. Determinar el orden exacto del tiempo de ejecución del siguiente algoritmo. for i ← 0 to n do j←i while j ̸= 0 do j ← (j ÷ 2) end end 7. Hallar el tiempo de ejecución en función de n y en notación Θ de los siguientes algoritmos. Considerar todas las instrucciones individuales, incluido el control de los ciclos, como operaciones elementales. l←0 for i ← 1 to n do for j ← 1 to n2 do for k ← 1 to n3 do l ←l+1 end end end l←0 for i ← 1 to n do for j ← 1 to i do for k ← 1 to n do l ←l+1 end end end 8. Considere el problema de ordenar un arreglo de n enteros. Dar un algoritmo de ordenamiento de Θ(n) sabiendo que todo elemento i del arreglo verifica 1 ≤ i ≤ 2n. 9. Considerando el Algoritmo 1 que calcula el máximo común divisor de dos números m y n, calcular una cota superior para la cantidad de veces que se repite el ciclo while: Algoritmo 1: gmc(m,n) while m > 0 do temp ← n mod m n←m m ← temp end return n 10. Para la estructura de datos Heap, representada por medio de un árbol binario e implementada con un arreglo: a) Determinar el orden exacto del tiempo de ejecución en el peor caso para las operaciones Percolate(H[1..n],i) y SiftDown(H[1..n],i) b) Utilizando los resultados del inciso anterior, determinar el Θ del tiempo de ejecución en el peor caso de las operaciones máximo(), eliminar_máximo(H[1..n]) e insertar(H[1..n],elemento). c) Realizar la traza de la operación CrearHeap(A) para cada una de las versiones (Algoritmos 2 y 3) tomando como entrada el arreglo A = ⟨1, 6, 9, 2, 7, 5, 2, 7, 4, 10⟩. d ) Comparar el Θ del tiempo de ejecución, para el peor caso, de los algoritmos 2 y 3. e) Dar un algoritmo para el método de ordenamiento heapsort. Analizar el tiempo de ejecución de este algoritmo para el peor caso considerando las dos implementaciones de CrearHeap. Pag. 2 Algoritmo 2: Crear Heap 1 (A[1..n]) Algoritmo 3: Crear Heap 2 (A[1..n]) T ←A for i ← 2 to n do Percolate(T ,i) end return T T ←A for i ← ⌊n/2⌋ downto 1 do Siftdown (T ,i) end return T 11. Heaps Binomiales [?]: a) Definir árbol binomial y heap binomial. b) Determinar el orden exacto del tiempo de ejecución en el peor caso de las operaciones: link(Ab1,Ab2): genera un nuevo árbol binomial a partir de los árboles binomiales Ab1 y Ab2. máximo(H): retorna el máximo elemento del heap binomial H. eliminar_máximo(H): elimina el máximo elemento del heap binomial H restaurando la estructura de heap binomial. mezclar(Hb1,Hb2): mezcla los dos heaps binomiales Hb1 y Hb2. 12. Considere el problema de hallar el n-ésimo número de la secuencia de Fibonacci. Implemente los algoritmos 4, 5 y 6. Compare empı́ricamente los tiempos de ejecución de estos algoritmos. Algoritmo 4: FibRec (n) Algoritmo 6: FibIter2 (n) if n < 2 then return n else return FibRec (n-1) + FibRec (n-2) end Algoritmo 5: FibIter1 (n) i←1 j←0 for k ← 1 to n do j ←i+j i←j−i end return j i←1 j←0 k←0 h←1 while n > 0 do if n mod 2 = 1 then t←j∗h j ←i∗h+j∗k+t i←i∗k+t end t←h∗h h←2∗k∗h+t k ←k∗k+t n ← n div 2 end return j Referencias [1] Gilles Brassard and Paul Bratley. Fundamentals of Algorithmics, chapter 4. Prentice Hall, 1996. [2] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction To Algorithms, chapter 2,20. The MIT Press, 1990. [3] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction To Algorithms, chapter 2, 19. The MIT Press, 3rd edition, 2009. Pag. 3