¿Por qué es importante considerar las anotaciones asintóticas (como límite superior, límite inferior y límite estrecho)?

Los problemas computacionales se describen como un conjunto (típicamente para problemas no triviales, es infinito). Desea capturar el comportamiento del algoritmo para cada instancia del problema que el algoritmo busca resolver. Como algunos podrían decir, podría decirle cómo funciona el algoritmo para entradas grandes, pero realmente se trata más de capturar la complejidad de tiempo del algoritmo para todas las instancias (recuerde, hay infinitas muchas que serán muy grandes donde las constantes no incluso importa con respecto a la entrada). En la práctica, puede que solo le interese un subconjunto de las instancias del problema (por ejemplo, cuando las entradas son pequeñas).

Asumiré que está utilizando estas notaciones asintóticas de manera adecuada en función de su análisis (pero en realidad, podría usar cualquiera de ellas para cualquier tipo de análisis). El tipo de análisis (el peor de los casos, el mejor de los casos, el caso promedio) es fácilmente más importante, así que tenga cuidado con esto ya que no hay “uno” para cada tipo; Este es un error común que cometen los estudiantes de pregrado de CS.

Como dije anteriormente, captura el comportamiento del algoritmo para todas las instancias . Eso significa que podría comparar su algoritmo de manera estándar con otros algoritmos dependiendo del análisis que realizó. Además, no depende de la máquina . Esta es una de las principales razones por las que esta notación es útil. Las personas que trabajan en Algoritmos comparan algoritmos de esta manera y los clasifican en clases usando este tipo de asintóticos. Los algoritmos en sí son matemáticos, por lo que los clasificamos matemáticamente según la naturaleza de los problemas que estudiamos. Si está buscando implementar algún algoritmo, es crucial tenerlo en cuenta.

Tenga en cuenta que también podemos clasificar los problemas en función de la notación asintótica. Un ejemplo clásico de esto es el límite inferior conocido [math] \ Omega (n \ log n) [/ math] en la clasificación basada en la comparación. Esto significa asintóticamente que ningún algoritmo que realice comparaciones intercambiando el problema de clasificación puede hacerlo mejor que [math] \ Omega (n \ log n) [/ math].

Tenga en cuenta que he sido exclusivo para la comparación de algoritmos anteriores, pero es importante tener en cuenta esta notación en general (ya que no es exclusiva para analizar algoritmos). En general, estos son conjuntos de funciones de crecimiento. Pueden permitirle clasificar funciones de crecimiento e indicar tendencias en su análisis (que es su uso original, y todavía se usa de esta manera en áreas como la teoría analítica de números).

Los límites son importantes porque te dan una idea de qué tan bien se escala tu algoritmo. Suponga que escribe este fragmento de código para hacer una tarea simple razonablemente bien; por ejemplo, ordene un conjunto de números usando el ordenamiento de burbujas. Escribes código, ingresas una matriz de miles de números en orden inverso y descubres el tiempo que lleva hacerlo. Supongamos que tarda 10 milisegundos (eso es una centésima de segundo) en completarse. Lo cual, sientes que es bastante bueno.

Ahora, decide usarlo para matrices más grandes, como una matriz que consta de mil millones de números. Probablemente razone, si se necesitan 10 milisegundos para ordenar 1000 números, se necesitan 10,000 segundos para ordenar mil millones de números, ¿verdad? Eso es menos de 3 horas y se ve bien para un trabajo cron durante la noche.

Aquí es donde entran los límites en la imagen. El peor rendimiento para el ordenamiento de burbujas es [matemática] O (n ^ 2) [/ matemática]. Lo que significa que el tiempo máximo que puede tomar es proporcional no al tamaño de su entrada, sino al cuadrado del tamaño de su entrada. El cálculo es así:

[matemáticas] (10 ^ 3) ^ 2 \ a 10 [/ matemáticas] milisegundos

[matemática] 10 ^ 9 \ a 10 [/ matemática] milisegundos

[matemáticas] 1 \ a 10 ^ {- 8} [/ matemáticas] milisegundos

[matemáticas] (10 ^ 9) ^ 2 = 10 ^ {18} \ a 10 ^ {10} [/ matemáticas] milisegundos

Eso es más de 2777 horas de tiempo de clasificación para usted. Lo que podría haber evitado si hubiera tenido en cuenta los límites de su algoritmo de elección.

Proporcionan una tendencia básica de cómo los algoritmos se escalan para conjuntos de datos muy grandes.

La notación asintótica no siempre es importante de considerar, ya sea porque nuestro algoritmo está garantizado para operar en un tamaño de entrada suficientemente pequeño que generalmente funciona bien independientemente de la elección del algoritmo, o porque el comportamiento asintótico por sí solo no es suficiente para el propósito de la aplicación. Ese es el caso cuando se crean aplicaciones de tiempo crítico, sistemas en tiempo real, etc. Cuando se necesita optimizar tanto como sea posible, las abstracciones pueden ser inadecuadas. Es posible que deba expandir la función de tiempo de ejecución en su forma completa, teniendo en cuenta las constantes, los factores de orden inferior y los parámetros dependientes de la máquina. La notación asintótica no da mucha importancia; solo buscamos la tendencia general.

Ahora, la razón por la que nos permitimos el descuido de las estimaciones aproximadas es que, aunque los ciclos de CPU y la potencia de procesamiento tienden a mejorar con el tiempo, existen límites físicos reales para la tecnología involucrada. En algún momento, los científicos informáticos descubrieron que el verdadero obstáculo del rendimiento estaba cambiando del hardware a las características intrínsecas de los algoritmos mismos que dictan su capacidad para funcionar en tamaños de entrada perpetuamente más grandes, aumentando así la potencia de procesamiento de los sistemas informáticos más allá de sus limitaciones de hardware .

En esa dirección, trabajamos bajo el supuesto de que las constantes y el factor de orden inferior son intrascendentes. La predicción del tiempo de ejecución no tiene que ser exacta en el caso general. Según la definición de Big-Oh, si el tiempo de ejecución está limitado por tiempos constantes de otra función, todo lo que tenemos que hacer en el peor de los casos es agregar suficientes procesadores y tenemos la garantía de que el algoritmo funcionará como se pronostica asintóticamente.

En resumen, lo que hace la notación asintótica para nosotros es que simplifica y mejora nuestro poder predictivo sobre el rendimiento de los algoritmos a largo plazo. A medida que los datos crecen y la demanda de procesamiento aumenta, la relevancia de los buenos algoritmos se vuelve más clara, ya que nos permiten superar las limitaciones físicas de nuestros sistemas.

Debido a que se utilizan en casi todas las ciencias basadas en la tecnología que requieren una visión general rápida del problema, observando cuán complicado, fácil de optimizar, rápido o lento (cuando se describe un proceso) como función es.

Esto abarca desde el mercado de valores, pasando por la tecnología de la información hasta la ingeniería dura, como el diseño de controladores de procesos industriales.
Ningún ingeniero serio en estos días puede diseñar nada sin conocer los conceptos básicos de la notación Bachmann-Landau.