ANÁLISIS DE ALGORITMOS TC-4001 ALGUNAS SOLUCIONES A LA TAREA # 2 O

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