Programación avanzada Eficiencia de un Algoritmo I Clase 1 En programación, un problema puede ser resuelto en diversas formas, y hasta este momento cualquiera de estas posibles soluciones o algoritmos se considera correcta siempre y cuando se cumpla la funcionalidad que debían cumplir. Sin embargo, dependiendo del contexto en el que se ocupará esa solución, que la ejecución tarde más o menos tiempo -inclusive segundosayuda a identificar la eficiencia de una solución y a definir cuál de todas esas soluciones es la más eficiente. Por ejemplo, existe una métrica llamada distancia Levenshtein que identifica el número de modificaciones que se le tiene que hacer a una palabra para que sea igual a otra con la cual la estamos comparando. En la Figura 1 se muestra un ejemplo de la distancia Levenshtein entre 5 palabras y la palabra méxico. México mejico méxicano Mexico mex méxico Figura 1. Distancia Levenshtein. Si como en el ejemplo de la Figura 1 hubiera solo 5 palabras a verificar contra 1 palabra base, cualquier solución podría ser eficiente en términos de tiempo de ejecución. Sin embargo, si en lugar de tener 5 palabras hubiera 1 millón de palabras contra las cuales cuantificar la distancia levenshtein, el tiempo de ejecución aumentaría considerablemente. La eficiencia en programación siempre se asocia al tiempo que un programa tarda en ser ejecutado y este a su vez se asocia al concepto de tasa de crecimiento, en donde queremos medir la diferencia en tiempo de ejecución de una solución conforme se modifican los parámetros de entrada, la cantidad de datos que procesa, las características de hardware ocupadas, entre otros. Para conocer la eficiencia de una solución algorítmica en diferentes escenarios requerimos de la notación asintótica. ¿Qué es la notación asintótica? En cálculo existe el concepto de asíntota y corresponde a identificar los límites en los cuáles una función no tiene un valor. Por ejemplo, en la Figura 2 se muestra la gráfica correspondiente a la función logaritmo natural ln(x) que está definida en valores de x mayores a 0, por lo que tiene una asíntota en x=0, para ese valor, el logaritmo natural no está definido. Figura 2. Logaritmo natural. En programación, la notación asintótica permite conocer de manera estándar y no ambigua cuál es el desempeño de un algoritmo en 3 diferentes circunstancias: ● ● ● El peor desempeño El desempeño en cierto rango El mejor desempeño Notaciones asintóticas Big O Esta notación permite definir cuál es el peor desempeño del algoritmo. Corresponde a la asíntota superior, por lo que marca el límite del tiempo que puede tomar la ejecución de un algoritmo en el peor de los casos. Se lee “O grande de”. Puedes pensar en esta cota como el tiempo máximo que un algoritmo puede tomar. En la Figura 3 se muestra el tiempo de ejecución de un algoritmo y la O grande de este algoritmo como la cota superior de tiempo de ejecución en el peor escenario. para adquirir datos que te permitan identificar si el canario sobrevivió o no. Figura 3. Tiempo de ejecución de un algoritmo definido por notación asintótica Big O. Big Ω También llamada Big omega, esta notación permite definir el límite inferior del tiempo de ejecución de un algoritmo, por lo que marca el mínimo de tiempo que puede tomar la ejecución de un algoritmo en el mejor de los casos. Se lee “Omega grande de”. Puedes pensar en esta cota como el menor tiempo que un algoritmo puede tomar. Figura 4. Tiempo de ejecución de un algoritmo definido en notación asintótica Big 𝛺 Big Θ También llamada Big theta, esta notación permite definir tanto el límite inferior como el límite superior del tiempo de ejecución de un algoritmo. Puedes pensar en esta cota como el tiempo promedio de ejecución que un algoritmo puede tomar. Por ejemplo, en la Figura 5, se muestra que el tiempo de ejecución de un algoritmo es 𝑛 y que este tiempo de ejecución tiene una cota superior de 𝑠 ⋅ 𝑛 y una cota inferior de 𝑘 ⋅ 𝑛, donde 𝑠 y 𝑘 son constantes. Figura 5. Tiempo de ejecución de un algoritmo definido en notación asintótica Big 𝛩, 𝑘 < 𝑠. Sin importar la notación asintótica que utilices, el tiempo de ejecución o tasa de crecimiento de un algoritmo que se indica dentro de la 𝑂, Ω o Θ debe cumplir los siguientes puntos: ● ● No se incluyen constantes Si el tiempo de ejecución tiene más de 1 término en su ecuación, se toma el que mayor tiempo tarda en ejecutarse Por ejemplo, si el tiempo de ejecución de un algoritmo es de 6𝑛2 + 25𝑛 + 5 se reportaría como 𝛺(𝑛). Nota que al tener notación asintótica no defines la unidad de 𝑛, es decir, no estamos diciendo que sean milisegundos, segundos, minutos. En tu clase 2 de esta materia aprenderás sobre cómo definir el tiempo de ejecución de un algoritmo, complementando la notación asintótica.