¿Cómo se puede determinar y mostrar la velocidad de un algoritmo (complejo) en notación Big O?

Cuando ve un extraño orden de crecimiento, como [math] O (n ^ {2.32}) [/ math] mencionado en los detalles de la pregunta, generalmente se trata de algún valor más sensible disfrazado o el resultado de un problema de optimización ejecutado sobre los algoritmos mismos!

Como ejemplo de un valor sensible, el algoritmo de Strassen para la multiplicación de matrices realiza 7 multiplicaciones para una matriz de 2 × 2 en lugar de 8. La aplicación recursiva da un algoritmo donde el número de multiplicaciones crece a medida que [matemática] O (n ^ {\ log_2 7}) [/ math], porque una matriz de tamaño [math] n = 2 ^ k [/ math] requiere [math] 7 ^ k [/ math] multiplicaciones. Pero esto se puede informar como [matemáticas] O (n ^ {2.807}) [/ matemáticas], ocultando el significado real.

El método general se puede resumir como: 1. describe el comportamiento de tu algoritmo complejo como una recurrencia, 2. resuelve la recurrencia.

Como ejemplo de un valor no sensible, Powers of Tensors and Fast Matrix Multiplication es un documento muy denso que ofrece un nuevo límite en la multiplicación matricial de [math] O (n ^ {2.3728639}) [/ math]. ¿De dónde vino este número? En realidad, es de un programa de Matlab que ejecutaron para calcular el valor de un problema de optimización derivado de un modelo de multiplicación de matrices. Dice que para calcular el producto matricial, necesita una descomposición en tensores con propiedades particulares, y esas descomposiciones son asintóticamente al menos lo suficientemente buenas como para dar el límite que describen.

Este método general se puede resumir como: 1. caracterizar el espacio de posibles algoritmos de un tipo particular como un problema de optimización. 2. encuentre un límite superior en el problema de optimización. (Tenga en cuenta que la implementación real del algoritmo nunca puede ocurrir).

El algoritmo para calcular la complejidad asintótica de algoritmos arbitrarios es indiscutible. Pero hay algunas formas de hacer esto para casos específicos.


Podrías intentar trazar tiempos de ejecución.

A partir de ahí, puede intentar ajustar un polinomio, radical, tal vez un exponencial o un logaritmo y ver cuál se ajusta mejor.

Le da una idea de cómo funcionará el algoritmo, pero no es capaz de darle la complejidad teórica. Uno siempre puede interpolar los puntos de muestra [matemática] n + 1 [/ matemática] con un polinomio [matemático] n [/ matemático] de grado, incluso cuando la complejidad real es algo muy diferente.


Puedes probar las matematicas

“Los problemas del panqueque”

Las pruebas formales son geniales. Me encanta el hecho de que incluso en campos distintos de las matemáticas puras uno puede probar probar teoremas. Sin embargo, requieren creatividad y / o madurez matemática.


Diferenciación automática

Esto es básicamente escribir su código y dejar que la computadora lo analice. Tenga en cuenta que le dará los resultados para la implementación, no el algoritmo.


Me imagino que hay otras técnicas útiles, pero traté de dejarlas algo generales para que no encuentres nada muy diferente de estas y te sorprendas.

Buena suerte.

Con una excepción limitada, Big O se utiliza para clasificar, en lugar de para la comparación directa. En este caso, el algoritmo se clasificaría como cuadrático (equivalente a O (n ^ 2)). La siguiente clase es polinomial, que es O (n ^ c), pero podría decirse que cuadrática es un caso especial de polinomio. Si se trata de dos algoritmos de crecimiento polinomial yc difiere mucho entre los dos, entonces vale la pena preocuparse. De lo contrario, llámelo cuadrático o polinomial (sea consistente) y termine con esto. Si bien cualquier crecimiento que implique exponentes es rápido, dada la varianza en el complejo de algoritmos para una entrada y el hecho de que el tamaño de entrada (n) a menudo está restringido, la necesidad de centrarse en los puntos de diferencia de la clase (polinomio), no el valor específico de C.

No creo que sea una buena idea usar la notación O grande para las estimaciones de complejidad. Es una notación que expresa un límite superior en una función, por lo que diría: “hasta un factor constante, el tiempo de ejecución estimado de este algoritmo es como mucho”. ¡Eso plantea la pregunta de cuál es la estimación real ! Por lo tanto, la O grande es más apropiada para el análisis teórico, aunque supongo que no hay una regla contra su uso para las estimaciones. Simplemente parece innecesariamente confuso.

Para medir la complejidad asintótica de un algoritmo, debe ejecutarlo en problemas de varios tamaños y medir cuánto tiempo tarda en cada caso. Luego puede trazar los resultados en un gráfico y ajustar los resultados.

Si sospecha que la complejidad es polinómica, puede trazar los resultados a doble escala logarítmica. Un tiempo de ejecución polinómico aparecerá como una línea recta, por lo que es fácil de ajustar, incluso puede hacerlo a mano. La pendiente de la línea indicará el exponente.

Realmente no determinas la velocidad. Usted determina su tasa de crecimiento de la complejidad del algoritmo con el tamaño de la entrada. Estrictamente hablando, no es la velocidad.

More Interesting

¿Cómo averiguar el contexto de una expresión matemática?

Cómo explicar el significado de Matemática discreta en términos simples

Cómo resolver el problema P versus NP

¿Es posible crear un lenguaje completo de Turing con solo un puntero de instrucción modificable, una operación de intercambio y un incremento por una operación?

¿Todas las integrales pueden ser calculadas por una computadora? Del mismo modo, ¿hay integrales en este momento que los matemáticos no puedan resolver?

Cómo aumentar la velocidad de cálculo de la función trigonométrica en una computadora

¿Cómo debo aprender programación competitiva cuando soy malo en matemáticas?

¿Qué procesos se modelan mejor mediante una distribución exponencial? ¿Cómo se relaciona la función exponencial con tales procesos?

¿Qué tan difícil es la transición de las matemáticas aplicadas a la informática?

¿Es Python el mejor lenguaje de programación para las matemáticas aplicadas?

Me encanta aprender teoría, pero no siempre disfruto escribiendo código. ¿Cómo me pueden pagar para vivir en el mundo de los pensamientos? ¿Solo estoy siendo vago?

Si se le da un gráfico G no dirigido simple, ¿cómo podemos encontrar todas las subgrafías inducidas de G, que son gráficos de girasol, dentro de una cantidad de tiempo polinómica?

¿Cuántas matemáticas se necesitan en la codificación?

¿Cuáles son algunos problemas realmente fáciles de explicar que en realidad son increíblemente difíciles de resolver?

¿Qué temas de informática utilizan el cálculo? ¿Cuáles son algunos otros subcampos utilizados en informática?