Está en la página 1de 69

Taller de Programacin

Parte II Anlisis de Algoritmos


Jhonny Felpez Andrade jrfelizamigo@yahoo.es

Contenido

Consideraciones. Complejidad algortmica.


Anlisis de estructuras de control. Solucin de Recurrencias.


Mtodo Iterativo. Teorema Maestro

Jhonny Felipez A. - 2010

Consideraciones

Consideraciones

Dado un problema ser posible encontrar ms de un algoritmo que sea correcto?


Jhonny Felipez A. - 2010 4

Consideraciones. Cont.
Dado que sea cierto lo anterior:

Cmo elegir el mejor de ellos?


Jhonny Felipez A. - 2010 5

Consideraciones. Cont.
Criterio posible: Cantidad de recursos consumidos por el algoritmo.

Espacio de memoria. Tiempo de ejecucin.


Jhonny Felipez A. - 2010 6

Consideraciones. Cont.
De lo anterior se ocupa el:

Anlisis de la complejidad de algoritmos

Jhonny Felipez A. - 2010

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).

Jhonny Felipez A. - 2010

Complejidad de Algoritmos. Cont.


Por ejemplo existe: La Complejidad Espacial o la eficiencia en la memoria, que toma en cuenta a la cantidad de memoria que ocupan todas las variables del algoritmo (no se vera en la materia). La Complejidad Temporal o la eficiencia en el tiempo de ejecucin.
Jhonny Felipez A. - 2010 10

Complejidad de Algoritmos. Cont.


Existen dos mtodos para obtener la complejidad algortmica.

Emprico o a posteriori. Terico o a priori.

Jhonny Felipez A. - 2010

11

Complejidad de Algoritmos. Cont.

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.

Jhonny Felipez A. - 2010

12

Complejidad de Algoritmos. Cont.

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

Anlisis de Estructuras. Anlisis a priori.

Consideremos tres simples programas. . . . x=x+1 . . .


La cantidad de frecuencia es uno.
Jhonny Felipez A. - 2010 15

Anlisis de Estructuras. Anlisis a priori. Cont.


for i = 1 to n do x=x+1 end La misma sentencia ser ejecutada n veces y en el programa.
Jhonny Felipez A. - 2010 16

Anlisis de Estructuras. Anlisis a priori. Cont.


for i = 1 to n do for j = 1 to n do x=x+1 end end n2 veces (asumiendo n 1)
Jhonny Felipez A. - 2010 17

Anlisis de Estructuras. Anlisis a priori. Cont.


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

Anlisis de Estructuras. Anlisis a priori. Cont.

Para determinar el Orden de Magnitud, a menudo se presentan frmulas tales como

1<=i <= n

1,

1<=i <= n

i,

1<=i <= n

Jhonny Felipez A. - 2010

19

Anlisis de Estructuras. Anlisis a priori. Cont.

Formas simples para las tres formulas de anteriores se tienen:


n(n + 1) n(n + 1)(2n + 1) , n, 6 2

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

Ejemplo obtiene la cantidad de frecuencia para n > 1


Frecuencia
1

2-3 4-5 6-7 8 9 10 11 12 13

1 1 1 2 n n-1 n-1 n-1 1

t(n) = 4n + 4
Jhonny Felipez A. - 2010 22

Anlisis de Estructuras.

Ejemplo mtodo a priori . Cont.


El tiempo de clculo es 4n + 4. Ignorando las dos constantes 4, obtenemos que la complejidad algortmica u Orden de Complejidad es O(n).

Jhonny Felipez A. - 2010

23

Anlisis de Estructuras. Mejor caso y peor caso.

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

Valores de crecimiento de las funciones.


n n log n n2 n3 2n 1 0 1 1 2 2 2 4 8 4 4 8 16 64 16 8 24 64 512 256 16 64 256 4096 65536 32 160 1024 32768 2.147.483.648
Jhonny Felipez A. - 2010 26

Complejidad de Algoritmos.

Promedio de crecimiento de las funciones.

Jhonny Felipez A. - 2010

27

Complejidad de Algoritmos. Cont.

