1. Análisis de
Algoritmos
Pablo Vargas Boccanedes
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
2. TAREA 1
Guayaquil, Julio de 2009
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
3. Introducción
En esta sección analizaremos algoritmos de ordenamiento y
búsqueda, para lo cual calcularemos sus tiempos de ejecución en
función del tamaño de las instancias.
Entre los objetivos tenemos como más importante la
interpretación de los resultados y la comprensión de una mejor
manera los mismos.
Otro de los objetivos importantes es presentar los métodos que
nos ayudarán a elegir entre algoritmos de diferente implementación
en función de nuestro medio, mediante el análisis de los tiempos de
ejecución y utilización de memoria que son principalmente los
limitantes en los ordenadores y equipos donde correrán dichos
algoritmos.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
4. Teoría
Para la resolución de los problemas propuestos utilizaremos los
métodos Algebraico, que consiste básicamente en desarrollar varios
términos de la ecuación de tiempo hasta encontrar un patrón de
repetición y ejecutar una solución, Iterativo que consiste como el
algebraico en desarrollar términos pero de una forma gráfica
ayudándonos con un árbol binario.
Para expresar las soluciones nos ayudaremos de las Notaciones
Asintóticas, como son O, Ω y θ, con sus definiciones que detallaré a
continuación:
f(n) є O(g(n)) c,n0 n≥ n0 f(n)≤cg(n)
f(n) є Ω(g(n)) c,n0 n≥ n0 f(n)≥cg(n)
f(n) є θ(g(n)) c1,c2,n0 n≥ n0 c1g(n) ≤f(n)≤c2g(n)
TEOREMA:
f(n) є Ω(g(n)) ^ f(n) є Ω(g(n)) f(n) є θ(g(n))
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
5. EJERCICIOS
1.- Escriba el pseudocódigo para el algoritmo que ordena una secuencia por selección.
Discuta por qué es correcto este algoritmo. Exprese en notación Ω los tiempos de ejecución
para el peor y para el mejor de los casos de este algoritmo.
Solución:
para i=1 hasta n-1
minimo = i;
para j=i+1 hasta n
si lista[j] < lista[minimo] entonces
minimo=j
fin si
fin para
intercambiar (lista[i], lista[minimo]
fin para
Entonces, tenemos que se repite n-1 veces el lazo interno que consiste en n repeticiones,
rápidamente tenemos la idea de lo que será la solución considerando la operación básica
más significativa que es la de comparación.
t(n) = n + t(n-1)
t(n) = (n-1) + (n-2) + (n-3)+ .. + 3 + 2 + 1
t(n) = ( )
De aquí suponemos que t(n) є Ө ( ) entonces debemos demostrarlo,
( )єӨ( ) c1,c2,n0 n≥ n0 c1 ≤ ( ) ≤c2
( ) ≤ c1 ( ) ≥ c2
- ≤ c1 - ≥ c2
- ≤( - ≥(
- ≤( - ≥(
=1 =1 d! = =1 d!
Como encontramos los valores de las constantes damos como demostrado el resultado
propuesto.
Para este ejercicio y dado que solo consideramos la operación de comparación como
principal, el tiempo en el mejor, peor y promedio de los casos es el mismo.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
6. 2.- Considere el algoritmo de búsqueda secuencial (o lineal) cuando la secuencia no
necesariamente esta ordenada. En promedio, ¿Cuántos elementos de la secuencia necesitan
ser comparados?, suponga que el elemento buscado podría ser cualquiera con la misma
probabilidad. ¿Cuántas comparaciones son necesarias en el peor de los casos? Exprese los
tiempos de ejecución promedio y en el peor de los casos de este algoritmo empleando la
notación-teta.
Solución:
El tiempo promedio estará dado por el producto de la suma de los casos con su
probabilidad.
t(n)=Pkt(k) D!
t(n)=Pk c,n0 n≥ n0 n ≤ cn
t(n)= n ≤ cn
t(n)= [ ] c=1 n=1 d!
t(n)= c,n0 n≥ n0 n cn
t(n) ≤ n c= n=1 d!
t(n) є Ө (n) t esperado є O (n)
En el peor de los casos, esto es cuando el elemento buscado se encuentra en la última
posición o no se encuentra, tendríamos que hacer cuantas comparaciones como elementos
tengamos, esto es n comparaciones.
t(n) = n comparaciones
t(n) є Ө(n) D!
c,n0 n≥ n0 n ≤ cn
n ≤ cn
c=1 n=1 d!
c,n0 n≥ n0 n cn
c= n=1 d!
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
7. 3.- Con respecto al problema de buscar al elemento x en una secuencia A de longitud n,
note que si la secuencia esta ordenada y comparamos x con el elemento en la mitad de la
secuencia, la búsqueda de x en la secuencia se reduce a la búsqueda de x en una secuencia
ordenada de tamaño aproximadamente igual a la mitad del tamaño de A. El algoritmo de
búsqueda binaria repite este procedimiento, dividiendo cada vez la porción restante de la
secuencia por 2. Discuta lo correcto de esta solución. Escriba el pseudocódigo de este
procedimiento de búsqueda, ya sea en la forma recursiva o iterativa. Argumente a favor de
la hipótesis de que el tiempo de ejecución de este algoritmo en el peor de los casos es
teta(lg n). (lg n es el logaritmo base 2 de n)
Solución:
//Implementación recursiva
static int binSearch(double v[], int izq,int der,double buscado){
int centro = (izq+der)/2;
if(izq>der) return -1;
else if (buscado==v[centro]) return v[centro];
else if (buscado<v[centro]) return binSearch(v, izq, centro-1,buscado);
else return binSearch(v,centro+1,der,buscado);
}
Si dividimos la secuencia ordenada por la mitad, comparar con el elemento del
medio y saber su relación de desigualdad, el problema se traducirá a resolver un problema
del mismo tipo pero de la mitad del tamaño original y así hasta tener un solo elemento que
será o no la respuesta.
La partición será en pero para grandes valores de n, hacemos la aproximación de
por lo tanto tenemos que:
En el peor de los casos, cuando el elemento buscado se encuentra en un extremo, es
decir es el menor o el mayor de la secuencia, tendremos:
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
8. suma de niveles n
0 n
suma de niveles n/2
1 n/2
suma de niveles n/4
2 n/4
suma de niveles n/2^(k-1)
... ...
suma de niveles 1
k 1
El tiempo en el peor de los casos, será dado por la suma de los elementos del último nivel
es decir, en este caso, k*1=k
t(n)=k en el último nivel, n/2^k=1 de aquí, k=lg(n)
t(n)=lg(n)
t(n) є Ө (lgn) D!
c,n0 n≥ n0 lgn ≤ clgn
lgn ≤ clgn
c=1 n=1 d!
c,n0 n≥ n0 lgn clgn
c= n=1 d!
El mejor de los casos de en este algoritmo sería cuando el elemento buscado se encuentra
en el lugar por donde se ejecuta la partición, y el tiempo sería constante Ө(1)
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
9. 4.- Diga si la hipótesis 2n+1 = O(2n) es verdadera. Diga si 22n = O(2n) lo es.
Solución:
2n+1 = O(2n) es verdadera
Demostración!
c,n0 n≥ n0 2n+1 ≤ c2n
2*2n≤c2n
2≤c
c=2 n=1 d!
Para cualquier valor de n, con una constante de c > 2, será válida la expresión.
22n = O(2n) falso
Demostración!
c,n0 n≥ n0 22n ≤ c2n
22n ≤ c2n
2n ≤ c
Dado que tenemos una función exponencial que no puede tomar valores de cero ni menor
que dicho valor, para grandes valores de n será siempre mayor que un valor constante, por
lo tanto la hipótesis es no válida.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
10. 5.- Demuestre que el tiempo de ejecución del un algoritmo es Θ(g(n)) si y solo si el tiempo
de ejecución del peor de los casos es O(g(n)) y del mejor de los casos es Ω(g(n)).
Solución: t(n) Ө(g(n))
Para demostrar partiremos de los datos que nos da el problema, luego plantearemos
nuestro destino, y por métodos algebraicos intentaremos llegar a una expresión equivalente.
Traduciendo el enunciado:
t(n) Ө(g(n)) tp(n) O(g(n)) ^ tm(n) є Ω(g(n))
tp(n)≤cg(n) ^ tm(n)≥cg(n)
Sabemos que el tiempo en el mejor de los casos es una función menor a la del tiempo
promedio, y que la función de tiempo en el peor de los casos es mayor a la del tiempo
promedio, así, traduciendo lo que escribimos:
tm(n) ≤ t(n) ≤ tp(n)
Luego, escribiendo esto en notación asintótica, tenemos que:
t(n) O(tp(n)) ^ t(n) Ω(tm(n))
Combinando: t(n) ≤ tp(n) ≤ cg(n) ^ t(n) ≥tm(n) ≥cg(n)
t(n)≤cg(n) ^ t(n) ≥cg(n)
t(n) O(g(n))^t(n) Ω(g(n))
Por el teorema que se describe en la teoría,
f(n) є Ω(g(n)) ^ f(n) є Ω(g(n)) f(n) є θ(g(n))
Entonces llegamos a t(n) Ө (g(n)) que fue la suposición inicial y queda demostrado.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
11. 6.- Sea A[1 ... n] una secuencia de n números distintos. Se define como inversión de A al
par (i, j) tal que siendo i<j, A[i] > A[j].
Liste las cinco inversiones de la secuencia 2, 3, 8, 6, 1
Que secuencia de elementos tomados del conjunto {1, 2, …, n} tiene el mayor
número de inversiones. ¿Cuántas tiene?
¿Cuál es la relación entre el tiempo de ejecución del algoritmo que ordena por
inserción y el número de inversiones en la secuencia de entrada? Justifique su
respuesta.
Solución:
2, 3, 8, 6, 1: (2,1), (3,1), (8,1), (6,1),(8,6)
El conjunto con mayor número de inversiones será aquel que esté ordenado de manera
descendente, y serán las siguientes inversiones:
(n-1)+(n-2)+(n-3)+(n-4)+… +2+1 // (n-1) términos
(n-1)n-(1+2+3+… +(n-1))
(n-1)n – (1+2+3+… + n) +1
+1 –
+1 -
- +1 inversiones.
Ambos algoritmos tienen el mismo tiempo de ejecución O ( , que en este caso está dado
por número de comparaciones, el algoritmo de ordenamiento por inserción, Insertion Sort,
hace las mismas comparaciones entre todos los elementos del conjunto recorriéndolo de
izquierda a derecha.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
12. 7.- Demuestre que lg(n!) = Ө(n lgn) y que n! = o(nn)
Solución:
lg(n!) = Ө(n lgn)
lg(n!) є θ(nlgn) c1,c2,n0 n≥ n0 c1nlgn ≤lgn≤c2nlgn
lg(n!) ≤ cnlgn lg(n!) ≥ cnlgn
lg(n!) ≤ lg lg(n!) ≥ lg
n! ≤ c=1 n! ≥
n(n-1)(n-2)(……)(2)(1) ≤ n*n*n*n*…*n n(n-1)(n-2)(..)(2)(1) ≥ n*n*n*n*…*n
(n términos) (n términos) (n términos) (n/2 términos)
≥
Término a término, es mayor. ( )≥1
( )≥( +… + )
Término a término el lado izquierdo es mayor
n! = o(nn)
n! o(nn) Ro={n!, | = 0}
= 0,
Dado que el elemento denominador es mayor que el numerador, para valores muy
grandes de n, el límite tenderá a cero. Con lo que demostramos que n! o(nn)
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
13. 8.- Para cada una de las siguientes expresiones, diga si es verdadera o falsa y demuestre su
respuesta:
n8 = Ω(n9)
O(f(n)) * O(g(n)) = O(f(n) * g(n))
f(n) = O(g(n)) implica que 2f(n) = O(2g(n))
C(n, c) = O(nc), donde C(n, c) es el numero de combinaciones sin repetición c de n.
C(n, c) = Ω(nc)
n8 Ω(n9) verdadero
c,n0 n≥ n0 n8 c n9
-1
n ≥c
c= n0=1
O(f(n)) * O(g(n)) = O(f(n) * g(n)) verdadero
cf(n) es una función menor que f(n) por lo tanto cf(n) O(f(n)) ; c<1
sg(n) es una función menor que g(n) por lo tanto sg(n) O(g(n)); s<1
cf(n)*sg(n)= O(f(n) * g(n))
(c*s)(f(n)*g(n)) = O(f(n) * g(n))
Basándonos en el teorema que dice que “La multiplicación de 2 números menores que 1
devuelve otro valor menor que 1”, podemos asegurar que k es menor que 1, que s y que c.
k(f(n)*g(n)) < f(n)*g(n) k(f(n)*g(n)) O(f(n) * g(n))
Reescribiendo como planteamos al principio:
O(f(n)) * O(g(n)) = O(f(n) * g(n))
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
14. f(n) = O(g(n)) implica que 2f(n) = O(2g(n)) verdadero
En la primera parte tenemos que: c,n0 n≥ n0 f(n)≤ cg(n) esto implica que
f(n)≤g(n)
En la segunda, que: c,n0 n≥ n0 2f(n) ≤ c2g(n)
Trabajaremos con la segunda parte y trataremos de llegar a la primera.
2f(n) ≤ c2g(n)
2f(n)-g(n) ≤ c
f(n)-g(n) ≤ lg(c )
Si c=1,
f(n) ≤ g(n)
C(n, c) = O(nc), donde C(n, c) es el numero de combinaciones sin repetición c de n.
O(nc) verdadero
c,n0 n≥ n0 ≤ s nc
≤ s término menor que uno ≤ s s=1
En el numerador tenemos c elementos, como hay una substracción, el numerador es
<< n, al agregarle al denominador un nc , éste se hace bastante mayor para grandes
valores de n, al suceder esto, el término se hace menor o igual que 1 y este es nuestro
valor para s y damos como demostrado el ejercicio.
C(n, c) = Ω(nc) falso
c,n0 n≥ n0 ≥ s nc
≥s
No existen valores de s para validar la inecuación, por lo que declaramos el enunciado
como falso. No existen los valores porque n se hará cero con valores menores que c, y
con n=c, la expresión tiende a cero valor que s no puede tomar.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.
15. CONCLUSIÓN
Hemos revisado conceptos de Notaciones Asintóticas y su utilidad,
además resolvimos problemas por los métodos antes mencionados
como el Algebraico e Iterativo, ya podemos analizar cualquier
algoritmo recursivo o iterativo que pueda ser resuelto por dichos
métodos
Los ejercicios 7 y 8 son los de mayor dificultad en esta tarea, el
ejercicio 8 incluye gran parte de lo revisado hasta este momento en
el curso.
Análisis de Algoritmos. Término I 2009. Ing. Carlos Jordán Autor: Pablo Vargas B.