Está en la página 1de 29

Análisis de Algoritmos

Introducción

Basado en el Texto “Algoritmos en C++” , Robert


Sedgewick, y
“Estructura de Datos, Algoritmos y Programación
orientada a Objetos” , Gregory L. Heileman
Introducción
• TAD’s Tipo Abstracto de Datos
– En estructura de Datos, la problemática se
centró en la representación de los Datos y el
conjunto de Operaciones (funciones) de
sobre ellos.
TAD’s={Estructura de Datos + Operaciones}
Ejemplo: Matriz M
ObtenerElemento(i,j,M)
Sumar(M1,M2)
Producto(M1,M2)…
Introducción
• Problema Fundamental

Sea A={a1,a2,a3,..,an}, un conjunto de


algoritmos que resuelven un problema P,
cada una con alguna Estructura de Datos.
Cual algoritmo es más eficiente?
En tiempo CPU, espacios de Memoria o ambas
Introducción
• En el Análisis de Algoritmos, el criterio de
selección está definido por tiempo de
CPU, esto implica que serán más eficiente
el programa es más rápido.
Introducción
• Volúmen n.
– La rapidez de un progrma P es medida en
relación a alguna “Carga” o volumen de
tamaño n de datos:
Ej.
P(n): ordena n datos enteros
P(n): calcula factorial de n
P(p,q): calcula la determinante de una matriz
de tamaño pxq, n=p*q.
Introducción
• Tiempo T(n).
– Se define T(n) como la rapidez con que se
“ejecuta” un algoritmo con una entrada de
datos de tamaño n.
– T(n) se mide en términos de cantidad de
operaciones necesarias para concluir el
programa.
Introducción
• Calcular el factorial de n.
• Volumen n
int factorial(int n)
{ int fact=1;
for(i=1;i<=n;i++) fact=fact*i;
return (fact);
}
Volumen : el valor entero n
Introducción
• Calculando el factorial de un entero n utilizando un
algoritmo lineal ( secuencial).

int factorial(int n)
{ int fact=1;
for(i=1;i<=n;i++) fact=fact*i;
return (fact);
}
• Tiempo T(n)

T(n) = 1 +1+ n consultas + n sumas + n multiplicaciones


+ n asignaciones
T(n) = (2 + 4n) operaciones
Introducción
• Calculando el factorial de un entero n utilizando un
algoritmo lineal ( secuencial).

int factorial(int n)
{ int fact=1;
for(i=1;i<=n;i++) fact=fact*i;
return (fact);
}
• Tiempo T(n)

Si T(n) = número de multiplicaciones necesarias


Entonces T(n) = n mutiplicaciones
Introducción
• Calculando el factorial de n, utilizando la
definición RECURSIVA factorial(n) como
sigue:

1 si n>0
factorial (n) =
factorial(n-1) * n si n=0
Introducción
Tiempo T(n) Si T(n) = multiplicaciones
Necesarias, entonces:

int factotrial (int n) 0 ;si n=0


{ if n=0 return 1; T(n)=
return(factorial(n-1)*n); T(n-1)+1 ;si n >0
}
Introducción
• Probando T(n) por inducción matemática
Buscando una hipótesis, basado solamente en
el algoritmo.
T(0) = 0
T(1) = 1
T(2) = 2
T(3) = 3
:
T(n) = n ???
Introducción
• Resolviendo por inducción matemática
Sea Q una proposición a demostrar
Se intenta probar que Q es válida para todo n>= n0

1. Probar que Q es válida para n0


2. Suponer que Q es válida para todo entero <= n-1
(Hipótesis de inducción)
3. Probar que Q es válido para todo n
Introducción
• Resolviendo por inducción matemática

Proposición Q = { T(n) = n}

Probar que Q es válida para n0 = 0


T(0) = 0, Q se cumple, por simple vista del algoritmo.
Suponer que Q es válida para todo entero 0<k<= n-1 (Hip. De
Inducc)
T(k) = k
Probar que Q es válido para todo n, utilizando la Hip. de Inducc.
T(n) = T(n-1) +1
= (n-1+1) + 1
= n+1
Introducción
• Torres de Hanoi
– El problema de las torres de Hanoi se puede resolver
recursivamente:

• Inicialmente los n Discos están en el poste A


• Los n-1 disco superiores de A son trasladados al poste B
• El único disco restante es del poste A se mueve al poste C
• Los n-1 discos del poste B son trasladados al poste C.
Introducción
• Problema de LasTorres de Hanoi
Definiremos una función Hanoi() como sigue:
Hanoi(n,A,B,C) mueve n Discos desde A a C, usando B

Hanoi(int n,A,B,C)
{ if(n=1) mover disco superior de A a C return;
Hanoi(n-1,A,C,B);
mover disco superior de A a C;
Hanoi(n-1,B,A,C)
}
Introducción
• Calculando T(n) para Problema de las Torres de Hanoi,
donde N es la cantidad de movimientos de discos.

