Vous êtes sur la page 1sur 36

ANALISIS DE ALGORITMOS

Objetivos
El anlisis de algoritmos es una parte importante
de la Teora de complejidad computacional ms
amplia, que provee estimaciones tericas para los
recursos que necesita cualquier algoritmo que
resuelva un problema computacional dado.
Estas estimaciones resultan ser bastante tiles en
la bsqueda de algoritmos eficientes.
A la hora de realizar un anlisis terico de
algoritmos es corriente calcular su complejidad
en un sentido asinttico, es decir, para una
tamao de entrada suficientemente grande.
Contenido
1. Introduccion
2. Tiempos de Algoritmos
3. Complejidad Algortmica
INTRODUCCION
En las Ciencias de la Computacin cuando se dice que un problema tiene solucin, significa que
existe un algoritmo susceptible de implantarse en una computadora, capaz de producir la respuesta
correcta para cualquier instancia del problema en cuestin.
Para ciertos problemas es posible encontrar ms de un algoritmo capaz de resolverlos, lo cual nos
enfrenta al problema de escoger alguno de ellos. La tarea de decidir cul de ellos es el mejor ,debe
basarse en criterios acordes a nuestros intereses. En la mayora de los casos la eleccin de un buen
algoritmo est orientada hacia la disminucin del costo que implica la solucin del problema; bajo
este enfoque es posible dividir los criterios en dos clases:
a) Criterios orientados a minimizar el costo de desarrollo: claridad, sencillez y facilidad de implantacin,
depuracin y mantenimiento.
b) Criterios orientados a disminuir el costo de ejecucin: tiempo de procesador y cantidad de memoria
utilizados.
Si el programa que implanta el algoritmo se va a ejecutar unas cuantas veces, el costo de desarrollo
es dominante, en este caso se debe dar ms peso a los primeros criterios.
Por el contrario, si el programa se va a utilizar frecuentemente, dominar el costo de ejecucin, y
por }e, se debe elegir un algoritmo que haga uso eciente de los recursos de la computadora, es
decir, se le debe evaluar prioritariamente bajo los criterios de la segunda clase.
En cualquier caso, ninguno de los criterios de evaluacin debe eliminarse por completo; pues, por
ejemplo, si se implanta un sistema con algoritmos muy eficientes pero confusos, puede suceder
que despus no sea posible darle el mantenimiento adecuado.
Los recursos que consume un algoritmo pueden estimarse mediante herramientas tericas y
constituyen, por lo tanto, una base contable para la eleccin de un algoritmo.
En las Ciencias de la Computacin, la actividad dedicada a determinar la cantidad de recursos que
consumen los algoritmos se le denomina anlisis de algoritmos.
Tiempos de Algoritmos
Definicin de Algoritmo
Un algoritmo es una serie finita de pasos para
resolver un problema.
Definicin de Algoritmo
Un algoritmo es una serie finita de pasos para resolver un problema.
Hay que hacer nfasis en dos aspectos para que un algoritmo exista:
1. El nmero de pasos debe ser finito. el algoritmo debe terminar en un
tiempo finito con la solucin del problema,
2. El algoritmo debe ser capaz de determinar la solucin del problema.
Asi, podemos definir algoritmo como un "conjunto de reglas operacionales
inherentes a un cmputo".
Sera un error creer que los algoritmos son exclusivos de la informtica.
Tambin son algoritmos los que apr}emos en la escuela para multiplicar y
dividir nmeros de varias cifras.
Siempre que se desee resolver un problema hay que plantearse qu
algoritmo utilizar. La respuesta a esta cuestin puede dep}er de
numerosos factores, a saber, el tamao del problema, el modo en que est
planteado y el tipo y la potencia del equipo disponible para su resolucin.
Definicin de Algoritmo
Caractersticas de un algoritmo
1. Entrada: definir lo que necesita el algoritmo
2. Salida: definir lo que produce.
3. No ambiguo: explcito, siempre sabe qu comando ejecutar.
4. Finito: El algoritmo termina en un nmero finito de pasos.
5. Correcto: Hace lo que se supone que debe hacer. La solucin es
correcta
6. Efectividad: Cada instruccin se completa en tiempo finito.
Cada instruccin debe ser lo suficientemente bsica como
para que en principio pueda ser ejecutada por cualquier
persona usando papel y lpiz.
7. General: Debe ser lo suficientemente general como para
contemplar todos los casos de entrada.
Definicin de Algoritmo
Su ejecucin requiere unos recursos.

0 ms 1 ms
ALGORITMO
entradas salidas

