270 likes | 479 Views
Complejidad. Programación II 17-18 de febrero de 2009. Complejidad. Complejidad T(n): número de operaciones elementales en función de la medida n Hace referencia al caso peor Notación asintótica: término de T(n) que crece más rápido en función de n. Funciones iterativas.
E N D
Complejidad Programación II 17-18 de febrero de 2009
Complejidad • Complejidad T(n): número de operaciones elementales en función de la medida n • Hace referencia al caso peor • Notación asintótica: término de T(n) que crece más rápido en función de n
Funciones iterativas • Secuencia: la complejidad se suma • Condicional: la complejidad en el caso peor es el máximo de las dos opciones • Bucles: la complejidad es el producto del número de iteraciones y la complejidad interior del bucle (incluida la condición)
Funciones recursivas • Establecer la ecuación de recurrencia: • T(n) en el caso base • T(n) en el caso recursivo • En el caso recursivo, T(n) depende de T(f(n)) (p.ej. f(n)=n-1, f(n)=n/2) • Expandir T(f(n)) hasta que la expresión para T(n) sólo depende del caso base
Logaritmos • log(n) = el exponente a la que 2 se ha de elevar para obtener n • Ej: log(8) = 3 (porque 23 = 8) • Ej: log(1024) = 10 (porque 210 = 1024) • Aritmética: log(xy) = log(x) + log(y) • Ej: log(1024*1024*1024) = 10+10+10 = 30 • Consecuencia: log(n) = número de veces que se ha de dividir n entre 2 para tener 1
Torres de Hanoi accion MoverTorre(n:natural; X,Y,Z:barra) si (n > 0) entonces MoverTorre(n-1, X, Z, Y); MoverDisco(X, Y); MoverTorre(n-1, Z, Y, X); fsi faccion
Torres de Hanoi • Ecuación de recurrencia: • T(n) = a, n = 0 • T(n) = b + 2T(n-1)
Torres de Hanoi • Eliminar la dependencia de T() • k=n T(n-k) = T(0) = a • T(n) = (2k – 1)b + 2ka = (a+b)2k – b • ¿Notación asintótica?
Ejemplo: Mergesort • Medida: n = D – E • Depende de la complejidad de Combina • Los bucles de Combina se repiten un número de veces igual al número total de elementos de V1 y V2 • Ecuación de recurrencia: • T(n) = a, n = 0 • T(n) = b + cn + 2T(n/2)
Ejemplo: Mergesort • n/2k = 1 k = log(n) • T(n) = bn + cnlog(n) + an • ¿Notación asintótica?
Ordenación • Algoritmos de ordenación básicos: O(n2) • Algoritmo de la burbuja (Bubble Sort) • Ordenación por inserción (Insertion Sort) • Ordenación por selección (Selection Sort) • Mergesort: O(nlogn) • Quicksort???
Estudio: Fibonacci funcion F(n:natural) devuelvenatural si (n <= 1) entonces devuelve 1; sino devuelve F(n-2)+F(n-1); fsi ffuncion
Estudio: Fibonacci • Ecuación de recurrencia: • T(n) = a, n <= 1 • T(n) = b + T(n-1) + T(n-2), n > 1
Estudio: Fibonacci • k = n-1T(n-k) = T(1) = T(n-k-1) = T(0) = a • T(n) = (F(n)-1)b + F(n-1)T(1) + F(n-2)T(0) • Notación asintótica: T(n) = ¡O(F(n))! • Aproximación: O(F(n)) = O(1,6n) • ¡Complejidad exponencial!
Estudio: Fibonacci • Versión iterativa funcion F(n:natural) devuelve natural variable f1,f2,tmp:natural; f1 := f2 := 1; mientras (n > 1) hacer tmp := f2; f2 := f1 + f2; f1 := tmp; n := n – 1; fmientras devuelve f2; ffuncion
Estudio: Fibonacci • ¿Complejidad versión iterativa?
Estudio: Fibonacci • La actualización de F(i),F(i+1) se puede ver como la multiplicación con una matriz = • Por lo tanto, obtenemos = = n n
Estudio: Fibonacci • Podemos calcular el exponente de la matriz de manera recursiva = = n par = n impar 0 n n 2 n 2 n n 2 n 2
Estudio: Fibonacci funcion Exp(n:natural) devuelvematriz de natural variable A,B:matriz (2x2) de natural; si (n = 0) entonces devuelve [[1,0],[0,1]]; sino A := Exp(n div 2); B := A * A; // multiplicacion de matrices 2x2 si (n mod 2 > 0) entonces B := B * [[0,1],[1,1]]; fsi devuelve B; fsi ffuncion
Estudio: Fibonacci funcion F(n:natural) devuelvenatural variable A:matriz (2x2) de natural; A := Exp(n); devuelve A(1,1) + A(1,2); ffuncion
Estudio: Fibonacci • ¿Complejidad Exp(n)? • ¿Complejidad F(n)?
Estudio: Fibonacci • Fibonacci recursivo original: O(1,6n) • Fibonacci iterativo: O(n) • Fibonacci recursivo c/ exponente: O(logn)