Uploaded by Raúl Sánchez García

Clase 1 (1)

advertisement
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.
Download