O(log n), O(n) y O(n log n) crecen mas


lentamente que los otros. Para grandes conjuntos de datos, los algoritmos con una complejidad mayor que O(n3) son a menudo no aplicables. Un algoritmo que es exponencial trabajara solamente con entradas muy pequeas.
Jhonny Felipez A. - 2010

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

n n-1 n-1 n-1 n-1

n n-1 n-1 n-1 n-1 n-1

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

2 log n log n - 1 log n - 1

t(n) = 1+ 3 log n

t(n) O(log n).


Jhonny Felipez A. - 2010 31

Complejidad de Algoritmos.
Ejemplo.

Cont.

Calculando el valor de t se tiene: n t 1 0 2 1 4 2 8 3 16 4 32 5

Por lo tanto: 25 = 32 => 2t = n

log2n = t
32

Jhonny Felipez A. - 2010

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

El mtodo iterativo requiere, para obtener la complejidad algortmica, de un poco de algebra.

Jhonny Felipez A. - 2010

35

Mtodo Iterativo

Ejemplo. Bsqueda Binaria.


static int busqBinaria(double vector[], int i, int j, double x) { int medio=(i+j)/2; if (i > j) return -1; else if (x == vector[medio]) return medio; else if (x < vector[medio]) return busqBinaria(vector,i,medio-1,x); else return busqBinaria(vector,medio+1,j,x); }
Jhonny Felipez A. - 2010 36

Mtodo Iterativo

Ejemplo. Bsqueda Binaria. Cont.


