Complejidad Complejidad y Tamaño de la entrada Laboratorio de Algoritmos y Estructuras de Datos III Departamento de Computación Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires 1er cuatrimestre de 2013 Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Análisis de algoritmos Complejidad algorı́tmica Dado un algoritmo A queremos saber que tan bueno es, o poder compararlo con otros algoritmos Criterios: Fácil de entender/implementar Uso de memoria (Complejidad espacial) Velocidad (Complejidad temporal) otros Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Análisis de algoritmos Complejidad temporal (velocidad): Calculamos cuánto tarda en ejecutarse cada instrucción del algoritmo y sumamos todo ¿Cuánto tarda cada instrucción? Para responder eso necesitamos usar modelos Modelos Un modelo define matemáticamente cómo se comporta la computadora. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Modelos Vamos a usar dos modelos: Modelo Uniforme Modelo Logarı́tmico Caracterı́sticas de los modelos: No hay lı́mite de memoria. Memoria dividida en celdas identificables. Operaciones básicas: (+, [·], if , etc) Instrucciones se ejecutan en orden El programa no se escribe a sı́ mismo. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Modelos Modelo Uniforme Datos básicos entran en una celda de memoria (número, puntero, etc.) Operaciones básicas sobre una celda de memoria cuestan O(1) Modelo Logarı́tmico Datos básicos ocupan cantidad de celdas proporcional al tamaño del dato. Las operaciones sobre tipos básicos no cuestan (necesariamente) O(1) Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Modelos Operación a+b a∗b v[i] inc(i) for i = 1..n Costos de algunas operaciones Uniforme Logarı́tmico 1 log2 (a) + log2 (b) 1 log2 (a) ∗ log2 (b) 1 log2 (i) 1 log2 (i) Pn n i=1 log2 (i) ∈ θ(n · log (n)) Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Modelos ¿Cuál modelo es mejor? La pregunta es: ¿Cuál es más útil? Si vamos a ordenar nombres, probablemente el uniforme porque los nombres tienen un largo acotado, y la cantidad de nombres está acotado por la cantidad de personas. Datos que podrı́an entrar en los tipos de datos primitivos (por ej. enteros de 64 bits). Si vamos a factorizar un número como parte de un sistema relacionado con criptografı́a, probablemente el logarı́tmico, porque el número va a tener cientos o miles de bits. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Modelos ¿Alguno de los dos modelos es del todo realista? ¿Existen modelos que lo sean? Hay toda una rama de la ciencia de la computación que se dedica a estudiar esto. En principio igual un modelo nunca va a ser del todo realista, porque es una simplificación de la realidad... Algunos modelos más modernos: Modelo Trans Dicotómico. Maquinas Word Ram (wRAM, quizás el más usado en el área hoy en dı́a). Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Modelos Modelo Trans Dichotómico Operaciones básicas sobre parámetros de tamaños menores al log del tamaño de la entrada cuestan O(1) Si los parámetros tiene tamaños mayores, se utiliza el modelo logarı́tmico para analizarlos, es decir las operaciones cuestan siempre en función al tamaño de los argumentos. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Tamaño de Entrada Definición Tamaño de entrada Dada una instancia I, el tamaño de la entrada es la cantidad de bits necesaria para representar la instancia I en un formato razonable. Razonable: Subjetivo Representar un número en base 1 no es razonable. (ejemplo: 6 es IIIIII) Representar un número en base b > 1 es razonable. Información innecesaria no es razonable. Importante El tamaño de la entrada NO depende del modelo. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Tamaño de Entrada ContarBits Problema: Contar cuántos bits valen 1 en la representación binaria de un número natural. Algorithm 1.1: ContarBits(n) res ← 0 while n > 0 res ← res + n mod 2 do n ← bn/2c return (res) ¿Complejidad temporal en el modelo uniforme ? Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Tamaño de Entrada ContarUnos Problema: Dado un vector de bits, contar cuántos valen 1. Algorithm 1.2: ContarUnos(vector < bit > v ) res ← 0 n ← v .size() for i ← 1 to n do res ← res + v[i] return (res) ¿Complejidad temporal en el modelo uniforme ? Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Tamaño de Entrada Complejidad temporal (en el modelo uniforme): ContarBits(n): O(log(n)). ContarUnos(n): O(n). Pero hacen esencialmente lo mismo... Tamaño de entrada: ContarBits(n): log2 (n) ContarUnos(n): n Complejidad en función del tamaño de entrada Son algoritmos lineales en función del tamaño de entrada (en modelo uniforme). Ambos tienen complejidad O(t) siendo t el tamaño de entrada. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Tamaño de Entrada Dada una instancia I llamamos: T (I ) el costo temporal del algoritmo para la instancia I S(I ) al tamaño de entrada de la instancia I Asumimos el modelo uniforme, aunque el mismo razonamiento aplica para el modelo logarı́tmico. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Algunas Definiciones (Repaso) Repasemos algunas definiciones... f (n) = O(g (n)) ⇔ ∃c ∈ R + , n0 ∈ N tal que ∀n ≥ n0 , |f (n)| ≤ c · g (n) (f (n) está acotada superiormente por g (n)) f (n) = Ω(g (n)) ⇔ ∃c ∈ R + , n0 ∈ N tal que ∀n ≥ n0 , |f (n)| ≥ c · g (n) (g (n) es cota inferior de f (n)) f (n) = θ(g (n)) ⇔ ∃c1 , c2 ∈ R + , n0 ∈ N tal que ∀n ≥ n0 , c1 · g (n) ≤ |f (n)| ≤ c2 · g (n) (f (n) está acotado inferior y superiormente por g (n)) Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Ejemplos ContarBits(n) 1 T (I ) ∈ O(log (n)) 2 S(I ) ∈ Ω(log (n)) 3 De 1, T (I ) ≤ k · log (n) 4 De 2, k 0 · log (n) ≤ S(I ), o bien, log (n) ≤ 5 De 3 y 4, T (I ) ≤ k · log (n) ≤ 6 De 5, T (I ) ∈ O(S(I )) k k0 · S(I ) = 1 k0 k 00 · S(I ) · S(I ) Dada una cota inferior de S y una cota superior de T, obtenemos una cota superior de T, en función de S. Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Ejemplos ContarUnos(n) 1 T (I ) ∈ O(n) 2 S(I ) ∈ Ω(n) 3 De 1, T (I ) ≤ k · n 4 De 2, k 0 · n ≤ S(I ), o bien, n ≤ 5 De 3 y 4, T (I ) ≤ k · n ≤ 6 De 5, T (I ) ∈ O(S(I )) k k0 1 k0 · S(I ) · S(I ) = k 00 · S(I ) Ambos algoritmos tienen complejidad O(S(I )), es decir, lineal en función del tamaño de entrada. (en el modelo uniforme). Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Ejemplos Problema: Calcular el menor elemento de una matriz en N a×b Entrada: Dos números a y b, seguido de a lı́neas con b números cada una representando la matriz M. Salida: El menor elemento de la matriz. Algorithm 1.3: MenorMatriz(M) a ← Filas(M) b ← Columnas(M) res ← ∞ for i ← 1 to a for j ← 1 to b do do res ← min(res,Mi,j ) return (res) Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Ejemplos Complejidad Temporal: 1 T ∈ O(a · b) (modelo uniforme) 2 Tamaño de entrada: S = S(a) + S(b) + 3 S(a) ≥ 1.S(b) ≥ 1.S(Mi,j ) ≥ 1. 4 Acotamos S por abajo: S ∈ Ω(a · b) 5 Separamos las variables: S ∈ Ω(a) y S ∈ Ω(b) 6 S ≥ k1 · a y S ≥ k2 · b 7 T ≤ k3 · a · b ≤ k3 · ( k11 · S) · ( k12 · S) = k3 · S 2 8 T ∈ O(S 2 ) Laboratorio de Algoritmos y Estructuras de Datos III Pa i=1 Pb j=1 S(Mi,j ) Complejidad y Tamaño de la entrada Complejidad Modelos Tamaño de Entrada Repaso de Definiciones Ejemplos Ejemplos ¿No es extraño que recorrer el input una vez tome un tiempo mayor a lineal? 1 T ∈ O(a · b) (modelo uniforme) 2 S ∈ Ω(a · b) 3 S ≥ k1 · a · b 4 T ≤ k2 · a · b ≤ k2 · ( k11 · S) = k3 · S 5 T ∈ O(S) Laboratorio de Algoritmos y Estructuras de Datos III Complejidad y Tamaño de la entrada