Un algoritmo es mejor cuantos menos recursos consuma.


Pero....
Definicin de Algoritmo
Otros criterios:
Programacin: facilidad de programarlo, corto, fcil de entender,
robusto...
Criterio empresarial: Maximizar la eficiencia
Eficiencia: Relacin entre los recursos consumidos y los productos
conseguidos.
Recursos consumidos:
Tiempo de ejecucin.
Memoria principal.
Entradas/salidas a disco.
Comunicaciones, procesadores,...
Lo que se consigue:
Resolver un problema de forma exacta.
Resolverlo de forma aproximada.
Resolver algunos casos...
Definicin de Algoritmo
Factores que influyen en el consumo de recursos:
Factores externos.
El ordenador donde se ejecute.
El lenguaje de programacin y el compilador usado.
La implementacin que haga el programador del algoritmo.
En particular, de las estructuras de datos utilizadas.
Tamao de los datos de entrada.
Ejemplo. Procesar un fichero de blog: nmero de mensajes.
Contenido de los datos de entrada.
Mejor caso (tm). El contenido favorece una rpida ejecucin.
Peor caso (tM). La ejecucin ms lenta posible.
Caso promedio (tp). Media de todos los posibles contenidos.
Definicin de Algoritmo
Razones para Estudiar los Algoritmos
Con el logro de computadores cada vez ms
rpidos se podra caer en la tentacin de
preguntarse si vale la pena preocuparse por
aumentar la eficiencia de los algoritmos.
No sera ms sencillo aguardar a la siguiente
generacin de computadores?
Definicin de Algoritmo
Recursos consumidos. Resolver algunos casos...
Ejemplo. Cuntos recursos de tiempo y memoria
consume el siguiente algoritmo sencillo?
i:= 0
a[n+1]:= x
repetir
i:= i + 1
hasta a[i] == x
Respuesta: Depende.
De qu depende?
De lo que valga n y x, de lo que haya en a, de los tipos
de datos, de la mquina...
Definicin de Algoritmo
Los factores externos no aportan informacin sobre el
algoritmo.
Conclusin: Estudiar la variacin del tiempo y la
memoria necesitada por un algoritmo respecto al
tamao de la entrada y a los posibles casos, de forma
aproximada (y parametrizada).
Ejemplo. Algoritmo de bsqueda secuencial.
Mejor caso. Se encuentra x en la 1 posicin:
tm(N) = a
Peor caso. No se encuentra x:
tM(N) = bN + c
Ojo: El mejor caso no significa tamao pequeo.
Definicin de Algoritmo
Normalmente usaremos la notacin t(N)=..., pero qu
significa t(N)?
Tiempo de ejecucin en segundos. t(N) = bN + c.
Suponi}o que b y c son constantes, son los segundos que tardan
las operaciones bsicas correspondientes.
Instrucciones ejecutadas por el algoritmo.
t(N) = 2N + 4.
Tardarn todas lo mismo?
Ejecuciones del bucle principal. t(N) = N+1.
Cunto tiempo, cuntas instrucciones,...?
Sabemos que cada ejecucin lleva un tiempo constante, luego
se diferencia en una constante con los anteriores.
Definicin de Algoritmo
El proceso bsico de anlisis de la eficiencia algortmica es el
conocido como conteo de instrucciones (o de memoria).

Conteo de instrucciones: Seguir la ejecucin del algoritmo,


sumando las instrucciones que se ejecutan.
Conteo de memoria: Lo mismo. Normalmente interesa el
mximo uso de memoria requerido.
Alternativa: Si no se puede predecir el flujo de ejecucin se
puede intentar predecir el trabajo total realizado.
Ejemplo. Recorrido sobre grafos: se recorren todas las
adyacencias, aplicando un tiempo cte. en cada una.
Definicin de Algoritmo
Conteo de instrucciones. Reglas bsicas:
Nmero de instrucciones t(n) sumar 1 por cada instruccin o lnea de
cdigo de ejecucin constante.
Tiempo de ejecucin t(n) sumar una constante (c1, c2, ...) por cada tipo
de instruccin o grupo de instrucciones secuenciales.
Bucles FOR: Se pueden expresar como un sumatorio, con los lmites del
FOR como lmites del sumatorio.
n b n

i=1
k= kn
i=a
k = k(b-a+1)
i=1
i= n(n+1)/2
b n
n
rb+1 ra n

i=a
ri =
r1