1 si n=1
T(n)=
2T(n-1)+1 si n >1
Introducción
Buscando una hipótesis, basado solamente en
el algoritmo.
T(1) = 1
T(2) = 3
T(3) = 7
T(4) = 15
:
T(n) = 2n -1 ???
Introducción
• Resolviendo por inducción matemática

Proposición Q = { T(n) = 2n - 1}

Probar que Q es válida para n0 = 1


T(1) = 1, Q se cumple, por simple vista del algoritmo.
Suponer que Q es válida para todo entero 1<k<= n-1 (Hip. De Inducc)
T(k) = 2k - 1
Probar que Q es válido para todo n, utilizando la Hip. de Inducc.
T(n) = 2T(n-1) +1
= 2(2n-1-1) + 1
= 2n-1
Introducción
• Análisis Asintótico
Definición 1
Sean f(n) y g(n) dos funciones [f,g : Z+ → R+]. Se
dice que f(n) es “O grande” de g(n) y se escribe
como:
f(n) = O(g(n))
Si existen dos constantes positivas c,n0 tal que
f(n) ≤ c g(n) para todo n≥ n0
Introducción
• Propiedades
3- Se puede demostrar que
O(g(n)2) = O(g(n)*g(n)) = O(g(n))*O(g(n))

Así, Similarmente O((lg n)2) = O(lg n)2


Introducción
• Ejemplo 1
Sea f(n)=n3 + 20 n2 + 100 n

f(n) = O(g(n))
Puesto que:
n3 + 20 n2 + 100 n <= n3 + 20 n3 + 100 n3 = 121 n3
Escogiendo C = 121 y n0 = 0
Es suficiente para que se cumpla la definición
Introducción
• Otro ejemplo, sea f(n)=lg n, y g(n)=(n/4)2
Podemos observar que:
g() g(n) < f(n) para todo n, tal que a < n < b.

Será que g(n) = O(f(n))?, la respuesta es NO


f()
pues si hacemos n0=a, la igualdad anterior no
se cumple para n > b, y por lo tanto no se
cumple para todo n > n0.

g()<=f() g()>f() Será que f(n) = O(g(n))?, la respuesta es SI


pues si hacemos n0=b, la igualdad anterior si se
a b
cumple para n > b, y por lo tanto se cumple para
todo n > n0. Lo anterior considerando por
ejemplo c=1.

Nota: de aquí en adelante,


lg n corresponde a log2 n
TALLER 2
Problema:
Buscar la o las cartillas ganadoras en el juego de azar
KINO, considere 1.000, 10.000, 100.000 cartillas. Se pide:

• Revisar los algoritmos fundamentales de


búsqueda.
• Implementar en C++ o Java
• Obtener f(n) para cada uno de ellos
• Comprobar f(n) graficando el comportamiento
del algoritmo para los diferentes volúmenes de
datos.
Introducción

• Análisis Asintótico
Definición 2
Sean f(n) y g(n) dos funciones [f,g : Z+ → R+]. Se
dice que f(n) es “Omega grande” de g(n) y se
escribe como:
f(n) = Ω(g(n))
Si existen dos constantes positivas c y n0 tal que
f(n) ≥ c g(n) para todo n≥ n0
Introducción
• Ejemplo, sea f(n)=lg n, y g(n)=(n/4)2

g() Será que f(n) = Ω(g(n))?, la respuesta es


NO porque no se puede encontrar c y n0
f() que satisfaga f(n) que satisfaga f(n) ≥
cg(n) para todo n ≥ n0.

Será que g(n) = Ω(f(n))?, la respuesta es


g()<=f() g()>f()
SI pues si hacemos n0=b, la igualdad
a b
anterior si e cumple para c=1 y n ≥ b, y
por lo tanto se cumple para todo n > n0.
Introducción
• Así tenemos que
• f(n)=Ω(g(n) ssi g(n)=O(f(n))

• Esta simetría implica que las propiedades


que se cumple para O() también se
cumple para Ω().
Introducción
• Análisis Asintótico
Definición 3 (Cota Asintótica)
Sean f(n) y g(n) dos funciones [f,g : Z+ → R+]. Se
dice que f(n) es “Theta grande” de g(n) y se
escribe como:
f(n) = Θ(g(n))
Si existen dos constantes positivas c1 c2, y n0 tal
que
c2 g(n) ≤ f(n) ≤ c2 g(n) para todo n≥ n0
Introducción
• Por la definición 1 y 2, podemos expresar:

• f(n) = Θ(g(n)) ssi f(n)=O(g(n)) y g(n)=Ω(f(n))

Pues ambas en conjunto aseguran la existencia


de dos constantes positivas c1 c2, y de n0 tal
que c2 g(n) ≤ f(n) ≤ c2 g(n) para todo n≥ n0

También podría gustarte