No sé qué explicación encontrarás más intuitiva, pero haré lo mejor que pueda.
La complejidad asintótica del tiempo de ejecución es una forma de aumentar el tiempo de ejecución de un algoritmo.
¿Por qué necesitamos una forma de correr el tiempo?
- ¿Cuáles son algunos algoritmos del mundo real que corresponden al 'caso 3' del método maestro?
- ¿Qué algoritmo se usa para la transmisión de video?
- ¿Es bueno analizar?
- ¿Se puede usar el algoritmo de Prim para encontrar la ruta más corta desde un vértice a todos los demás vértices en un gráfico no dirigido?
- ¿Cuál es la forma más efectiva de aprender algoritmos?
¿No podríamos medir el tiempo de ejecución exacto? Bueno, podríamos, pero requeriría conocer la arquitectura exacta de la computadora en la que se ejecutará el algoritmo.
No puede comparar los tiempos exactos de ejecución de dos algoritmos en una entrada dada sin conocer la arquitectura exacta en la que se ejecutarán los algoritmos. Por ejemplo, puede ocurrir que el Algoritmo A se ejecute más rápido que el Algoritmo B en la arquitectura Intel x86 para una entrada determinada, pero el Algoritmo B se ejecuta más rápido que el Algoritmo A en la arquitectura MIPS para esa misma entrada .
No hay forma de saber qué algoritmo será más rápido para una entrada específica, sin conocer la arquitectura informática exacta que se utilizará. Incluso si se limita a considerar solo una familia de arquitectura específica, digamos Intel x86, los modelos de procesador cambian lo suficiente de una generación a la siguiente que no puede saber si su algoritmo seguirá funcionando más rápido en una entrada específica.
Por ejemplo, en los viejos tiempos, las instrucciones de multiplicación solían ser considerablemente más lentas que las instrucciones de adición en x86, pero esto ya no es cierto en los procesadores x86 de la generación actual.
Además, realmente no hay una forma práctica de medir el tiempo de ejecución exacto sin hacer puntos de referencia reales del código que se ejecuta en metal desnudo. Hay muchas cosas que pueden influir en el tiempo de ejecución: las instrucciones de CPU utilizadas, el orden de las instrucciones (canalización), aciertos y errores de caché, sin mencionar las optimizaciones del compilador.
En última instancia, no existe una forma analítica práctica de comparar el tiempo de ejecución de los algoritmos en una entrada específica, pero podemos analizar los algoritmos de una manera más general al observar el tiempo de ejecución de un algoritmo en función de su entrada y comparar las funciones para diferentes algoritmos
¿Cómo comparamos funciones?
La forma más natural de comparar funciones es determinar cuál crece más rápido. Si has estudiado Cálculo, entonces esto debería ser muy familiar para ti. De hecho, realmente necesita cálculo para comprender completamente el tiempo de ejecución asintótico.
Si tienes dos funciones f y g, decimos que f crece más rápido que g (escrito f >> g) si en algún momento, f toma gy permanece dominante.
Puede obtener una intuición para esto graficando tanto f como g en una calculadora gráfica, aunque tenga cuidado porque esto puede llevarlo a conclusiones erróneas. Por ejemplo, mira este gráfico:
Parece que la línea azul supera a la línea púrpura. Sin embargo, si nos alejamos, la historia cambia:
Aquí vemos que en x = 10, la línea púrpura sobrepasa a la línea azul nuevamente. Resulta que la línea púrpura seguirá siendo dominante, y la línea azul nunca volverá a superar a la línea púrpura. La forma en que sabemos esto es mediante el uso de la herramienta de límites de Cálculo.
Si todo esto le suena extraño, entonces realmente necesita estudiar Cálculo.
Vincular esto a la informática
La forma estándar de hacer un análisis asintótico de algoritmos es hacer lo siguiente:
- Tome un parámetro de la entrada del algoritmo que queremos ver para considerar cómo cambiará el tiempo de ejecución del algoritmo con respecto a ese parámetro.
- A partir del algoritmo, calcule una función que se aproxima al tiempo de ejecución del algoritmo con respecto a ese parámetro. La aproximación cruda suele ser solo para contar el número de instrucciones que realiza el algoritmo. Esta función estará desactivada por un factor constante del tiempo de ejecución real en una arquitectura informática determinada.
- Para dos algoritmos diferentes, estamos comparando A y B, digamos que hemos calculado el tiempo de ejecución aproximado aproximado de A como f (x) y el tiempo de ejecución aproximado aproximado de B como g (x), ambos en términos del mismo parámetro x de la entrada. Ahora, si sabemos que no importa qué constante multipliquemos g (x), vemos que f (x) aún crece más rápido, entonces eso implica lo siguiente:
Independientemente de la arquitectura informática que elijamos, el Algoritmo A es más rápido que el Algoritmo B en un número infinito de entradas. Por el contrario, para cualquier arquitectura de computación dada, solo hay un número finito de entradas donde el Algoritmo B podría ser más rápido que el Algoritmo A.
Entonces eso parece implicar que el Algoritmo A es mejor que el Algoritmo B, ¿no es así? Al menos en teoría.Tenga en cuenta que estamos asumiendo que solo un factor constante diferencia una arquitectura informática de otra. Esto suele ser cierto para las arquitecturas de Von Neumann, pero puede no ser cierto para todas las arquitecturas.