i=1
i2 i2 di = (i3)/3 ] = (n3)/3
0 0
Definicin de Algoritmo
Conteo de instrucciones. Reglas bsicas:
Bucles WHILE y REPEAT: Estudiar lo que puede ocurrir. Existe
una cota inferior y superior del nmero de ejecuciones? Se
puede convertir en un FOR?
Llamadas a procedimientos: Calcular primero los
procedimientos que no llaman a otros. t1(n) , t2(n) , ...
IF y CASE: Estudiar lo que puede ocurrir. Se puede predecir
cundo se cumplirn las condiciones?
Mejor caso y peor caso segn la condicin.
Caso promedio: suma del tiempo de cada caso, por probabilidad
de ocurrencia de ese caso.
Definicin del Problema
Se desea comparar 2 algoritmos, A 1 y A 2 respecto a
su velocidad, asumio que A 1 y A 2 son equivalentes.
La velocidad de ejecucin es independiente de la
plataforma que esta utilizando, por ejemplo:
Si A 1 se ejecuta en una Pentium VI de 3Ghz y A 2
se ejecuta en una Pentium I de 800Mhz, entonces es
muy probable que A 1 se ejecute mucho mas rpido
siendo un algoritmo concebido lentamente
Tiempos de un Algoritmo
Para hacerlo indep}iente de la plataforma, se han ideado tiempos
enteros a cada sentencia del programa, utilizando una conjuncin:
Las llamadas a funciones o procedimientos tienen el tiempo que les
lleva a ellos ejecutarse.
Una asignacin simple tarda 1, por ejm:
1) x:=x+1; => 1
2) y:=2*x-1; => 1
3) y:=factorial(n); => No es Simple
Las comparaciones simples tardan 1, por ejm:
1) if (x=y) then => 1
2) if (x=3)or (y=5) then => 1
3) if (factorial(n)==120) then => Compuesta

Tiempos de un Algoritmo
Ejm 1: Encontrar el tiempo de ejecucin

Tabla de Conteo
Void uno(int n) Linea Tiempo
1 1
{ 2 1
x:=1; 3 1
Total 3
y:=x+1;
z:=0; Tuno(n) = 3
}
Tiempos de un Algoritmo
Ejm 2: Encontrar el tiempo de ejecucin

Void dos(int n) Tabla de Conteo


