Está en la página 1de 75

INTRODUCCIN A LOS ALGORITMOS

Inteligencia Computacional

Presentado por: Sammer Samith Tirado Otero


Tema: Complejidad Computacional Lic. Juan Carlos Giraldo Cardozo.

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

El problema de la ordenacin de nmeros


Dado un conjunto de n nmeros:

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.

Anlisis de complejidad de Algoritmos de Ordenacin


Para ejemplificar la funcin de crecimiento vamos a estudiar uno de los algoritmos ms famosos de ordenacin (y lento):
Ordenacin por Burbuja (BubbleSort)

Ordenacin por Burbuja


La idea de la ordenacin por burbuja es tomar el elemento de mayor valor de un arreglo de datos y llevarlo al final; y esto repetirlo a todos los elementos. (se llama burbuja por que alguien se imagino que el nmero que se va recorriendo es como si una burbuja subiera desde el fondo del agua).

Ordenacin por Burbuja


Para evitar el proceso de encontrar el mximo cada iteracin, la mejor estrategia es recorrer el arreglo desde la posicin 0 con un ndice i. En cada paso preguntamos si el elemento en la posicin i+1 es menor al elemento i. En este caso, intercambiamos los valores. Si seguimos este proceso observamos que el elemento mayor quedar hasta el fondo.

Ordenacin por Burbuja


Supongamos el siguiente arreglo de elementos: [1,2,15,5,7,6]

Ordenacin por Burbuja


[1,2,15,5,7,6] 1>2?

Ordenacin por Burbuja


[1,2,15,5,7,6] 2>15?

Ordenacin por Burbuja


[1,2,15,5,7,6] 15>5?

Ordenacin por Burbuja


[1,2,5,15,7,6] Intercambiamos (nota que el ndice sigue avanzando, una vez intercambiado los valores, el ndice quedar posicionado en el nmero 15 otra vez).

Ordenacin por Burbuja


[1,2,5,15,7,6] 15>7?

Ordenacin por Burbuja


[1,2,5,7,15,6] Intercambiamos (y avanzamos el ndice)

Ordenacin por Burbuja


[1,2,5,7,15,6] 15>6?

Ordenacin por Burbuja


[1,2,5,7,6,15] Intercambiamos Podemos observar que el elemento de mayor tamao ha quedado al fondo del arreglo.

La operacin se repite hasta que se hayan recorrido todos los elementos.

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; }

Anlisis del algoritmo


Normalmente se habla de dos tipos de anlisis:
Anlisis del peor caso Anlisis del caso promedio

Anlisis del peor caso


El anlisis del peor caso es, como su nombre lo dice, es calcular su funcin de crecimiento dndole la peor de todas las entradas posibles.

Anlisis del caso promedio


El anlisis del caso promedio es, como su nombre lo dice, el promedio de cunto tardara nuestro algoritmo de cada una de las entradas posibles.

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.

Anlisis del algoritmo


Para analizar el costo computacional de un algoritmo, bsicamente se siguen tres pasos:
Suponer el peor de los casos (en el que se ejecutan ms lneas y el ms grande)
A veces encontrar el peor caso no es sencillo

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

Solucin: Anlisis del Peor Caso

Costo

Veces que se ejecuta

for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]>a[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; }

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

Veces que se ejecuta

for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]>a[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; }


n n n

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

T n(c1 ) ( j )c2 ( j )c3 ( j )c4 ( j )c5 ( j )c 6


j 1 j 1 j 1 j 1 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

T n(c) 2.5n 2 c 2.5nc T c(3.5n 2.5n 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 n(c) 2.5n c 2.5nc


2

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

Veces que se ejecuta

for(i=0;i<n-1;i++) for(j=0;j<n;j++) if(a[i]>a[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; }

C1 C2 C3 C4 C5 C6

N N2 N2 N2 N2 N2

Calcula la complejidad
Cdigo

Costo

Veces que se ejecuta

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

Bsqueda binaria Qu es la bsqueda binaria?


La bsqueda binaria es uno de los algoritmos ms importantes dentro de las ciencias computacionales. Bsicamente nos permite encontrar un elemento dentro de una secuencia (o un arreglo), mientras sus elementos estn ordenados.

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

(Nota: Solo llevamos una operacin)

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

En 3 operaciones encontramos un elemento en un arreglo ordenado de tamao 8.

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

CUL ES LA COMPLEJIDAD DE LA BSQUEDA BINARIA?

Complejidad de la bsqueda binaria


La complejidad de la bsqueda binaria no es tan intuitiva como las revisadas anteriormente. Antes de responder debemos analizar detenidamente el algoritmo Qu sucede con el tamao del espacio de bsqueda en cada paso?

Ejemplo
Si n=10 esto es lo que sucede:

10 5 2 5 2 2 2 1 2

Complejidad de la bsqueda binaria


Es dividido a la mitad Entonces la pregunta clave es: Cuntas veces puedo dividir por la mitad a N?

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

O(log n) O(n) O(n log n)


O(n ) O(n 3 ) O(n 6 ) O(2 n ) O(n!)
2

Problema Tercias (OMI 2007)


Descripcin: Se dice que 3 nmeros a, b, y c estn en sucesin aritmtica si, a<b<c, y c-b=b-a. Por ejemplo los nmeros 1, 2 y 3 estn en sucesin aritmtica, los nmeros 2, 20 y 38 tambin lo estn. Pero los nmeros 2, 3 y 20 no lo estn. Determinar si 3 nmeros estn en sucesin aritmtica es una tarea simple, pero dado un conjunto de nmeros determinar cuntos de ellos estn en sucesin aritmtica es algo un poco ms difcil.

Problema Tercias (OMI 2007)


Problema: Debes escribir un programa que lea un conjunto de nmeros distintos e imprima en pantalla cuantas tercias de esos nmeros estn en sucesin aritmtica. Tu programa deber leer del teclado de la PC los siguientes datos:
En la primera lnea el nmero 0 < N 7,000 que representa la cantidad de nmeros en el conjunto. Cada una de las siguientes N lneas contendr un nmero del conjunto el cul ser un entero mayor a 0 y menor o igual a 1,000,000,000, adems, estos nmeros estarn ordenados de manera creciente.

Problema Tercias (OMI 2007)


Ejemplo:
Entrada 5 1 2 3 20 38 Salida 2

Problema Tercias (OMI 2007)


Explicacin: En el ejemplo anterior se tiene un conjunto con 5 nmeros, con estos 5 nmeros se pueden formar las siguientes tercias: (1,2,3) (1,2,20) (1,2,38) (1,3,20) (1,3,38) (1,20,38) (2,3,20) (2,3,38) (2,20,38) (3,20,38) De las tercias anteriores slo las tercias (1,2,3) y (2,20,38) estn en sucesin aritmtica, por lo tanto la respuesta es 2.

Problema Tercias (OMI 2007)


Requerimientos de ejecucin: Obtendrs 10 puntos por cada caso resuelto. Para obtener puntos en este problema, adems de entregar la solucin correcta tu programa deber ejecutarse en un tiempo menor a 1 segundo.

Fuentes:
http://www.topcoder.com http://www.olimpiadadeinformatica.org.mx http://www.cimat.mx/oieg

También podría gustarte