ANÁLISIS DE ALGORITMOS TC-4001 ALGUNAS SOLUCIONES A LA TAREA # 2 1. Ordena las siguientes funciones por orden de crecimiento; es decir, encuentra un arreglo g1, g2, …,g20 de las funciones que satisfaga g1 = O(g2), g2 = O(g3),…, g19 = O(g20). Parte la lista en clases equivalentes de forma que g(n) y f(n) estén en la misma clase si y sólo si g(n) =(f(n)). 2 (log n)/2 (3/2) n log( log n) 2 log n n n2 n3 n2n en 2n n! 22 n log(log n) 4 log n n log n (n+1) ! n 1/log n log n (log n) ½ 2 2n +1 22 = n 1/log n < log(log n) < (log n) ½ < log n < 2 (log n)/2 < n = 2 log n < n logn < n2 = 4 log n < n3 < n log(log n) < (3/2) n < 2 n < n 2 n < e n < 2 2n +1 < n ! < (n+1) ! 1 n lo gn 2lo g [n 1 lo gn 1 ] 2 lo gn lo gn 21 2 log n = n log 2 = n 2. a) Escribe un algoritmo para encontrar la mediana de tres enteros distintos a, b y c. b) Describe D, el conjunto de entradas para tu algoritmo, a la luz de la discusión del ejemplo de búsqueda secuencial en la cual se calculó el tiempo promedio. c) ¿Cuántas comparaciones efectúa tu algoritmo en el peor de los casos? ¿En el promedio? d) ¿Cuántas comparaciones son necesarias en el peor de los casos para encontrar la mediana de tres números? a) if a > b then if b > c return(b) else if a > c return(c) else return(a) else if a > c return(a) else if b > c return(c) else return(b) b) Denotando por m = mínimo, = medio, M = máximo, cada permutación de (m,,M) nos dará una instancia diferente. Y el número de permutaciones distintas son 3! = 6. c) Peor de los casos: 3 comparaciones Caso promedio 1/6 (2) + 1/6(3) + 1/6 (3) + 1/6 (2) + 1/6(3) + 1/6 (3) = 1/6(16)= 8/3 d) 3 comparaciones 3. Supón que la función Q está definida para todas las potencias de 2, y está descrita mediante la siguiente relación de recurrencia y condición frontera : Q(n) = n – 1 + 2 Q(n/2) ; Q(1) = 0 Encuentra una forma cerrada para Q. Hint : haz el siguiente cambio de variable. n = 2k. Con este cambio, escribe Q(n) = Q(2k) = T(k) y escribe la recurencia en función de k. Haciendo el cambio de variable sugerido, ya que n/2 = 2k-1 se obtiene la relación de recurrencia en términos de k: T(k) = (2k – 1) + 2 T(k-1) ; T(0) = 0 Desarrollando esta relación, llegamos a la relación equivalente: T(k) = j2k – (1 + 2 + 22 + 23 + …+2j-1) + 2j T(k-j) Así que cuando j = k, llegamos hasta T(0) = 0, T(k) = k2k – (1 + 2 + 22 + 23 + …+2k-1) + 2k T(0) T(k) = k2k – (2k -1) T(k) = (k-1)2k + 1 Volviendo a la variable n obtenemos: Q(n) = (log n –1) n + 1 La cual es la forma cerrada requerida. 4. a) Escribir un algoritmo para Maxsort suponiendo un arreglo L de tamaño n. El algoritmo find_max (L, size) es el que se encuentra descrito en la diapositiva # 24. “Encontrar la máxima componente en L” Input: Output: n, L L ordenado for i = n down to i = 2 do find_max(L, i) L[max] L[i] b) ¿Cuántas comparaciones se efectúan en el peor de los casos? Para encontrar el máximo elemento en un arreglo de tamaño k se requieren k-1 comparaciones, así que en este caso se requieren: (n-1)+(n -2) + ...+ 1 = n (n-1) / 2 = (n2 – n)/ 2 = (n2). 5. Considera la siguiente variante de Ordenamiento por Inserción : Para 2 j n, insertar L[j] entre L[1] L[2] … L[j-1], efectuar una búsqueda binaria para encontrar la posición correcta de L[j]. a) ¿Cuántas comparaciones se efectuarían en el peor de los casos? Para cada inserción, se requieren O(log n) comparaciones para encontrar la posición correcta, así que el total de comparaciones en el peor de los casos es O(n logn). b) ¿Cuál es el número total de elementos que deben de moverse en el peor de los casos? Para cada inserción puede ser que necesitemos mover todos los elementos, esto se daría en el caso en el cual el arreglo esté ordenado en sentido decreciente, así en cada iteración, se requiere n movimientos, resultando en O(n2) movimientos. c) ¿Cuál es el orden del tiempo de ejecución en el peor de los casos? Max(n log n, n2) = O(n2), esto es el mismo tiempo que si no usáramos búsqueda binaria. d) ¿Podría reducirse el número de movimientos colocando los elementos en una lista encadenada en vez de un arreglo? Explicar. Sí se puede reducir el número de movimientos a O(1), desafortunadamente en una lista encadenada no se puede llevar a cabo búsqueda binaria, se debe de hacer la búsqueda lineal, lo cual consume O(n) comparaciones, y el tiempo de ejecución será nuevamente O(n2). 6. Ordenamiento por inserción puede expresarse como un procedimiento recursivo de la siguiente manera. Para ordenar A[1..n] , ordenamos recursivamente A[1..n-1] y luego insertamos A[n] en el arreglo ordenado A[1..n-1]. Escribe una relación de recurrencia para el tiempo de ejecución. Para insertar el elemento en la posición n dentro del arreglo de tamaño (n-1) se requieren n-1 comparaciones en el peor de los casos, así que la relación de recurrencia sería: T(n) = n + T(n-1) T(1) = 1