Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
Consideraciones
Consideraciones
Consideraciones. Cont.
Dado que sea cierto lo anterior:
Consideraciones. Cont.
Criterio posible: Cantidad de recursos consumidos por el algoritmo.
Consideraciones. Cont.
De lo anterior se ocupa el:
Complejidad Algortmica
Complejidad de Algoritmos
Qu es la complejidad de algoritmos? La complejidad de algoritmos obtiene una medida de la cantidad que consume un algoritmo de un recurso determinado (espacio o tiempo).
11
El mtodo emprico tambin denominado a posteriori, consiste en implementar en un computador los algoritmos a comparar, se prueban para distintos tamaos de los datos del problema y se comparan.
12
El mtodo terico tambin denominado a priori, consiste en determinar matemticamente la cantidad de recursos necesitados por cada algoritmo como una funcin cuya variable independiente es el tamao de los datos del problema.
Jhonny Felipez A. - 2010 13
Complejidad Algortmica
Estructuras de Control
1, n y n2 son diferentes. Si n = 10 aumentaran en un orden de magnitud prximo a 1, 10 y 100. En nuestro anlisis de ejecucin principalmente determinaremos el Orden de Magnitud de un algoritmo. Esto significa, determinar aquellas sentencias que tiene una cantidad de frecuencia grande.
Jhonny Felipez A. - 2010 18
1<=i <= n
1,
1<=i <= n
i,
1<=i <= n
19
En general
n + terminos de menor grado, k >= 0 k = i k +1 1<=i <= n
Jhonny Felipez A. - 2010 20
k +1
Anlisis de Estructuras.
Ejemplo mtodo a priori.
Calcular el nmero n-simo de Fibonacci. La secuencia Fibonacci comienza como sigue 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... Cada nuevo trmino es obtenido tomando la suma de los dos anteriores trminos. Si llamamos al primer trmino de la secuencia F0, entonces F0 = 0, F1 = 1 y en general Fn = Fn-1 + Fn-2, n 2
Jhonny Felipez A. - 2010 21
Anlisis de Estructuras.
Paso Algoritmo
1 void fibonacci(int n) { int a, b, c, i; if (n < 0) { printf("Error"); return;} if (n == 0) { printf("0"); return;} if (n == 1) { printf("1"); return;} a = 0; b = 1; for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } printf("%d\n",c); }
t(n) = 4n + 4
Jhonny Felipez A. - 2010 22
Anlisis de Estructuras.
23
El tiempo que toma un algoritmo puede variar considerablemente en funcin a las diferentes entradas de datos. Para el ejemplo con n>1 se da en el peor de los casos y el Orden de Complejidad ser O(n). En el mejor de los casos se da con n = 0 o 1, entonces el algoritmo tendr una complejidad constante O(1). En la materia se solicitar obtener en el peor de los casos.
Jhonny Felipez A. - 2010 24
Complejidad de Algoritmos.
Complejidades mas usuales.
O(1) Complejidad constante. O(log n) Complejidad algortmica. O(n) Complejidad lineal. O(nlog n) O(n2) Complejidad cuadrtica. O(n3) Complejidad cbica. O(nk) Complejidad polinmica. O(2n) Complejidad exponencial.
Jhonny Felipez A. - 2010 25
Complejidad de Algoritmos.
n log n 1 0 2 1 4 2 8 3 16 4 32 5
Complejidad de Algoritmos.
27
28
Complejidad de Algoritmos.
Ejemplo.
Paso Algoritmo
1 int minimo(int *vector, int n) { int i, min; min = 1; for (i = 2; i <= n; i++) { if (vector[i] < vector[min]) min = i; } return (vector[min]); }
Frecuencia
1
2 3 4 5 6
1 n n-1 n-1 1
t(n) = 3n + 1
t(n) O(n).
Jhonny Felipez A. - 2010 29
Complejidad de Algoritmos.
Ejemplo.
Paso Algoritmo
1 void burbuja(int *vector, int n) { int i, j, aux; for (i = 1; i <= n-1; i++) for (j = i+1; j <= n; j++) if (vector[i] > vector[j]) { aux = vector[i]; vector[i] = vector[j]; vector[j] = aux; } }
Frecuencia
1
2 3 4 5 6 7
t(n) =
5n2 - 8n + 5
t(n) O(n2).
Jhonny Felipez A. - 2010 30
Complejidad de Algoritmos.
Ejemplo.
Paso Algoritmo
1 void nuevo() { int x, t; x = 1; t = 0; while (x < n) { x = x * 2; t = t + 1; } }
Frecuencia
1
2 3 4 5
t(n) = 1+ 3 log n
Complejidad de Algoritmos.
Ejemplo.
Cont.
log2n = t
32
Complejidad Algortmica
Solucin de Recurrencia.
Mtodo Iterativo.
Solucin de Recurrencias
El tiempo de ejecucin de los algoritmos recursivos se expresa normalmente con una recurrencia. Se presentara algunos mtodos donde se muestra que a partir de estas ecuaciones de recurrencias, se puede determinar la complejidad algortmica de estos algoritmos.
Jhonny Felipez A. - 2010 34
Mtodo Iterativo
35
Mtodo Iterativo
Mtodo Iterativo
Mtodo Iterativo
n T ( n ) = T ( k ) + k * c2 2
Este algoritmo termina cuando llegamos a T(1) donde toma el valor de 1, adems n/2k=1 o k = log n, reemplazando se tiene:
T (n) = T (1) + k * c2 = 1 + c2 * log n T (n) O(log n)
Jhonny Felipez A. - 2010 38
Mtodo Iterativo
39
Mtodo Iterativo
void directoMaxMin(int vector[], int n, int *max, int *min) { int i; *max = *min = vector[1]; for (i=2; i<=n; i++) { if (vector[i] > *max) *max = vector[i]; if (vector[i] < *min) *min = vector[i]; } }
Mtodo Iterativo
Mtodo Iterativo
Mtodo Iterativo
Ejemplo. Cont.
5 si n 2 T ( n) = n en caso contrario T + 2 ( ) 7 2
43
Mtodo Iterativo
Ejemplo. Cont.
n n T (n) = 2T ( ) + 7 reemplazando n por 2 2 n = 2(2T ( ) + 7) + 7 4 n n = 4T ( ) + (2 * 7 + 7) reemplazando n por 4 4 n = 4(2T ( ) + 7) + (2 * 7 + 7) 8 n a (1 r n ) 7(1 (2) n ) = 8T ( ) + (4 * 7 + 2 * 7 + 7) S n = 1 r = 1 2 = 7(2 n 1) 8
Jhonny Felipez A. - 2010 44
Mtodo Iterativo
Ejemplo. Cont.
Este algoritmo termina cuando llegamos a T(1) donde toma el valor de 5, adems n/2k=1 o n=2k, reemplazando se tiene:
T (n) = 2 k T (1) + 7(2 k 1) = 5n + 7(n 1) = 12n 7 T ( n) O ( n)
Jhonny Felipez A. - 2010 45
n T (n) = 2 T ( k ) + 7(2 k 1) 2
k
Mtodo Iterativo
Ejemplo.
void DC(int vector[], int n) { int j; if (n <= 1) return; else{ for (j = 1; j <= 8; j++) DC(vector, n/2); for (j = 1; j <= n*n*n; j++) vector[j] = 0; } } Jhonny Felipez A. - 2010
46
Mtodo Iterativo
Ejemplo. Cont.
1 si n 1 T ( n) = n 3 en caso contrario + T n 8 ( ) 2
47
Mtodo Iterativo
Ejemplo. Cont.
n n 3 T ( n) = 8T ( ) + n reemplazando n por 2 2 n n 3 = 8(8T ( ) + ( ) ) + n 3 4 2 n n 3 = 64T ( ) + 2n reemplazando n por 4 4 n n 3 = 64(8T ( ) + ( ) ) + 2n 3 8 4 n = 512T ( ) + 3n 3 8
Jhonny Felipez A. - 2010
48
Mtodo Iterativo
Ejemplo. Cont.
Este algoritmo termina cuando llegamos a T(1) donde toma el valor de 1, adems n/2k=1 o n=2k o k = log n, reemplazando se tiene:
n 3 T (n) = (2 ) T ( k ) + kn 2
k 3
Mtodo Iterativo
Ejemplo.
void DC(int vector[], int n) { int j; if (n <= 1) return; else{ DC(vector, n/2); for (j = 1; j <= n*n*n; j++) vector[j] = 0; } }
Jhonny Felipez A. - 2010 50
Mtodo Iterativo
Ejemplo. Cont.
1 si n 1 T ( n) = n 3 T ( ) + n en caso contrario 2
51
Mtodo Iterativo
Ejemplo. Cont.
n n 3 T ( n) = T ( ) + n reemplazando n por 2 2 n n 3 = (T ( ) + ( ) ) + n 3 4 2 1 3 n n = T ( ) + (1 + )n reemplazando n por 8 4 4 1 n n = (T ( ) + ( ) 3 ) + (1 + )n 3 8 8 4 1 1 3 n 1 n a (1 r n ) 1 (1 / 8) n 8 Sn = = (1 ( ) ) = = T ( ) + (1 + + 2 )n 1 r 11/ 8 7 8 8 8 8
Jhonny Felipez A. - 2010 52
Mtodo Iterativo
Ejemplo. Cont.
La forma general ser 1 n 8 T (n) = T ( k ) + (1 k 3 )n 3 (2 ) 7 2 Este algoritmo termina cuando llegamos a T(1) donde toma el valor de 1, adems n/2k=1 o n=2k, reemplazando se tiene:
1 3 8 3 8 8 3 1 8 T (n) = T (1) + (1 3 )n = 1 + n = n 7 7 7 7 n 7 T ( n) O ( n 3 )
Jhonny Felipez A. - 2010 53
Complejidad Algortmica
Solucin de Recurrencia.
Teorema Maestro.
Se usa para resolver recurrencias del tipo T(n) = a T(n/b) + f(n), donde f(n) es una funcin asintticamente positiva y las constantes a 1, b >1. Este teorema expresa que el problema se divide en a sub problemas de tamao n/b. Los a sub problemas se resuelven recursivamente en tiempo T(n/b). El costo de dividir el problema y combinar sus soluciones es descrito por f(n).
Jhonny Felipez A. - 2010 55
Sean a1, b>1 constantes, f(n) una funcin yT(n) definida para enteros no negativos por la recurrencia:
T (n) = aT (n / b) + cn
Donde n/b es round(n/b). Entonces T(n) puede ser acotada asintticamente por:
Jhonny Felipez A. - 2010 56
T ( n) O ( n
log b a k k
) si a > b
k
k k
57
60
T ( n) O ( n k ) = O ( n 3 )
Jhonny Felipez A. - 2010 65
66
Bibliografa
Fundamentos de Programacin, Jorge Teran Pomier, 2006. Fundamentals of Data Structures, Ellis Horowitz, 1981.
68
Taller de Programacin
Gracias