c1 si n = 1 T ( n) = n T ( ) + c2 en caso contrario 2
n n T (n) = T ( ) + c2 reemplazando n por 2 2 n/2 n n ) + c2 ) + c2 = T ( ) + 2 * c2 reemp. n por = (T ( 2 4 4 n n = (T ( ) + c2 ) + 2 * c2 = T ( ) + 3 * c2 8 8
Jhonny Felipez A. - 2010 37

Mtodo Iterativo

Ejemplo. Bsqueda Binaria. Cont.


La forma general ser

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

Ejemplo: Encontrar el mayor y el menor elemento de un vector


Aproximacin directa Aplicar Tcnica Divide y Vencers

Jhonny Felipez A. - 2010

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

Requiere 2(n-1) comparaciones de elementos!


Jhonny Felipez A. - 2010 40

Mtodo Iterativo

Ejemplo. Aplic. Divide y Vencers.


Para n 2, hacer 1 comparacin: Para n grande, dividir el conjunto en dos subconjuntos de tamao menor y obtener el mayor y menor elemento de cada subconjunto. Comparar los mayores/menores elementos de los dos subconjuntos y determinar el mayor/menor de ambos. Repetir recursivamente.
Jhonny Felipez A. - 2010 41

Mtodo Iterativo

Ejemplo. Aplic. Divide y Vencers.


void MaxMin(int vector[], int i, int j, int *max, int *min) { if (i == j) *max = *min = vector[i]; // Trivial else if (i == j-1) {//Pequeo if (vector[i] < vector[j]) {*max = vector[j]; *min = vector[i];} else { *max = vector[i]; *min = vector[j]; } } else {// divide P en subproblemas. int medio=(i+j)/2, max1, min1; MaxMin(vector, i, medio, max, min); MaxMin(vector, medio+1, j, &max1, &min1); if (*max < max1) *max = max1; if (*min > min1) *min = min1; } }
Jhonny Felipez A. - 2010 42

Mtodo Iterativo
Ejemplo. Cont.

5 si n 2 T ( n) = n en caso contrario T + 2 ( ) 7 2

Jhonny Felipez A. - 2010

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.

La forma general ser

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

Jhonny Felipez A. - 2010

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.

La forma general ser

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

T ( n) = T (1) + (log n) n 3 = n 3 + n 3 log n


3
Jhonny Felipez A. - 2010

T (n) O(n log n)


49

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

Jhonny Felipez A. - 2010

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.

Teorema Maestro (Master Theorem)

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

Teorema Maestro (Master Theorem)

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

Teorema Maestro (Master Theorem)

T ( n) O ( n

log b a k k

) si a > b
k

k k

T (n) O(n log n) si a = b T (n) O(n ) si a < b


Jhonny Felipez A. - 2010

57

Teorema Maestro (Master Theorem)


Ejemplo. Bsqueda Binaria.
int busqBinaria(int vector[], int i, int j, int x) { if (i == j) return i; else { int medio=(i+j)/2; if (x <= vector[medio]) busqBinaria(vector,i,medio,x); else busqBinaria(vector,medio+1,j,x); } }
Jhonny Felipez A. - 2010 58

Teorema Maestro (Master Theorem)


Ejemplo. Bsqueda Binaria. Cont.
T (n) O(n logb a ) si a > b k T (n) O(n k log n) si a = b k T (n) O(n k ) si a < b k
si n = 1 1 T ( n) = T (n / 2) + 3 en caso contrario a = 1, b = 2, k = 0 1 = 20
T (n) O(n k log n ) = O(n 0 log n) = O(log n)
Jhonny Felipez A. - 2010 59

Teorema Maestro (Master Theorem)

Ejemplo: Encontrar el mayor y el menor elemento de un vector

Aplicar Tcnica Divide y Vencers

Jhonny Felipez A. - 2010

60

Teorema Maestro (Master Theorem)


Ejemplo. Aplic. Divide y Vencers. Cont.
void MaxMin(int vector[], int i, int j, int *max, int *min) { if (i == j) *max = *min = vector[i]; // Trivial else if (i == j-1) {//Pequeo if (vector[i] < vector[j]) {*max = vector[j]; *min = vector[i];} else { *max = vector[i]; *min = vector[j]; } } else {// divide P en subproblemas. int medio=(i+j)/2, max1, min1; MaxMin(vector, i, medio, max, min); MaxMin(vector, medio+1, j, &max1, &min1); if (*max < max1) *max = max1; if (*min > min1) *min = min1; } }
Jhonny Felipez A. - 2010 61

Teorema Maestro (Master Theorem)


Ejemplo. Aplic. Divide y Vencers. Cont.
T (n) O(n logb a ) si a > b k T (n) O(n k log n) si a = b k T (n) O(n k ) si a < b k
si n 2 5 T ( n) = 2T (n / 2) + 7 en caso contrario a = 2, b = 2, k = 0 2 > 20

T (n) O(n logb a ) = O(n log 2 2 ) = O(n)


Jhonny Felipez A. - 2010 62

Teorema Maestro (Master Theorem)


Ejemplo.
T (n) O(n logb a ) si a > b k T (n) O(n k log n) si a = b k T (n) O(n k ) si a < b k
T (n) = T (2n / 3) + 1 a = 1, b = 3 / 2, k = 0 1 = (3 / 2) 0
T (n) O(n k log n) = O(n 0 log n) = O(log n)
Jhonny Felipez A. - 2010 63

Teorema Maestro (Master Theorem)


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 64

Teorema Maestro (Master Theorem)


Ejemplo.
T (n) O(n logb a ) si a > b k T (n) O(n k log n) si a = b k T (n) O(n k ) si a < b k
si n 1 1 T ( n) = 3 T (n / 2) + n en caso contrario a = 1, b = 2, k = 3 1 < 23

T ( n) O ( n k ) = O ( n 3 )
Jhonny Felipez A. - 2010 65

Teorema Maestro (Master Theorem)


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

66

Teorema Maestro (Master Theorem)


Ejemplo.
T (n) O(n logb a ) si a > b k T (n) O(n k log n) si a = b k T (n) O(n k ) si a < b k
si n 1 1 T ( n) = 3 8T (n / 2) + n en caso contrario a = 8, b = 2, k = 3 8 = 23

T (n) O(n k log n) = O(n 3 log n)


Jhonny Felipez A. - 2010 67

Bibliografa

Fundamentos de Programacin, Jorge Teran Pomier, 2006. Fundamentals of Data Structures, Ellis Horowitz, 1981.

Jhonny Felipez A. - 2010

68

Taller de Programacin
Gracias