Algoritmos y estructuras II Análisis y complejidad Prof. Diego Mosquera U. Abril de 2008. Orden de crecimiento ¿Qué es? • Da una caracterización simple de la eficiencia de un algoritmo. – Simplifica el cálculo de la eficiencia: • Encontrar fórmulas cerradas a veces es complejo: como determinar la fórmula de una ecuación de recurrencia. • Determinar el tiempo de corrida exacto de un algoritmo da precisión extra que no vale el esfuerzo en la matemática computacional. • Como la eficiencia se estudia para entradas muy grandes al algoritmo, las constantes multiplicativas y los términos de orden inferior son dominados por el efecto del mismo tamaño de la entrada. ¿Qué es? Por ejemplo: Suponga que se tiene un algoritmo cuyos tiempo de corrida está dado por la expresión: T(n) = 3n2 + 10n + 10 Cuantitativamente, los valores constantes y los términos de orden inferior son despreciables cuando n es grande. Veamos: ¿Qué es? Suponga que n = 10, entonces – Tiempo de corrida para 3n2: 73,2% – Tiempo de corrida para 10n: 24,4% – Tiempo de corrida para 10: 2,4% Ahora suponga que n = 100: – Tiempo de corrida para 3n2: 96,7% – Tiempo de corrida para 10n: 3,2% – Tiempo de corrida para 10: <0,1% Lo que significa que los términos de orden inferior es precisión extra no necesaria. Lo mismo sucede con las constantes multiplicativas cuando n es suficientemente grande, por lo que el término importante es n2 (término dominante de la ecuación). ¿Qué es? • Cuando se eliminan las constantes y términos menos significativos de la expresión, entonces estamos estudiando el orden de crecimiento del tiempo de corrida del algoritmo. A esto se le llama eficiencia asintótica del algoritmo. – Se estudia el comportamiento de la función de complejidad en el límite. ¿Qué es? Conclusión #1: – Podemos estudiar el comportamiento preciso del tiempo de corrida de un algoritmo en función al tamaño de la entrada. – Podemos estudiar el comportamiento asintótico del tiempo de corrida de un algoritmo en función al tamaño de la entrada. El segundo caso nos permite concluir cosas como: f(n) = θ (g(n)), f(n) = O(g(n)), f(n) = Ω(g(n)). Por lo que necesitamos una notación precisa de cálculo. ¿Qué es? Conclusión #2: – Orden de crecimiento vs cálculo exacto • θ (n2) vs n2 + 5n +1 • θ(n lg n) vs 50n lg n – Orden de Crecimiento: • Comportamiento asintótico • Eficiencia en el limite. Notación asintótica ¿Qué es? • Sirve para describir el tiempo de corrida asintótico de un algoritmo, que es una función con dominio en los números naturales N = {0,1,2,…} T(n) : N -> R≥0 • Tales notaciones permiten describir la función del tiempo de corrida T(n) en el peor de los casos. • Ejemplos: – – – – – Ordenamiento por inserción: T(n) = θ (n2) Ordenamiento por mezcla: T(n) = θ (n logn) Búsqueda lineal: T(n) = O(n) Búsqueda binaria: T(n) = O(logn) … Notación Theta (θ) • Llamada orden exacto • Para una función dada g(n), denotamos por θ(g(n)) al conjunto de funciones: θ(g(n)) = {f(n) | ∃c1,c2∈R+, ∃n0∈N : 0 ≤c1g(n)≤f(n) ≤ c2g(n), ∀ n≥n0 } “Una función f(n) ∈ θ(g(n)) si existen dos constantes reales positivas c1,c2 tales que f(n) esté acotada inferiormente por c1g(n) y superiormente por c2g(n) para un n suficientemente grande.” Notación Theta (θ) • Ejemplo #1: Probar que 1/2n2 – 3n = θ(n2) Solución: Existen muchas constantes c1 y c2. Lo importante es conseguirlas a ambas (y tratar que n0 sea lo más pequeño posible) Generemos varias gráficas para ver qué podemos obtener: Notación Theta (θ) – Gráfica #1: c1 = 1/3, c2 = 1 500 400 1/2n2 – 3n 300 200 100 5 10 15 20 Entonces,aproximadamente, n0 ≥ 19 25 30 Notación Theta (θ) – Gráfica #2: c1 = 1/14, c2 = 1/2 25 1/2n2 – 3n 20 15 10 5 2 4 6 -5 Entonces,aproximadamente, n0 ≥ 7 8 10 Notación Theta (θ) – Calculando esto, tenemos: c1n2≤ 1/2n2 – 3n ≤ c2n2 = <Dividiendo entre 2> c1≤ 1/2 – 3/n ≤ c2 - Para n < 7 no se cumple que c1∈R+. Por tanto, c1≤ 1/14 para n0 = 7 - Para n≥1 se cumple que c2∈R+. Por tanto, c2 ≥ (c2 > 0, digamos c2 ≥ ½) Por tanto para n0 = 7, c1=1/14 y c2=1/2, 1/2n2 – 3n ∈ θ(n2) Notación Theta (θ) • Ejemplo #2: Probar que 6n3 ≠ θ(n2) Solución: Nótese que c1 existe para n0 ≥ 0 . Aquí debemos probar que c2 no existe. Prueba por contradicción: Suponemos que c2 y n0 existen, por lo que: 6n3 ≤ c2n2 para todo n ≥ n0 Pero entonces n ≤ c2/6, lo que no es necesariamente cierto para un n suficientemente grande porque c2 es constante. Entonces contradice el heho supuesto n ≥ n0 Notación O-grande (O) • Notación para el orden superior ajustado • La notación θ acota a una función por arriba y por abajo. Cuando solo tenemos una cota superior utilizamos la notación O-grande. • Para una función dada g(n), denotamos por O(g(n)) al conjunto de funciones: O(g(n)) = {f(n) | ∃c∈R+, ∃n0∈N : 0 ≤f(n) ≤ cg(n), ∀ n≥n0 } “Una función f(n) ∈ O(g(n)) si existe una constante real positiva c tal que f(n) esté acotada superiormente por cg(n) para un n suficientemente grande.” Notación O-grande (O) • Ejemplo: Probar que 27n2 + 355/113n + 12 = O(n2) Solución: Existen muchas constantes c Lo importante es conseguir alguna (y tratar que n0 sea lo más pequeño posible) Generemos algunas gráficas para ver qué podemos obtener: Notación O-grande (O) – Gráfica #1: c = 30 3´ 10 2.5 ´ 10 27n2 + 355/113n + 12 7 7 2´ 10 7 1.5 ´ 10 7 1´ 10 7 5´ 10 6 200 400 600 800 Entonces,aproximadamente, n0 ≥ 300 1000 Notación O-grande (O) – Gráfica #2: c = 4762/113 27n2 + 355/113n + 12 4000 3000 2000 1000 2 4 6 Entonces,aproximadamente, n0 ≥ 1 8 10 Notación O-grande (O) – Calculando esto, tenemos: 27n2 + 355/113n + 12 ≤ cn2 Sabemos que 27n2 + 355/113n + 12 ≤ 27n2 + 355/113n2 + 12n2 = <Cálculo> 27n2 + 355/113n + 12 ≤ (27 + 355/113 + 12)n2 = <Cálculo> 27n2 + 355/113n + 12 ≤ (4762/113)n2 - Para n≥1 se cumple que c∈R+. Por tanto, c ≥ 4762/113 Por tanto para n0 = 1, c= 4762/113, 27n2 + 355/113n + 12 ∈ O(n2) Notación Omega-grande (Ω) • Notación para el orden inferior ajustado • Cuando solo tenemos una cota inferior utilizamos la notación Ω -grande. • Para una función dada g(n), denotamos por Ω(g(n)) al conjunto de funciones: Ω(g(n)) = {f(n) | ∃c∈R+, ∃n0∈N : 0 ≤ cg(n) ≤f(n) , ∀ n≥n0 } “Una función f(n) ∈ Ω(g(n)) si existe una constante real positiva c tal que f(n) esté acotada inferiormente por cg(n) para un n suficientemente grande.” Notación Omega-grande (Ω) • Ejemplo: Probar que sqrt(n) = Ω(log(n)) Solución: Existen muchas constantes c Lo importante es conseguir alguna (y tratar que n0 sea lo más pequeño posible) Generemos una gráfica para ver qué podemos obtener: Notación Omega-grande (Ω) – Gráfica #1: c = 1 Sqrt(n) 6 4 2 10 20 30 40 -2 -4 -6 Entonces,aproximadamente, n0 ≥ 16 50 Teorema 1.1 Sean f(n):N->R+ y g(n) :N->R+ funciones, entonces: f(n) = O(g(n)) si y solo si f(n) = Ω(g(n)) Notación o-chica (o) • La notación O-grande se utiliza para denotar cotas superiores asintóticamente ajustadas: 2n2 = O(n2). • Usamos o-chica para denotar una cota superior que no es asintóticamente ajustada: 2n = o(n2). • Entonces, para una función dada g(n), denotamos por o(g(n)) al conjunto de funciones: o(g(n)) = {f(n) | ∀ c∈R+, ∃n0>0∈N : 0 ≤f(n) < cg(n) , ∀ n≥n0 } Notación o-chica (o) • Así, 2n = o(n2), pero 2n2 ≠ o(n2) • Vemos la similitud en la definición O y o. La principal diferencia es que f(n) = O(g(n)) se cumple para alguna constante c real y positiva, mientra que f(n) = o(g(n)) se cumple para toda constante c real y positiva. Notación o-chica (o) • Intuitivamente, si f(n) = o(g(n)), entonces f(n) es insignificante (despreciable ) frente a g(n) en el infinito, que es: Limn->∞ f(n)/g(n) = 0 Principio de dominancia de funciones Notación o-chica (o) • Ejemplo: Utilizando el principio de dominancia, demuestre que loglogn = o(logn) Solución: Dado que ambas funciones tienden a infinito cuando n tiende a infinito, Aplicamos la Regla de L’Hospital, tenemos: Limn->∞ loglogn/logn = Limn->∞ [((1/n)(1/Ln2))/logn]/[[(1/n)(1/Ln2)] = Limn->∞ 1/logn =0 Teorema 1.2 Si g(n) y f(n) son funciones en los reales positivos que crecen sin límites, entonces: Si Ln(g(n)) = o(Ln(h(n))) entonces h(n) = o(g(n)) Demostración del teorema[3,pg-151] Notación o-chica (o) • Ejemplo: Demuestre que nc = o(nlogn) para c > 1 Solución: Aplicando el teorema 1.2, tenemos: Limn->∞ cLnn/lognLnn = Limn->∞ c/logn =0 Notación ω-chica (ω) • La notación Ω -grande se utiliza para denotar cotas inferiores asintóticamente ajustadas. • Usamos ω -chica para denotar una cota inferior que no es asintóticamente ajustada: n2 /2= ω(n). • Entonces, para una función dada g(n), denotamos por ω(g(n)) al conjunto de funciones: ω(g(n)) = {f(n) | ∀ c∈R+, ∃n0>0∈N : 0 ≤ cg(n) < f(n) , ∀ n≥n0 } Notación ω-chica (ω) • Así, n2 /2= ω(n), pero n2 /2 ≠ ω (n2) • Vemos la similitud en la definición Ω y ω. La principal diferencia es que f(n) = Ω(g(n)) se cumple para alguna constante c real y positiva, mientra que f(n) = ω(g(n)) se cumple para toda constante c real y positiva. Notación ω-chica (ω) • Intuitivamente, si f(n) = ω(g(n)), entonces g(n) es insignificante (despreciable ) frente a f(n) en el infinito, que es: Limn->∞ f(n)/g(n) = ∞ Regla del límite Dadas las funciones arbitrarias f y g : N->R≥0 tenemos: • • • Si Limn->∞ f(n)/g(n) ∈ R+, entonces f(n) = θ(g(n)) Si Limn->∞ f(n)/g(n) = 0, entonces f(n) = O(g(n)), pero f(n) ≠ θ(g(n)) Si Limn->∞ f(n)/g(n) = + ∞, entonces f(n) = Ω(g(n)), pero f(n) ≠ θ(g(n)) Demostración de la regla del límite[1,pg-97] Regla del límite Ejemplo: Demostrar por la regla del límite que logn = O(sqrt(n)) Solución: Dado que ambas funciones tienden a infinito cuando n tiende a infinito, se aplica la regla de L’Hospital: Limn->∞ logn/sqrt(n) = Limn->∞ (1/n)/[1/(2sqrt(n))] = Limn->∞ 2/sqrt(n) =0 Reflexiones importantes • Las funciones de complejidad de los algoritmos se consideran funciones con dominio en N, pues las entradas tendrán tamaños naturales: – – – – Valor de un número del que se calcula el factorial, Número de aros a mover en las Torres de Hanoi, Número de datos a ordenar, Número de nodos y aristas de un grafo (en este caso la entrada es NxN , que es isomorfo a N) Reflexiones importantes • Las funciones de complejidad de los algoritmos se consideran funciones con rango R≥0 ,pues el tiempo de ejecución no puede ser negativo. • Sólo interesa lo que pase asintóticamente (n>=n0), por lo que podríamos considerar funciones no definidas en todo N o que tomen valores negativos para algunos valores de n. Reflexiones importantes • Para demostrar que T(n) no pertenece a un orden específico, por ejemplo, que T(n) ≠ O(g(n)), puede utilizarse la regla del límite, o puede hacerse por contradicción basado en el supuesto de que la (s) constante (s) existen y que el n0 existe. Propiedades de las notaciones asintóticas PRÓXIMA CLASE Referencias • [1] Brassard G. y Bratley P. Fundamentos de Algoritmia. • [2] Cormen T., Leiserson C. and Rivest R. Introduction to algorithms • [3] Yriarte V. Elementos de la teoría combinatoria.