Esta es una gran pregunta. En realidad, hay muchas formas diferentes en que el tiempo de ejecución puede ser, y en la práctica, expresado. La tendencia general es que existe una compensación entre la especificidad de la información obtenida del análisis y, por lo tanto, su practicidad inmediata . y cuánto puede generalizar ese resultado a entradas no vistas anteriormente, otros entornos informáticos, etc.
Hagamos un viaje en la escala móvil de lo más específico a lo más general:
Tiempo de ejecución exacto para un conjunto de datos en particular en una máquina en particular. Podríamos describir cuántos segundos tarda el algoritmo en un conjunto de datos específico, ejecutándose en un entorno específico.
- Algoritmos: ¿Cómo visualizo y resuelvo problemas de retroceso?
- ¿Qué tipo de matemáticas debo estudiar para comprender mejor la teoría detrás de la programación?
- Sistemas distribuidos: ¿El resultado de imposibilidad de FLP y el teorema de CAP de Brewer son básicamente equivalentes?
- ¿Cuáles son algunos conceptos en el cálculo lambda que es bueno saber antes de aprender programación funcional?
- ¿Por qué el hardware de gráficos solo representa triángulos?
Esto se conoce como un punto de referencia.
Pros:
- El resultado se basa en evidencia experimental. Por lo tanto, no le preocupa que su teoría no tenga en cuenta ciertos efectos (por ejemplo, el almacenamiento en caché).
- Proporciona comparaciones de manzanas con manzanas cuando necesita comparar dos implementaciones diferentes en el mismo conjunto de datos con todos los diferentes factores de hardware / software tomados en cuenta.
Contras:
- Resultado específico del hardware / entorno.
- No sé cómo se escalará su algoritmo.
- No sé cómo su algoritmo depende del contenido de los datos.
Estudio empírico de tiempos de ejecución en diferentes tamaños de entrada y conjuntos de datos. Podemos probar muchos conjuntos de datos de diferentes tamaños, obtener una distribución y usar esto para predecir los tiempos de ejecución.
Esto se hace, hasta cierto punto, en pruebas de rendimiento.
Mejor que el enfoque anterior porque:
- Al medir en una amplia gama de entradas, el modelo tiene cierto poder predictivo para nuevas entradas nunca antes vistas.
- Da evidencia empírica de cómo el algoritmo escala con el tamaño de entrada y varía dentro del mismo tamaño de entrada.
Peor que el enfoque anterior porque:
- No le proporciona un número exacto de cuánto tiempo llevará ese conjunto de datos específico que desea ejecutar .
Un recuento total de operaciones realizadas, ponderadas por su costo relativo (por ejemplo, la adición es más barata que la división) en la arquitectura en cuestión.
Mejor que el enfoque anterior porque:
- Da una fórmula matemática para el tiempo de ejecución. La fórmula debe revelar el big-O junto con el tamaño de los factores constantes involucrados, así como términos significativos de orden inferior.
- No se basa en evidencia empírica, por lo tanto, puede dar estimaciones significativas del peor de los casos. A partir del análisis del algoritmo se encontrarán entradas degeneradas que pueden no probarse, o que ocurren raramente en la práctica.
Peor que el enfoque anterior porque:
- Si el costo relativo de las operaciones se estima incorrectamente, proporcionará predicciones incorrectas.
- Es difícil tener en cuenta todos los efectos (por ejemplo, almacenamiento en caché, predicción de ramificación) en el modelo de cuánto costará cada operación.
- No se basa en evidencia empírica.
Recuentos de cuántas de cada operación realizada. Cuántas adiciones, multiplicaciones, etc.
Vemos esto en las discusiones de varios algoritmos en forma de enunciados como “Multiplicar una matriz 4 × 4 toma X adiciones y multiplicaciones Y para completar, mientras que usar cuaterniones en su lugar toma W adiciones y multiplicaciones Z”.
Mejor que el enfoque anterior porque:
- Algo independiente de la arquitectura de la computadora. Solo un poco, porque aún pueden ser interacciones difíciles de predecir, como los efectos del procesamiento superescalar, los riesgos de los datos, etc. Tampoco son totalmente independientes del compilador, ya que el compilador optimizará / reescribirá algunas de las instrucciones.
Peor que el enfoque anterior porque:
- Para comprender el tiempo de ejecución real, debe comprender qué tan lenta / rápida será cada operación en la arquitectura en cuestión.
Big-O
Un recuento total de operaciones realizadas, pero muestra solo el término de orden más alto y sin el factor constante.
Se utiliza en el análisis abstracto de algoritmos, donde necesitamos un modelo de cómputo en gran parte independiente de la arquitectura de la computadora, suponiendo una máquina clásica de acceso aleatorio de un solo subproceso.
Mejor que el enfoque anterior porque:
- Independiente de la arquitectura de la computadora dentro de ciertos supuestos razonables.
- Mayormente independiente del compilador.
- Información fácil de digerir.
Peor que el enfoque anterior porque:
- No revela los factores constantes involucrados con el algoritmo.
- Es difícil comparar dos algoritmos que tienen el mismo big-O.
Puede pensar que este es el final de la línea, pero podemos seguir generalizando los resultados, a costa de hacerlos cada vez menos prácticos de inmediato.
Clasificación amplia según clases de complejidad.
Podemos preguntar si el algoritmo se ejecuta en tiempo polinómico, tiempo exponencial, etc.
Mejor que el enfoque anterior porque:
- Debe ser independiente del compilador
- Principalmente independiente del modelo de computación clásica (por ejemplo, máquina de Turing vs. máquina de acceso aleatorio). Cosas importantes como permitir la aleatorización, el paralelismo o la computación cuántica aún pueden cambiar la imagen.
Peor que el enfoque anterior porque:
- Revela muy poca información práctica en términos de cuánto tiempo llevará ejecutar el programa.
Decidability
Podemos preguntar si la tarea en cuestión es incluso posible para un algoritmo. *
Mejor que el enfoque anterior porque:
- Casi completamente independiente del modelo de computación, incluso para computadoras no clásicas.
Peor que el enfoque anterior porque:
- Literalmente no revela nada, excepto si la tarea puede lograrse incluso mediante un algoritmo.
* Nota: entiendo que hay una distinción entre un problema y un algoritmo. La comparación no es perfecta aquí.