Aquí, por análisis asintótico, supongo que queremos decir el comportamiento del algoritmo a medida que el tamaño de la entrada llega al infinito.
La razón por la que utilizamos el análisis asintótico es porque
es útil para predecir el comportamiento de los algoritmos en la práctica . Las predicciones nos permiten tomar decisiones, por ejemplo, cuando tenemos diferentes algoritmos para un problema, ¿cuál debemos usar? (Ser útil no significa que siempre sea correcto).
La misma pregunta puede hacerse sobre cualquier modelo simplificado del mundo real. ¿Por qué utilizamos modelos matemáticos simplificados del mundo real?
Piensa en la física. La física newtoniana clásica no es tan buena como la física relativista para predecir el mundo real. Pero es un modelo lo suficientemente bueno para construir automóviles, rascacielos, submarinos, aviones, puentes, etc. Hay casos en los que no es lo suficientemente bueno, por ejemplo, si queremos construir un satélite o enviar una sonda espacial a Plutón o predecir el movimiento. de objetos celestes masivos como estrellas y planetas u objetos de muy alta velocidad como electrones.
Es importante saber cuáles son los límites de un modelo.
Por lo general, es una aproximación suficientemente buena del mundo real.
En la práctica, vemos a menudo que un algoritmo con un mejor análisis asintótico funciona mejor en la práctica. Rara vez se da el caso de que un algoritmo tenga un mejor comportamiento asintótico. Por lo tanto, si las entradas pueden ser lo suficientemente grandes, normalmente podemos confiar en el análisis asintótico como primera predicción del comportamiento de los algoritmos. No es así si sabemos que las entradas van a ser pequeñas. Dependiendo del rendimiento que queramos, es posible que tengamos que hacer un análisis más cuidadoso, por ejemplo, si tenemos información sobre la distribución de las entradas que se proporcionará el algoritmo, podemos hacer un análisis más cuidadoso para lograr los objetivos que tenemos (por ejemplo, rápido en 99 % de entradas). El punto es que, como primer paso, el análisis asintótico es un buen punto de partida. En la práctica, también debemos hacer pruebas de rendimiento, pero tenga en cuenta que también tiene sus propios problemas.
UNAUNAUNAtiene mejor complejidad asintótica. ¿Qué ninguno de ellos es mejor que el otro en todas las entradas? Entonces se vuelve más complicado y depende de lo que nos importa. ¿Nos importan los insumos grandes o pequeños? Si nos interesan las entradas grandes, entonces no es común que un algoritmo tenga una mejor complejidad asintótica pero se comporte peor en las entradas grandes que nos importan. Si nos interesan más las entradas pequeñas, entonces el análisis asintótico podría no ser tan útil. Deberíamos comparar el tiempo de ejecución de los algoritmos en las entradas que nos interesan. En la práctica, para tareas complicadas con requisitos complicados, el análisis asintótico puede no ser tan útil. Para problemas básicos simples que cubren los libros de texto de algoritmos, es bastante útil.
En resumen, la complejidad asintótica es una aproximación relativamente fácil de calcular de la complejidad real de los algoritmos para tareas básicas simples (problemas en un libro de texto de algoritmos). A medida que creamos programas más complicados, los requisitos de rendimiento cambian y se vuelven más complicados y el análisis asintótico puede no ser tan útil.
Es bueno comparar el análisis asintótico con otros enfoques para predecir el rendimiento de los algoritmos y compararlos. Un enfoque común son las pruebas de rendimiento contra entradas aleatorias o de referencia. Es común cuando calcular la complejidad asintótica es difícil o inviable, por ejemplo, cuando usamos la heurística como en la resolución de SAT. Otro caso es cuando los requisitos son más complicados, por ejemplo, cuando el rendimiento de un programa depende de factores externos y nuestro objetivo podría ser tener algo que termine dentro de algunos límites de tiempo fijos (por ejemplo, piense en actualizar la interfaz que se muestra a un usuario) en el 99% de los casos. entradas
Pero tenga en cuenta que el análisis de rendimiento también tiene sus problemas. No proporciona beneficiarios matemáticos sobre el rendimiento en menos, realmente ejecutamos la prueba de rendimiento en todas las entradas que se le darán al algoritmo (a menudo inviable desde el punto de vista computacional) (y a menudo no es posible decidir que algunas entradas nunca se darán). Si ponemos a prueba en contra de una muestra aleatoria o una referencia implícita estamos asumiendo cierta regularidad
sobre el rendimiento de los algoritmos, es decir, el algoritmo llevará a cabo de manera similar en otros insumos que no formaban parte de la prueba de rendimiento.
El segundo problema con las pruebas de rendimiento es que dependen del entorno de prueba. Es decir, el rendimiento de un programa no está determinado solo por las entradas, sino por factores externos (por ejemplo, tipo de máquina, sistema operativo, eficiencia del algoritmo codificado, utilización de la CPU, tiempos de acceso a la memoria, etc.), algunos de los cuales pueden variar entre diferentes ejecuciones de La prueba en la misma máquina. Una vez más, estamos asumiendo que los entornos particulares en los que se llevan a cabo las pruebas de rendimiento son similares al entorno real a menos que hagamos las pruebas de rendimiento en todos los entornos en los que podemos ejecutar el programa (y cómo podemos predecir en qué máquinas alguien podría ejecutar una clasificación) algoritmo en 10 años?).
Θ ( n lgn )Θ ( n2)Θ ( lgn )O ( n )