Algoritmos y Complejidad Esmeide Leal Introducción • Números Romanos • Antes que la numeración india fuera adoptada, muchos de los países Europeos usaban la numeración Romana. • ¿Como haces para hacer aritmética con números escritos en números romanos? • ¿Qué es XLVIII + LIII • ¿Qué es V * X ? Introducción • Muhammad ibn Musa al-Khwarizmi • al-Khwarizmi (c. 780 –c. 850) fue un erudito persa quién escribió libros de textos en cómo hacer aritmética y álgebra usando el sistema numérico Indio. • Introdujo el posicionamiento de los decimales. • Describió los pasos básicos para sumar, substraer, multiplicar y dividir números. • Desarrolló reglas básicas del álgebra (al-jabr significa restauración en árabe). • Resolvió las raíces de polinomios cuadráticos y calculó la raíz cuadrada y dígitos de ϖ. • Estos textos fueron traducidos al latín in 1145 y popularizados en Europa por Fibonacci en la 15ª centuria. • Al-Khwarizmi cuando se tradujo al latín fue algorithmi, y su nombre fue usado como raíz de la palabra algoritmo en muchos lenguajes Europeos Introducción • Algoritmos y Problemas • ¿Qué es un algoritmo? • Un algoritmo intenta resolver un problema. • En ciencias computacional un problema es establecido como una relación entre condiciones de entrada y salidas esperadas. • Suma • Entrada: N, M ϵ Z Substracción Entrada: N, M ϵ Z • Salida: N + M Salida: N - M • Multiplicación • Entrada: N, M ϵ Z • Salida: NM División Entrada: N, M ϵ Z Salida: Q=N/M y R = N%M • Esta es una secuencia de pasos que trasforman la entrada en la salida Introducción • Instancias • Una entrada a un problema que coincide con las condiciones de entrada es llamada una instancia del problema • Suma • Entrada: N, M ϵ Z • Salida: N + M Substracción Entrada: N, M ϵ Salida: N - M • Multiplicación • Entrada: N, M ϵ Z • Salida: NM División Entrada: N, M ϵ Z Salida: Q=N/M y R = N%M Z • Un ejemplo de instancia de los problemas anteriores N = 42, M = 1337 N = -35, M = 35 N = 65536, M = 1024 Introducción • Algoritmo • Un algoritmo es una solución a un problema • Problemas y algoritmos son abstractos • • Un problema es una abstracción y una instancia es concreción Un algoritmo es una abstracción y un programa resolviendo una instancia es una concreción • Un algoritmo se enuncia en pseudocódigo, un híbrido de lenguaje natural y código. • • La audiencia prevista de un algoritmo son otros seres humanos, por lo que está escrito para que otros puedan entenderlo. La audiencia prevista de un programa es el computador y por eso debemos hablar su lenguaje. • El algoritmo describe los pasos que un programa debe tomar para resolver un problema. • Los algoritmos son medidos por dos estándares: • Corrección: preferimos demostrar que un algoritmo es correcto mediante una prueba formal de corrección. Cuando esto no es posible, podemos confiar en evidencia empírica del desempeño de un algoritmo. Eficiencia: demostramos la eficiencia de un algoritmo proporcionando un análisis de tiempo de ejecución o un análisis de los costos de otros recursos. Los análisis de tiempo de ejecución formales a menudo incluyen pruebas. Analysis of Algorithms • ¿Qué hace que un algoritmo sea bueno? • Corrección • Un algoritmo siempre es correcto. • Un algoritmo de aproximación siempre está cerca de ser correcto según alguna medida. • Una heurística suele ser correcta, pero no en todos los casos. • Un algoritmo aleatorio tiene una probabilidad de corrección. • Demostramos estas propiedades con una prueba de corrección. • Eficiencia • Un algoritmo requiere una cierta cantidad de pasos. • Un algoritmo utiliza cierta memoria para llevar a cabo los pasos. • Un algoritmo puede utilizar otros recursos, como un canal de comunicación o la aleatoriedad. • Demostramos la eficiencia con análisis cuantitativo de recursos. Funciones de Tiempo de Ejecución • La cantidad de operaciones que realiza un algoritmo generalmente depende del tamaño de la instancia. • Es muy común que las entradas más grandes requieran más operaciones. • Medimos la cantidad de operaciones que realiza un algoritmo como una función de su tamaño de entrada. • Por ejemplo, esta función podría expresar un tiempo de ejecución f(n) = 4n2 + 6n + 3 • Esto significa que cuando el algoritmo se ejecuta en una entrada de tamaño n, requerirá f(n) cantidad de operaciones. • No todas las funciones expresan un tiempo de ejecución y hay una clase de funciones que se encuentran comúnmente en el análisis de tiempos de ejecución. • Las funciones de tiempo de ejecución son típicamente funciones no negativas y no decrecientes. Funciones de Tiempo de Ejecución • A continuación, se muestran algunas funciones de tiempo in orden de crecimiento asintótico creciente. • Logarítmico • (loga n)d para a, d ϵ R+ • Polinomial • nd para d ϵ R+ • Exponencial • bn para b ϵ R+, b ≥ 1 • Mas allá • n! • nn Funciones de Tiempo de Ejecución • A continuación, se muestran algunas funciones de tiempo in orden de crecimiento asintótico creciente. Forma O(x) Nombre -----------------------------------------O(1) Constante O(log x) Logarítmico O(x) Lineal O(xlog x) xLogarítmico O(x) Cuadrático O(x) Cúbico O(x ), m=0,1,2,3 Polinomial O(C ), c>1 Exponencial O(n!) Factorial