Está en la página 1de 13

Notación O y análisis

Anteriormente, se habló de los algoritmos, se analizaron y, con ello, se determinó su


tiempo de ejecución. Se analizaron matemáticamente a través de funciones y se
descubrió cuáles son las funciones más comunes.
En esta lectura, se desarrollará por qué interesa analizar las tasas de crecimiento de
las funciones ante las entradas grandes.

Notación O

Cota superior asintótica

Cota inferior asintótica y cota ajustada asintótica

Conceptos para tener en cuenta

Referencias
LECCIÓN 1 de 5

Notación O

El impacto se profundiza a medida que crecemos en el problema a resolver,


por lo cual, consideraremos a N tendiendo a infinito. 

En ese caso, estaremos considerando su comportamiento asintótico. Al


momento de identificar diferentes relaciones entre funciones y recursos,
podemos agrupar los comportamientos resultantes en familias de
funciones, dependiendo de su comportamiento asintótico, y les asignaremos
un orden de complejidad O.

La notación O-grande no toma en cuenta los factores constantes, es decir,


ignora si se hace una mejor o peor implementación del algoritmo, además de
independizarlo de los datos de entrada del algoritmo.

Como utilidad de aplicar este concepto es encontrar un límite superior del


tiempo de ejecución, es decir, el peor caso. (Tovar, 2012).

La notación O nos ayuda a analizar el comportamiento de los algoritmos.


Verdadero.

Falso.

SUBMIT

C O NT I NU A R
LECCIÓN 2 de 5

Cota superior asintótica

Cota superior asintótica es otra manera de nombrar a la notación O. Luego se


analizará por qué se llama así. 

Se ha notado que los algoritmos, ante entradas pequeñas, pueden mostrar


una diferencia de eficiencia mínima. En esos casos, no parece lógico realizar
un gran esfuerzo por optimizar un algoritmo, ya que el tiempo de ejecución
mejorará muy poco con respecto a otro algoritmo más sencillo. 

Sin embargo, también se mencionó que esas situaciones no son tan


comunes y que, en realidad, se necesitan algoritmos que funcionen
eficientemente ante las grandes entradas. Allí, las diferencias en el tiempo
de ejecución, entre los algoritmos equivalentes, se hacen mayores. Además,
en estos casos, sí se requiere realizar un esfuerzo para optimizar los
algoritmos. 

Se retoma el ejemplo de la lectura anterior: la función que define el tiempo de


ejecución para el despliegue de la tabla en un reporte de ventas por
vendedor. 
Se dijo que lleva 0,0014 segundos contar la cantidad de registros y dibujar la
tabla con sus encabezados. Luego, que toma 0,012 segundos obtener y
colocar en la tabla el registro de las ventas de cada vendedor.

Se definió que la función del tiempo de ejecución resultante sería:

tiempo de ejecución: 𝑡𝑒 = 0,0014 + 𝑁∗0,12.

Donde N es la cantidad de registros de ventas del sistema. 

Este análisis permite dar cuenta de que no interesa el tiempo exacto que
demanda la ejecución de un algoritmo. Lo que interesa es cuánto aumenta el
tiempo de ejecución demandado por un algoritmo, a medida que aumenta la
cantidad de entradas. Es por esto que el término independiente 0,0014 ya se
vuelve despreciable. Lo mismo sucede con el coeficiente que acompaña al
término lineal 0,012. Estos valores no van a determinar el tiempo de
ejecución de un algoritmo con grandes entradas. 

Lo que se busca es garantizar que el tiempo de ejecución de un algoritmo


siempre sea menor a una cota o límite superior. Con esto, se sabe que, en el
peor de los casos, este algoritmo tendrá un tiempo de ejecución que será
proporcional a la función lineal N.

Lo importante en este tipo de análisis es poder encontrar una


función que acote el crecimiento que, en el peor de los casos,
tendrá la complejidad del algoritmo.
Al conjunto de funciones que acotan dicho crecimiento lo
llamamos O(g(x)) donde x representa la cantidad de elementos
que se van a procesar y g(x) es cualquier cota superior de la
función de complejidad del algoritmo.

Más formalmente, lo planteamos de la siguiente manera: sea


f(x) la función que expresa la complejidad de un algoritmo,
entonces la expresión f(x) pertenece a O(g(x)), significa que f(x)
crece, a lo sumo, tan rápido como cualquiera de las funciones g
del conjunto O. (Sznajdleder, 2012, p. 523).

Por lo tanto, ahora se usará la O mayúscula para denotar aquella función que
indique el límite superior de crecimiento de una función. En el ejemplo dado,
se dirá que el algoritmo tiene un tiempo de ejecución del orden de la función
lineal denotado como O(N). Esto es conocido como notación O mayúscula o
big O. 

