Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Inteligencia Computacional
Universidad de Crdoba
Anlisis de complejidad?
Una de las cosas ms importantes a tomar en cuenta al momento de seleccionar un algoritmo es el tiempo que va a tardar en arrojar una salida.
Por qu es importante?
A pesar de que las computadoras de hoy en da son capaces de realizar millones de operaciones en un segundo, es muy fcil encontrar ejemplos de problemas y soluciones que tardarn aos en terminar
Cmo se mide?
Las computadoras de hoy en da tienen diferentes capacidades en cuanto a velocidad de procesamiento. Saber con exactitud el tiempo que va a tardar un programa en dar una salida se vuelve una tarea muy difcil hoy en da.
Cmo se mide?
En vez de calcular el tiempo exacto que va a tardar nuestro algoritmo se calcula la cantidad de operaciones en funcin del tamao de la entrada (n).
Cmo se mide?
Por lo general para estimar el tiempo de ejecucin, esta funcin de crecimiento se multiplica por una constante c que representa una estimacin del tiempo que la computadora se tarda en realizar una operacin.
Cmo se mide?
Tiempo de 1 operacin
cf (n)
Tamao de la entrada
Nota
En estos tiempos (2007) podemos asumir que una PC de escritorio puede realizar aproximadamente 109 operaciones por segundo. Sin embargo, este indicador no es absoluto dado que unas operaciones son ms lentas que otras.
Otra Nota
El tiempo exacto de ejecucin de un algoritmo tambin depende mucho de los detalles de implementacin.
Un ejemplo clsico
EL PROBLEMA DE LA ORDENACIN
A {x1 , x2 , x3 ... xn }
Un algoritmo de ordenacin debe encontrar una permutacin del conjunto A tal que para cualquier (en otras palabras, ordenar del ms chico al ms grande) i
xi x j
Algoritmos de ordenacin
La ordenacin de datos es quizs el problema ms comn dentro de las Ciencias Computacionales. Es por eso que existen bastantes algoritmos para resolver este problema. Cul es la diferencia entre ellos?
Aparte del nombre
Algoritmos de ordenacin
La complejidad
No de escribirlos, sino su funcin de crecimiento.
Ejercicio
Escriba el cdigo (o pseudocdigo) del BubbleSort
Solucin
for(i=0;i<a.size()-1;i++) for(j=i+1;j<a.size();j++) if(a[i]>a[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; }
Cul es mejor?
De los dos anlisis, el del peor caso es el ms fcil de razonar y es el ms usado para pruebas de benchmark. A partir de que es casi imposible probar todas las entradas posibles, los anlisis de complejidad se pueden volver algo truculentos.
Asignar un costo a cada operacin o lnea de cdigo Ver cuantas veces va a ser ejecutada cada lnea de cdigo.
Ejercicio
En el Algoritmo de Burbuja (supn un tamao del arreglo de n):
Cul es el peor caso? Cuntas veces es ejecutada cada lnea?
Cdigo
Costo
C1 C2 C3 C4 C5 C6
j
j 1
j
j 1 n
j
j 1 n
j
j 1 n
j
j 1
Por lo tanto
La estimacin del tiempo total de ejecucin sera la suma del tiempo de cada una de las lneas multiplicado por su factor de costo de operacin.
Por lo tanto:
Cdigo
Costo
C1 C2 C3 C4 C5 C6
n n
j
j 1
j
j 1 n
j
j 1 n
j
j 1 n
j
j 1
Sabemos que
n(n 1) n n ( j ) 2 2 j 1
n 2
Entonces:
n2 n T n(c1 ) ( )( c 2 c 3 c 4 c 5 c 6 ) 2
Concluyendo
Para simplificar el anlisis, supongamos que todas las constantes son iguales
n2 n T n (c ) ( )(5c) 2
Concluyendo
Cuando se analizan algoritmos, slo importa el trmino de la funcin que crece ms rpido y se eliminan las constantes.
Concluyendo
En nuestro caso, el trmino de mayor crecimiento es la n cuadrada.
T c(3.5n 2.5n 2 )
Por lo que decimos que la Ordenacin por Burbuja tiene una complejidad de
O(n )
A recordar
El clculo de la complejidad tan slo nos da una aproximacin del tiempo. Los detalles de implementacin son un factor importante aunque la complejidad sea la misma.
Calcula la complejidad
Cdigo
Costo
C1 C2 C3 C4 C5 C6
N N2 N2 N2 N2 N2
Calcula la complejidad
Cdigo
Costo
for(i=0;i<n-1;i++) for(j=0;j<n;j++)
C1 C2
N N2
if(a[i]>a[j]){
int temp=a[i]; a[i]=a[j]; a[j]=temp; }
C3
C4 C5 C6
N2
N2 N2 N2
T n (5n 2 ) O(n 2 )
Ejercicio
Compara los dos algoritmos Tardarn exactamente el mismo tiempo en ejecutarse?
Ejercicio
Prueba el BubbleSort con diferentes tamaos de entrada y toma el tiempo Hasta que tamao de entrada se puede ejecutar en 1 sec?
Un ejemplo ms retador
Qu es la bsqueda binaria?
Por claridad, llamaremos al nmero que deseemos encontrar como objetivo. Llamaremos espacio de bsqueda a la secuencia (o subsecuencia, en este caso contigua) donde seguramente se encuentra el objetivo.
Cul es la idea?
Inicialmente nuestro espacio de bsqueda es la secuencia completa. La idea es ir reduciendo la cantidad de lugares donde nuestro objetivo pueda estar, es decir, ir reduciendo nuestro espacio de bsqueda.
Cul es la idea?
En cada paso, el algoritmo compara el valor de en medio (mediana) del espacio de bsqueda con el objetivo. Basado en la comparacin y utilizando la propiedad de que los elementos estn ordenados, se puede eliminar la mitad del espacio de bsqueda.
Cul es la idea?
Si continuamos reduciendo de mitad en mitad, eventualmente llegaremos a un espacio de bsqueda de tamao 1. Qu quiere decir esto? Hemos encontrado nuestro nmero
Por ejemplo
Supongamos que tenemos la siguiente secuencia:
-1
0
2
1
Y buscamos el 43
2 3
10 43 44 55 60 71 82
4 5 6 7 8
Por ejemplo
Ahora escogemos el valor de en medio del arreglo, que es el valor en el ndice 4 (el punto medio entre 0 y 8) en este caso el 44. Comparamos esta mediana con nuestro valor objetivo (43)
Por ejemplo
-1
0
2
1
10 43 44 55 60 71 82
2 3 4 43 5 6 7 8
Utilizando la propiedad de del arreglo, podemos concluir que el 43 slo puede estar en la parte izquierda de la secuencia. (43<44) Por lo que descartamos la mitad del espacio de bsqueda que no nos sirve. (Nos quedamos con los elementos 0 a 3).
ordenacin
Por ejemplo
-1
0
2
1
10 43
2 43 3
El proceso se repite. 43>10 por lo tanto tomamos la mitad de la derecha (elemento en la posicin 3).
Por ejemplo
43
3 43
Ejercicio
Cul es el peor caso de una Bsqueda Binaria? Cundo el elemento a buscar no se encuentra en el arreglo hace la mayor cantidad de preguntas.
Ejercicio
Implementa una Bsqueda Binaria sobre un arreglo de enteros que regrese el ndice de la posicin donde se encuentra el objetivo. Si el elemento no est en el arreglo, regresar -1. Analiza: Cul es la condicin de paro del ciclo?
Ejercicio
int binSearch(int[] a, int x){ int i=0; int j=a.length-1; int m; while(i<=j){ m=(i+j)/2; if(a[m]==x) return m; else if(x<a[m]) j=m-1; else i=m+1; } return -1; }
Anlisis de Complejidad
Ejemplo
Si n=10 esto es lo que sucede:
10 5 2 5 2 2 2 1 2
Ejemplo
Si viramos al revs el proceso:
10 5 2 5 2 2 2 1 2
10 5 1 2 10 2 2 2 10 1 3 2
2 16
4
2 8
3
2 4
2
2 2
1
2 1
0
Ejemplo
Podemos decir que el problema se trata de encontrar una x tal que: (Observa que x se convierte en el nmero de pasos realizados).
n 1 x 2 x 2 n log 2 n x
Conclusin
La bsqueda binaria tiene una complejidad de:
O(log n)
Recuerda que lo que nos interesa es la funcin de crecimiento, por lo que la base del logaritmo se omite.
Observaciones
El logaritmo es una funcin creciente muy lenta. Para encontrar en un dato en una lista de un milln de datos ordenados se ocupan a lo ms 21 comparaciones.
Observaciones
Si pudieras tener una lista con informacin de todas las personas del mundo tardaras a lo ms 35 pasos.
Tablas comparativas
Tiempo aproximado que se tardara si n=100
Complejidad Tiempo 10-7 segundos 10-6 segundos 10-5 segundos 10-4 segundos 1 segundo 3 minutos 1014 aos 10142 aos
Fuentes:
http://www.topcoder.com http://www.olimpiadadeinformatica.org.mx http://www.cimat.mx/oieg