Linea Tiempo
{ x=3; 1 1
2 1
if (x==3) 3 1
4 1
t=x+1; Total 4
z=0; Tdos(n)=4
};
Tiempos de un Algoritmo
Ejm 3: Encontrar el tiempo de ejecucin
Void Tres(int n) Tabla de Conteo
{ n mod n mod 2
Linea
z=0; 2=0 <> 0
1 1 1
if (n mod 2==0)
2 1 1
{ 3 1 -
y=x+1; 4 1 -
z=0; 5 - 1
Total 4 3
}
else
z=z+1;
};
Tiempos de un Algoritmo
For i:=a to b do ====> b a + 2 Tabla de
{ Conteo
Cuerpo; ====> b a + 1 Linea Tiempo
}; 1 1
Ejm 4: Encontrar el tiempo de ejecucin 2 n-5+2
Void cuatro(int n) 3 1*(n-4)
{ 4 1*(n-4)
Total 3n-10
z:=3;
for (int i=5; i<= n; i++) Tcuatro(n) = 3n - 10
{
write (i);
t:=x+1;
};
};
Tiempos de un Algoritmo
Ejm 5: Encontrar el tiempo de ejecucin Tabla de Conteo
Linea Tiempo
Void cinco(int n) 1 N-5+2
{ 2 1+(n-4)
3 (n-1)*(n-4) (n-4)
for (i=5; i<=n;i++) 4 1* (n-2)*(n-4)
{ 5 3*(n-4)
m=0; 6 4*(n-4)
Total 2n 2 -2n-23
for( j=2;j<=n-1;j++)
m=m-1; Tcinco(n)=2n 2 -2n-23
uno(n);
dos(n);
}
};
Complejidad Algortmica
Concepto :
Mucho algoritmos, tienen la dificultad de que el
tiempo de conteo que ellos presentan es difcil de
calcular.
Por este motivo se busca una funcin que sea una
cota superior a la funcin tiempo.
Esta funcin se la consigue usando la O de Lagrange.
Definicin : Se dice T(n)=O(f(n)) sii c,n o >=0 Tal que
Vn=>n o T 1 (n) <=c*f(n)
Complejidad Algortmica
Teorema 1:
Si un algoritmo A con tiempo de conteo Ta(n) = O( f(n) )
entonces se dice que A tiene complejidad f(n).
Ejemplo:
T cinco (n)=2n -2n-23=O(n) Entonces se dice que
cinco tiene una complejidad n.
Teorema 2:
Si un algoritmo A con tiempo proporcional a k * f(n)
entonces el algoritmo A es proporcional a f(n).
Si T A (n)=O(k(f(n))) entonces T A (n)=O(f(n))
(Es decir las constantes no interesan, k>0)
Complejidad Algortmica
Demostracin :
Supongamos que T A (n)=O(k*f(n))
entonces por def. de O, c,n o >0
Tal que T A (n)=c*k*f(n) n>=n o
Si tomamos c 2 =c*k >0 T A (n)<=c 2 *f(n) T A (n)<=O(f(n))
Corolario:
Si T A (n)=k entonces T A (n)=O(1)
Ejemplo: T uno (n)=3=O(1) T dos (n)=4=O(1)
Es decir todo algoritmos con tiempos constante tiene
complejidad 1.
Complejidad Algortmica
Ejm 6: Tabla de Conteo
Linea Tiempo
Calcular la Complejidad
1 n-1+2
Void seis(int n) 2 3 * (n - 1 + 1)
{ Total 4n + 1

for (int i=1; i<= n; i++) Tseis(n) = 4n + 1


{
Tseis(n) = 4n + 1 = O(4n+1) = O(n)
uno(n);
}
}
Complejidad Algortmica
Teorema 3:
Si T A1 (n) = O( f 1 (n) ) y T A2 (n) = O( f 2 (n) )
entonces se dan las siguientes propiedades:
T A1 (n)+T A2 (n)= O( f 1 (n) + f 2 (n) )
T A1 (n)*T A2 (n)= O( f 1 (n) * f 2 (n) )
Teorema 4:
Si un algoritmo A tiene 2 sub-algoritmos A 1 y A 2
Supongamos que : T A1 (n) = O( f 1 (n) )
T A2 (n) = O( f 2 (n) )
entonces T A (n) = O( max{ f 1 (n), f 2 (n) )
Complejidad Algortmica
La herramienta que se presenta a continuacin llamada
tabla de complejidad esta basada en los teoremas
anteriores.
Tabla de Complejidad: La siguiente tabla se construye bajo el
sustento terico de los teoremas anteriores.

Tabla de Conteo
Linea Complejidad
1 O( f 1 (n))
2 O( f 2 (n))

n O( f n (n))
Total O( max{f 1 (n), f n (n)})
Complejidad Algortmica
Pero cual es la funcin mayor ?
La siguiente tabla se construye bajo el sustento terico
de los teoremas anteriores, por cada lnea se calcula su
complejidad y la complejidad total es obtenida
tomando la funcin mxima.
a (a>1) Mayor
n (k>=2)
n log n
n
log n
1 Menor
Complejidad Algortmica
Ejm 7: Tabla de Conteo
Encontrar la complejidad Linea Complejidad
procedure siete(int n) 1 1 = O(1)
{ 2 n-1+2 = O( n )
x:=7; 3 1*n = O( n )
4 (n-1)*n = O( n 2 )
for (i=1 ; i<= n; i++)
5 1*(n-2)*n= O( n 2 )
{ Total O(n2)
k:=k+1;
for (j=3 ; j<=n ; j++) Tsiete(n) = O(n2)
k:=k-1;
}
};
Complejidad Algortmica
Ejm 8: Encontrar la complejidad
Tabla de Conteo
Void ocho(v:array;int n)
Linea Complejidad
{
1 O(1)
mayor:=v[1];
2 O( n )
for (int i=2 ; i<=n ; i++) O( n )
3
{ 1 * O(n)
4
if(mayor>v[i]) O(n)
Total
{ Mayor:=v[i]; Tocho(n) = O(n)
}
}
};
Complejidad Algortmica
Teorema 5:
T QuickSort (n) = O( n log (n) )
T BusqBinaria (n) = O( n log 2 (n) )
T Hanoi (n) = O( 2 n )
T ShellSort (n) = O( n log (n) )
Teorema 6:
Sea Sort(n) un algoritmo de clasificacin para un vector V de N
elementos, luego:
T Sort (n) >= O( n log (n) )
Complejidad Algortmica
Ejm 9: Encontrar la complejidad Tabla de Conteo
Void nueve(int n) Linea Complejidad
{ for (int k=1 ; k<= n ; k++) 1 O(n)
2 O( n2 )
{
3 O( n 3 log n)
for (int i=k+1 ; i<= n; i++) 4 O(n log 2 n)
{ Total O(n3 log n)
Quicksort(k); Tnueve(n) = O(n3 log n)
}
p:=BusqBinaria(k)
}
}

Vous aimerez peut-être aussi