Es evidente notar que el orden será definido por el término más importante
de la función. Esto significa que, ante distintas funciones, se hará énfasis en
el término que le da el grado a la función analizada. Este término es el más
dominante y representa la tasa de crecimiento que interesa analizar. 

Por ejemplo, si se tiene una función cuadrática del tipo: 𝑎𝑁2+𝑏𝑁+𝑐, se dirá

que es del orden cuadrático 𝑂(𝑁2) y que se prescinde de los demás términos
que, como ya se mencionó, son despreciables. 
Así, se encuentran las funciones que se mencionaron en la lectura anterior.
Esas son las funciones más comunes.

Como conclusión, podemos decir que los algoritmos polinomiales son


“buenos” algoritmos y los algoritmos exponenciales son “malos” algoritmos.

En la tabla 1, se pueden observar las funciones ordenadas de menor a mayor


tasa de crecimiento.

Tabla 1: Funciones que describen comúnmente los tiempos de ejecución de


los algoritmos
Fuente: Weiss, 2013, p. 189.

C O NT I NU A R
LECCIÓN 3 de 5

Cota inferior asintótica y cota ajustada asintótica

Si bien es de utilidad analizar el peor de los casos y conocer el límite superior


(el cual no será superado), también es útil, a veces, conocer el límite inferior,
es decir, el mejor de los casos. Asimismo, se puede querer expresar que una
función tiene la misma tasa de crecimiento que otra.

Entonces, se encuentra la notación Ω (g(x)) para denotar una cota inferior


asintótica, donde se indica que una función g(x) crecerá más lento o, a lo
sumo, tan rápido como f(x). Esto quiere decir que el algoritmo analizado no
se comportará mejor que una función. En otras palabras, el tiempo de
ejecución será siempre mayor o, a lo sumo, igual que el de esa función. 

También, se encuentra la notación Θ(g(x)), para denotar una cota ajustada


asintótica. Por esto, si se dice que una función f(x) es Θ(g(x)), significa que la
función f(x) tendrá la misma tasa de crecimiento que g(x). 

A modo de conclusión, el análisis de los algoritmos es de vital importancia


para poder decidir, cuando se tienen varios algoritmos, cuál es el que más
conviene, cuál es el mejor y cuál se adecua mejor a las distintas
necesidades. Asimismo, el análisis de los algoritmos permite anticiparse y
saber cuál será el comportamiento de un algoritmo en el peor de los casos.
Se describe el concepto de O-Grande, como límite _______ y Gran Omega, como
límite inferior.

Escriba su respuesta aquí

SUBMIT

C O NT I NU A R
LECCIÓN 4 de 5

Conceptos para tener en cuenta

Un programa que se va a ejecutar muy pocas veces hace que


nuestro foco deba estar en la codificación y la depuración del
algoritmo, donde la complejidad no es el factor crítico a considerar.

Un programa que se utilizará por mucho tiempo, seguramente, será


mantenido por varias personas en el curso de su vida útil. Esto hace
que los factores que debemos considerar sean los que se
relacionan con su legibilidad; incluso, si la mejora de ella impacta en
la complejidad de los algoritmos empleados.

En un programa que únicamente va a trabajar con datos pequeños


(valores bajos de N), el orden de complejidad del algoritmo que se
use suele ser irrelevante.

Un programa de baja complejidad, en cuanto a tiempo de


ejecución, suele demandar un alto consumo de memoria y
viceversa. Esto es una situación que debemos evaluar para
entender cómo impactan ambos factores.

Un programa orientado al cálculo numérico hace que debamos


tener en cuenta más factores que su complejidad o, incluso, su
tiempo de ejecución. En estos casos, debemos considerar la
precisión del cálculo, el máximo error introducido en cálculos
intermedios, la estabilidad del algoritmo, etcétera.

C O NT I NU A R
LECCIÓN 5 de 5

Referencias

Alarcón J. M. (2016). Rendimiento de algoritmos y notación Big-O.


Recuperado de https://www.campusmvp.es/recursos/post/Rendimiento-de-
algoritmos-y-notacion-Big-
O.aspx#:~:text=Entendiendo%20la%20notaci%C3%B3n%20Big%2DO,la%20es
cala%20de%20los%20mismos.&text=O%20sea%2C%20el%20tiempo%20nec
esario,de%20elementos%20que%20le%20pasemos.

Sznajdleder, P. A. (2012). Complejidad algorítmica. En Fernández, D.,


Algoritmos a fondo con implementación en C y JAVA (pp. 523-527). Buenos
Aires: Alfaomega. 

Weiss, M. A. (2013). Análisis de algoritmos. En Martín-Romo, M., Estructuras


de datos en Java (pp. 189-202). Madrid: Pearson.        

Tovar E. (2012). Algoritmo y Diagrama de Flujo. Recuperado de


https://www.monografias.com/trabajos94/algoritmo-y-diagrama-
flujo/algoritmo-y-diagrama-flujo.shtml

También podría gustarte