Professional Documents
Culture Documents
Anlisis de Algoritmos
Cristian Cappo (ccappo@pol.una.py) 17/Agosto/2011 2do. Semestre
En esta clase
Algoritmos como tecnologa Anlisis de algoritmos y clculo asinttico Anlisis de casos: mejor, peor y promedio Clculo de tiempo de ejecucin de un programa Notaciones asintticas: O , , Ejercicios
Qu es un algoritmo?
Es una secuencia de pasos concreta que transforma unos datos de entrada. Es un procedimiento bien definido que toma algn valor o conjunto de valores, como entrada, y produce algn valor o conjunto de valores, como salida [CLRS] Podemos ver al algoritmo como una herramienta que resuelve un determinado problema computacional.
[CLRS] Cormen-Leiserson-Rivest-Stein. Introduction to Algorithms, 2 nd Edition, MIT 3 Press, 2001
Propiedades de un algoritmo
Es correcto Tiene pasos concretos Bien definido (no ambiguo) Es finito Termina
RECURSOS LIMITADOS (procesador,memoria, ancho de banda, etc) TIEMPO DE RESPUESTA Buena codificacin Fcil de usar Fcil de implementar Eficiente
5
Eficiencia de un algoritmo
Cuando se escribe la solucin a un problema generalmente existen dos cosas inmersas en el diseo:
Fcil de entender, codificar y depurar (Ingeniera de Software). Uso eficiente de los recursos computacionales (Anlisis de algoritmos).
Eficiencia de un algoritmo
Una mquina ms rpida o un algoritmo ms eficiente?
Eficiencia de un algoritmo
Suponga el problema de ordenar un arreglo de nmeros. Existen varios algoritmos, nosotros elegiremos dos para comparar:
Ordenacin por insercin (InsertionSort) Ordenacin por mezcla (MergeSort).
A puede ejecutar 1.000.000.000 (109) instrucciones por segundo B puede ejecutar 10.000.000 (107) instrucciones por segundo (Note que es 100 veces ms lenta que A) c1 es 2 y c2 es 50 (constantes multiplicativas para InsertSort y MergeSort respectivamente). Qu significa esto?
MergeSort toma alrededor de un tiempo de c 2 n log 2 n (asumimos log en base 2) c1 y c2 son factores constantes.
10
6 2
33 minutos, 20 segundos
11
Del subconjunto de pruebas escogidas Del ordenador donde hago las pruebas Del lenguaje de programacin utilizado Del compilador utilizado De la calidad de la programacin
Entre otras cosas
Para hacer esto tengo que codificar/programar y en ocasiones esto no es trivial, no es fcil.
12
Tiempo (ms)
Escribo el programa
Tamao entrada
13
Predecir el comportamiento del algoritmo sin necesidad de implementarlo. Para ello nos ayudar el anlisis de algoritmo y el clculo asinttico.
14
El anlisis de algoritmos estudia desde el punto de vista terico, los recursos computacionales que necesita la ejecucin de un programa de computadora: su eficiencia. Es un tcnica de estimacin. Es particularmente til para determinar si vale o no la pena implementar un algoritmo en particular. El clculo asinttico es una tcnica de caracterizacin de los algoritmos para poder 15 luego compararlos.
Anlisis de algoritmos
Utilizamos una descripcin de alto nivel para el algoritmo (generalmente) Caracterizamos el tiempo de ejecucin como una funcin de la entrada N, T(N) Se toma en cuenta todos las posibles entradas (instancias del problema) Permite evaluar la velocidad del algoritmo independientemente del entorno de HW o SW.
16
Anlisis de algoritmos
Las instrucciones son ejecutadas una tras otra sin concurrencia. Un banco de celdas de memoria potencialmente ilimitado. Las celdas de memoria estn numeradas y accederlas toma una unidad de tiempo constante. Las operaciones son similares a cualquier computadora tradicional.
Entender que esto es una simplificacin de la realidad Por qu le parece? Se imagina otro modelo diferente?
17
Anlisis de algoritmos
120
Caso promedio
1000 2000 3000 4000 Tiempo esperado para un problema Tamao entrada de tamao N. Implica estudio estadstico de la distribucin de las instancias de los problemas.
Mejor caso
Es el ms engaoso. 18
Tiempo de ejecucin
Tipos de anlisis
Cul es el peor caso? Cul es el mejor caso? Cul el el caso promedio? Cmo calculara el tiempo para cada caso?
[16, 20, 30, 50, 26, 17, 59, 89, 78, 65, 7, 8, 1, 4, 5]
Buscamos el 16
Buscamos el 5
19
Funcionamiento de insertSort
0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
0 1
0 1
0 1
A = { 5,2 4,6,1,3}
21
22
Nos ayuda a entender porque un algoritmo es correcto. Existen tres cosas acerca del LI:
Inicializacin
Mantenimiento
Esta es verdadera antes de una iteracin y permanece verdadera luego de la siguiente iteracin.
Terminacin
Cuando el lazo termina, la invarianza brinda una propiedad til que nos ayuda a comprender la correctitud del algoritmo. 23
Inicializacin:
Es verdadero ya que se mantiene antes de la primera iteracin. El subarreglo A[0..j-1] consiste en un solo elemento, esta ordenado. El cuerpo indica que antes y luego de cada iteracin la propiedad de A[0..j-1] se mantiene. El ciclo externo termina cuando j=n. Sustituyendo n por j en la propiedad A[0..j-1] tenemos el subarreglo A[0..n-1] que consiste en los elementos originales de A pero ordenados. Pero el subarreglo A[0..n-1] es el arreglo completo y por tanto, el arreglo A esta ordenado, tenindose as que el algoritmo es correcto. 24
Mantenimiento:
Terminacin:
Cuando no se ingresa al ciclo mientras y ocurre cuando? Cuando se ingresa la mitad de las veces... aunque depende..de qu? Cuando siempre se ingresa.
Caso promedio
Peor caso
25
Una asignacin
= 1 OE (Operacin elemental)
Una comparacin = 1 OE Acceso a arreglo = 1 OE Llamada a funcin= 1 OE Una operacin simple = 1 OE (resta, suma, .., etc) Consideramos todas las operaciones del mismo costo (aunque no es real, porqu?)
26
Algoritmo findMax(A, n) Maximo A[0] for i 1 to n 1 do if A[i] > Maximo then Maximo A[i] { incremento del contador i } return Maximo
a = Tiempo que toma la operacin elemental ms rpida b = Tiempo que toma la operacin elemental ms lenta
De aqu concluimos que el tiempo de ejecucin T(n) esta limitado por dos funciones lineales. 28
Por tanto la tasa de crecimiento lineal del tiempo de ejecucin de T(n) es una propiedad intrnseca del algoritmo findMax
29
Clculo asinttico
El clculo asinttico1 de un algoritmo me permite clasificarlo de acuerdo a su tasa de crecimiento (growth rate). Ignoramos las constantes que puedan tenerse y nos concentramos en el grado dominante. De esta forma puedo comparar algoritmos de una forma ms sencilla.
1
Propuesto por Donal Knuth en su libro El arte de programar computadores (primera edicin : 1968)
30
n2
t(N)
n lg n n
32
Tasas de crecimiento
102 n 105
) 1E+13 n ( T 1E+11
1E+9 1E+7 1E+5 1E+3 1E+1 1E-1 1E-1 1E+1 1E+3 1E+5 1E+7 1E+9
10 n 10 n
tiene una tasa de crecimiento cuadrtica.
33
Anlisis asinttico
Encontrar el nmero de operaciones en el peor caso Expresar esta funcin en una notacin asinttica (por el momento en la notacin O (o grande ) Nosotros determinamos que findMax ejecuta en a lo sumo 7n-2 operaciones primitivas. Entonces decimos que el algoritmo findMax esta en O(n) tiempo
Ejemplo:
34
Notacin O (O grande)
Dada las funciones f(n) y g(n), se dice que f(n) est en O(g(n)) si existen las constantes positivas c y n0 tal que
f n cg n para n n 0
35
Notacin O
Ejemplo 1:
10,000
3n 2n+10 n
2n 10
esta en O n 1,000
100
2n 10 cn c 2 n 10 n 10 / c 2 c = 3 y n0= 10
10
1 1 10
100
1,000
36
Notacin O
Ejemplo 2:
La funcin
n no esta en O n n cn n c
La desigualdad no puede ser satisfecha ya que c debe ser una constante
2
10
100
1.000
37
38
Extraer los trminos de menor orden Extraer los factores constantes Decir 2n esta en O(n) y no 2n esta en O(n2) Decir 3n + 5 esta en O(n) y NO 3n+5 esta en O(3n)
39
n = log n
40
41
O grande
f(n) esta en O(g(n)) si f(n) es asintticamente menor o igual que g(n) f(n) esta en (g(n)) si f(n) es asintticamente mayor o igual a g(n) f(n) esta en (g(n)) si f(n) es asintticamente igual a g(n)
42
Grande
Grande
Ejercicios
Calcule el t(n) y O() para cada uno de los trozos de cdigo mostrados abajo
Ejercicio #1 sum = 0 for ( i=1; i<=n ; i++ ) for (j=1; j<=n; j++ ) sum++; ---------------------------------Ejercicio #2 sum = 0 for (k=1; k<=n; k*=2) for (j=1; j<= n; j++) sum++; ---------------------------------Ejercicio #3 sum = 0 for (i=1; i<=n; i++) for (j=1; j<=i; j++) sum++;
43
44