Análisis asintótico de - Elisa Schaeffer · Análisis de algoritmos!Intento de caracterizar el...
Transcript of Análisis asintótico de - Elisa Schaeffer · Análisis de algoritmos!Intento de caracterizar el...
Análisis asintótico de algoritmos
Algoritmos y problemas
! Cada algoritmo resuelve a un problema particular! Hay varias maneras de resolver un problema! Algunas maneras son buenas y otras son malas! El propósito del análisis de algoritmos es
identificar los algoritmos buenos
Repaso matemático
Exponentes
b0 = 1
b1 = b
ba+c = babc
bac = (ba)c
b!a =!
1b
"a= 1
ba
Analisis de algoritmos– p. 14
Función logarítmicaLogaritmos
blogb x = x donde x > 0
Si logb x = y, by = x
Se define que logb 1 = 0
Cambios de base: logb!(x) =logb(x)
logb(b!).
Es inyectiva: logb x = logb y =! x = y
Es creciente: x > y =! logb x > logb y
Analisis de algoritmos– p. 15
Logaritmos
blogb x = x donde x > 0
Si logb x = y, by = x
Se define que logb 1 = 0
Cambios de base: logb!(x) =logb(x)
logb(b!).
Es inyectiva: logb x = logb y =! x = y
Es creciente: x > y =! logb x > logb y
Analisis de algoritmos– p. 15
Logaritmos
blogb x = x donde x > 0
Si logb x = y, by = x
Se define que logb 1 = 0
Cambios de base: logb!(x) =logb(x)
logb(b!).
Es inyectiva: logb x = logb y =! x = y
Es creciente: x > y =! logb x > logb y
Analisis de algoritmos– p. 15
Logaritmos
blogb x = x donde x > 0
Si logb x = y, by = x
Se define que logb 1 = 0
Cambios de base: logb!(x) =logb(x)
logb(b!).
Es inyectiva: logb x = logb y =! x = y
Es creciente: x > y =! logb x > logb y
Analisis de algoritmos– p. 15
Logaritmos
blogb x = x donde x > 0
Si logb x = y, by = x
Se define que logb 1 = 0
Cambios de base: logb!(x) =logb(x)
logb(b!).
Es inyectiva: logb x = logb y =! x = y
Es creciente: x > y =! logb x > logb y
Analisis de algoritmos– p. 15
Logaritmos
blogb x = x donde x > 0
Si logb x = y, by = x
Se define que logb 1 = 0
Cambios de base: logb!(x) =logb(x)
logb(b!).
Es inyectiva: logb x = logb y =! x = y
Es creciente: x > y =! logb x > logb y
Analisis de algoritmos– p. 15
PropiedadesLogaritmos
Multiplicación: logb(x · y) = logb x + logb y
División: logb
!
xy
"
= logb x ! logb y
Potencia: logb xc = c logb x
En el exponente: xlogb y = ylogb x
Factorial: logb(n!) =n
#
i=1
logb i
Analisis de algoritmos– p. 17
Logaritmos
Multiplicación: logb(x · y) = logb x + logb y
División: logb
!
xy
"
= logb x ! logb y
Potencia: logb xc = c logb x
En el exponente: xlogb y = ylogb x
Factorial: logb(n!) =n
#
i=1
logb i
Analisis de algoritmos– p. 17
Logaritmos
Multiplicación: logb(x · y) = logb x + logb y
División: logb
!
xy
"
= logb x ! logb y
Potencia: logb xc = c logb x
En el exponente: xlogb y = ylogb x
Factorial: logb(n!) =n
#
i=1
logb i
Analisis de algoritmos– p. 17
Logaritmos
Multiplicación: logb(x · y) = logb x + logb y
División: logb
!
xy
"
= logb x ! logb y
Potencia: logb xc = c logb x
En el exponente: xlogb y = ylogb x
Factorial: logb(n!) =n
#
i=1
logb i
Analisis de algoritmos– p. 17
Logaritmos
Multiplicación: logb(x · y) = logb x + logb y
División: logb
!
xy
"
= logb x ! logb y
Potencia: logb xc = c logb x
En el exponente: xlogb y = ylogb x
Factorial: logb(n!) =n
#
i=1
logb i
Analisis de algoritmos– p. 17
Ejemplos de bases
Logaritmos
1
2
3
4
5
6
7
8
9
10
0 200 400 600 800 1000
b = 2b = e
b = 10
Analisis de algoritmos– p. 16
Logaritmos
1
2
3
4
5
6
7
8
9
10
0 200 400 600 800 1000
b = 2b = e
b = 10
Analisis de algoritmos– p. 16
Análisis de algoritmos
! Intento de caracterizar el algoritmo en términos de la cantidad de computación y memoria que se necesita para resolver un problema
! La moneda tiene dos caras: la dificultad del problema y la eficiencia del algoritmo en resolverlo
Calidad de algoritmos
! Tiempo total de computación! Número de operaciones realizadas por el algoritmo
! Número de transiciones tomadas por la Máquina Turing que ejecuta el algoritmo
! Cantidad de memoria utilizada! Número y tamaño de las variables
! Posición extrema a la derecha que se llega a visitar en la cinta de la Máquina Turing durante la ejecución
Operaciones básicas! Cuando el algoritmo
está expresado en pseudocódigo, no lo vamos a convertir en una Máquina Turing
! Buscamos contar la cantidad de las operaciones básicas que contiene el algoritmo
! Aritmética simple! Lógica simple! Comparaciones simples! Asignaciones simples! Saltos
Instancias
AEntrada Salida
Para cada problema, hay varias instancias que son los datos particulares de entrada del problema.
Dificultad de instancias! No todas las instancias son iguales en términos de
dificultad de su resolución.
! Por ejemplo, la Máquina Turing de incremento unitario toma una cantidad diferente de transiciones cuando está presentado con entradas diferentes.
! El tamaño de la entrada evidentemente afecta, pero también afecta su estructura.
! La teoría clásica de complejidad computacional se formula en términos del tamaño de la instancia.
Tamaño de la instancia ! Para llegar a comparabilidad, uno busca
siempre calcular el tamaño de instancia en los mismos términos
! La manera más confiable es convertir todo en binario y luego contar los bits
! La manera más fácil depende del problema, pero es típicamente natural y evidente
Complejidad de peor caso! Fijamos el tamaño de la instancia
! Ejemplo: cantidad de bits! Buscamos la instancia de ese tamaño que es la más
difícil! Ejemplo: que tenga un solo cero al inicio
! Contamos las operaciones requeridas y el consumo de memoria para este peor caso
! Otras opciones incluyen la complejidad del caso promedio y la complejidad amortizada
Complejidad asintótica! Denotamos el tamaño de instancia con n! Calculamos el número de operaciones y el
consumo de memoria para varios diferentes valores de n
! Graficamos el desempeño del algoritmo en función de n
! Buscamos a una función simple que nos de una cota superior al comportamiento observado
Clases de magnitudes
! Buscamos agrupar las posibles funciones de complejidad según su rapidez
! Necesitamos una notación matemática para expresar que una función dada se comporta en el largo plazo de manera parecida a otra
! La palabra asintótica refiere al comportamiento con grandes valores
Ejemplos de funciones
2.3. CALIDAD DE ALGORITMOS 29
0.1
1
10
100
1000
10000
100000
1e+06
1e+07
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
f(x) = ex
f(x) = 2x
f(x) = x3
f(x) = x2
f(x) = x log2(x)f(x) = x
f(x) = log2(x)
Figura 2.1: Crecimiento de algunas funciones comunmente encontrados en el analisisde algoritmos. Nota que el ordenacion segun magnitud cambia al comienzo, pero paravalores suficientemente grandes ya no hay cambios.
Otra propiedad util es que si
(f(n) ! O (h(n)) " g(n) ! O (h(n))) # f(n) + g(n) ! O (h(n)) . (2.3)
Si g(n) ! O (f(n)), f(n) + g(n) ! O (f(n)). Esto nos permite facilmente formarO (f(n)) de polinomios y muchas otras expresiones. Por definicion, podemos ignorarcoeficientes numericos de los terminos de la expresion. Ademas con el resultado anteriornos permite quitar todos los terminos salvo que el termino con exponente mayor. Por logeneral, O (f(n)) es la notacion de complejidad asintotica mas comunmente utilizado.Una observacion interesante es la complejidad asintotica de funciones logarıtmicas: paracualquier base b > 0 y cada x > 0 tal que x ! R (incluso numeros muy cercanos a cero),aplica que logb(n) ! O (nx) (por la definicion de logaritmo). Utilizando la definicion deecuacion 1.25 para cambiar la base de un logaritmo, llegamos a tener
loga(n) =1
logb(a)logb(n) ! ! (logb n) , (2.4)
porque logb(a) es un constante. Entonces, como loga(n) = ! (logb n), no hay necesidadde marcar la base en una expresion de complejidad asintotica con logaritmos.Otra relacion importante es que para todo x > 1 y todo k > 0, aplica que nk ! O (xn)—es decir, cada polinomial crece asintoticamente mas lentamente que cualquiera expresionexponencial.En terminos no muy exactos, se dice que un algoritmo es eficiente si su tiempo de ejecu-cion tiene una cota superior asintotica que es un polinomio. Un problema que cuenta conpor lo menos un algoritmo eficiente es un problema polinomial. Un problema es intratablesi no existe ningun algoritmo eficiente para resolverlo. Tambien se dice que un problemasin solucion si no cuenta con algoritmo ninguno. El el siguiente capıtulo formulamos estestipos de conceptos formalmente.Para ilustrar el efecto del tiempo de ejecucion, el cuadro 2.1 (adaptado de [10]) muestrala dependencia del tiempo de ejecucion del numero de operaciones que se necesita.
2.3. CALIDAD DE ALGORITMOS 29
0.1
1
10
100
1000
10000
100000
1e+06
1e+07
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
f(x) = ex
f(x) = 2x
f(x) = x3
f(x) = x2
f(x) = x log2(x)f(x) = x
f(x) = log2(x)
Figura 2.1: Crecimiento de algunas funciones comunmente encontrados en el analisisde algoritmos. Nota que el ordenacion segun magnitud cambia al comienzo, pero paravalores suficientemente grandes ya no hay cambios.
Otra propiedad util es que si
(f(n) ! O (h(n)) " g(n) ! O (h(n))) # f(n) + g(n) ! O (h(n)) . (2.3)
Si g(n) ! O (f(n)), f(n) + g(n) ! O (f(n)). Esto nos permite facilmente formarO (f(n)) de polinomios y muchas otras expresiones. Por definicion, podemos ignorarcoeficientes numericos de los terminos de la expresion. Ademas con el resultado anteriornos permite quitar todos los terminos salvo que el termino con exponente mayor. Por logeneral, O (f(n)) es la notacion de complejidad asintotica mas comunmente utilizado.Una observacion interesante es la complejidad asintotica de funciones logarıtmicas: paracualquier base b > 0 y cada x > 0 tal que x ! R (incluso numeros muy cercanos a cero),aplica que logb(n) ! O (nx) (por la definicion de logaritmo). Utilizando la definicion deecuacion 1.25 para cambiar la base de un logaritmo, llegamos a tener
loga(n) =1
logb(a)logb(n) ! ! (logb n) , (2.4)
porque logb(a) es un constante. Entonces, como loga(n) = ! (logb n), no hay necesidadde marcar la base en una expresion de complejidad asintotica con logaritmos.Otra relacion importante es que para todo x > 1 y todo k > 0, aplica que nk ! O (xn)—es decir, cada polinomial crece asintoticamente mas lentamente que cualquiera expresionexponencial.En terminos no muy exactos, se dice que un algoritmo es eficiente si su tiempo de ejecu-cion tiene una cota superior asintotica que es un polinomio. Un problema que cuenta conpor lo menos un algoritmo eficiente es un problema polinomial. Un problema es intratablesi no existe ningun algoritmo eficiente para resolverlo. Tambien se dice que un problemasin solucion si no cuenta con algoritmo ninguno. El el siguiente capıtulo formulamos estestipos de conceptos formalmente.Para ilustrar el efecto del tiempo de ejecucion, el cuadro 2.1 (adaptado de [10]) muestrala dependencia del tiempo de ejecucion del numero de operaciones que se necesita.
Ejemplos de tiempos
30 CAPITULO 2. PROBLEMAS Y ALGORITMOS
Cuadro 2.1: En la tabla (originalmente de [10]) se muestra para diferentes valores de n eltiempo de ejecucion (en segundos (s), minutos (min), horas (h), dıas (d) o anos (a)) para unalgoritmo necesita exactamente f(n) operaciones basicas del procesador para encontrarsolucion y el procesador es capaz de ejecutar un millon de instrucciones por segundo.Si el tiempo de ejecucion es mayor a 1025 anos, lo marcamos simplemente como ! ",mientras los menores a un segundo son ! 0. El redondeo con tiempos mayores a unsegundo estan redondeados a un segundo entero mayor si menos de un minuto, al minutoentero mayor si menores a una hora, la hora entera mayor si menores a un dıa, y el anoentero mayor si medidos en anos.
f(n) (#)n ($) n n log2 n n2 n3 1, 5n 2n n!
10 ! 0 ! 0 ! 0 ! 0 ! 0 ! 0 4 s30 ! 0 ! 0 ! 0 ! 0 ! 0 18 min 1025 a50 ! 0 ! 0 ! 0 ! 0 11 min 36 a ! "100 ! 0 ! 0 ! 0 1 s 12, 892 a 1017 anos ! "1000 ! 0 ! 0 1 s 18 min ! " ! " ! "10000 ! 0 ! 0 2 min 12 d ! " ! " ! "100000 ! 0 2 s 3 h 32 a ! " ! " ! "1000000 1 s 20 s 12 d 31710 a ! " ! " ! "
DefinicionesCrecimiento asintótica
Para funciones f : Z+ ! R y g : Z+ ! R, escribimos
f(n) " O (g(n)) si #c > 0 tal que |f(n)| $ c |g(n)| parasuficientemente grandes valores de n
f(n) " ! (g(n)) si #c > 0 tal que |f(x)| % c |g(x)| parasuficientemente grandes valores de n
f(n) " " (g(n)) si #c, c! > 0 tales quec · |g(x)| $ |f(x)| $ c! · |g(x)| para suficientementegrandes valores de n
Algoritmos y problemas– p. 31
Crecimiento asintótica
Para funciones f : Z+ ! R y g : Z+ ! R, escribimos
f(n) " O (g(n)) si #c > 0 tal que |f(n)| $ c |g(n)| parasuficientemente grandes valores de n
f(n) " ! (g(n)) si #c > 0 tal que |f(x)| % c |g(x)| parasuficientemente grandes valores de n
f(n) " " (g(n)) si #c, c! > 0 tales quec · |g(x)| $ |f(x)| $ c! · |g(x)| para suficientementegrandes valores de n
Algoritmos y problemas– p. 31
InterpretaciónInterpretación
O (f(n)) es una cota superior asintotica al tiempode ejecución! (f(n)) es una cota inferior asintotica" (f(n)) dice que las dos funciones crecenasintóticamente iguales
El símbolo ! se reemplaza frecuentemente con =.
Algoritmos y problemas– p. 32
Interpretación
O (f(n)) es una cota superior asintotica al tiempode ejecución! (f(n)) es una cota inferior asintotica" (f(n)) dice que las dos funciones crecenasintóticamente iguales
El símbolo ! se reemplaza frecuentemente con =.
Algoritmos y problemas– p. 32
PropiedadesPropiedades
Las definiciones de crecimiento asintótica se generalizanpara funciones de argumentos múltiples y son transitivas:
(f(n) ! O (g(n)) " g(n) ! O (h(n))) # f(n) ! O (h(n)) .
(f(n) ! ! (g(n)) " g(n) ! ! (h(n))) # f(n) ! ! (h(n))
Como este aplica para ! (f(n)) y O (f(n)) los dos, aplicapor definición también para " (f(n)).
Algoritmos y problemas– p. 33
Propiedades
Las definiciones de crecimiento asintótica se generalizanpara funciones de argumentos múltiples y son transitivas:
(f(n) ! O (g(n)) " g(n) ! O (h(n))) # f(n) ! O (h(n)) .
(f(n) ! ! (g(n)) " g(n) ! ! (h(n))) # f(n) ! ! (h(n))
Como este aplica para ! (f(n)) y O (f(n)) los dos, aplicapor definición también para " (f(n)).
Algoritmos y problemas– p. 33
Propiedades
Las definiciones de crecimiento asintótica se generalizanpara funciones de argumentos múltiples y son transitivas:
(f(n) ! O (g(n)) " g(n) ! O (h(n))) # f(n) ! O (h(n)) .
(f(n) ! ! (g(n)) " g(n) ! ! (h(n))) # f(n) ! ! (h(n))
Como este aplica para ! (f(n)) y O (f(n)) los dos, aplicapor definición también para " (f(n)).
Algoritmos y problemas– p. 33
Polinomios Polinomios
Es fácil formar O (f(n)) de polinomios y muchas otrasexpresiones por observar que en una suma, el términomayor domina el crecimiento:
(f(n) ! O (h(n)) " g(n) ! O (h(n))) # f(n)+g(n) ! O (h(n))
g(n) ! O (f(n)) # f(n) + g(n) ! O (f(n))
Algoritmos y problemas– p. 34
Polinomios
Es fácil formar O (f(n)) de polinomios y muchas otrasexpresiones por observar que en una suma, el términomayor domina el crecimiento:
(f(n) ! O (h(n)) " g(n) ! O (h(n))) # f(n)+g(n) ! O (h(n))
g(n) ! O (f(n)) # f(n) + g(n) ! O (f(n))
Algoritmos y problemas– p. 34
En una sumatoria, el término mayor domina:
Todos los términos menores se ignoran:
Logaritmos Logaritmos
Para cualquier base b > 0 y cada x > 0 tal que x ! R,aplica que logb(n) ! O (nx).Cambiando la base de un logaritmo, llegamos a tener
loga(n) =1
logb(a)logb(n) ! ! (logb n) ,
porque logb(a) es un constante.Entonces no hay necesidad de marcar la base en unaexpresión de complejidad asintótica con logaritmos.
Algoritmos y problemas– p. 35
Practicamos
Primera tarea para entregar
Ordena las funciones siguientes según su crecimientoasintotico O (fi(n)) de la menos rápida a la más rápida:
f1 = 7n f5 =!
nf2 = nn f6 = log7 nf3 = n7 f7 = 7log7 n
f4 = n log7 n f8 = 700n
Algoritmos y problemas– p. 40