Grande- $O$ es un grueso medida de pedir de crecimiento. Su utilidad está en ignorando detalles. Del mismo modo, la media de una distribución ignora un gran número de detalles de la misma, pero sigue proporcionando información útil. Gran parte del progreso se basa en tomar algo complejo y separar lo que es importante (o real) de lo que son detalles quisquillosos (o ruido).
Uno podría preguntarse: "¿Cómo es un factor de 1000 'detalle (o ruido) quisquilloso'?". En ordenadores más lentos vagamente recientes tienen velocidades de reloj de unos pocos kHz. Los más rápidos, unos pocos GHz. Así que un factor inferior a un millón es una cuestión de ingeniería, no de selección de algoritmos. El principal uso de Big- $O$ está en la selección del algoritmo.
Si desea comparar dos tasas de crecimiento, en su GIF deberá escalar un que sean de altura $1$ -- "este orden de crecimiento es mi referencia con la que se compararán todos los demás órdenes de crecimiento". En tu GIF, si escalas $n^2$ para que sea su referencia, entonces verá $1000n$ y $n$ decayendo hacia $0$ como $1/n$ (este uso de "como" es "orden de crecimiento/disminución" y es bastante común utilizarlo así). Tanto $n$ y $1000n$ son finalmente insignificantes en comparación con $n^2$ y ambos son insignificantes en el mismo orden de crecimiento. Ampliando el GIF, para incluir $1000n^2$ se escala a la altura $1000$ que, aunque es mayor que $1$ ni crece ni se encoge $1000n^2$ tiene el mismo orden de crecimiento que $n^2$ . Si tiras $n^3$ en este gráfico crece de orden $n$ cuando se escala por $n^2$ . Por supuesto, también $2n^3$ y $1000n^3$ .
Una forma de ver que Big- $O$ es una medida gruesa es ver lo que se necesita para aterrizar fuera de $O(n)$ . Obsérvese que para cada $\epsilon > 0$ existe un $N_\varepsilon$ tal que para todo $n > N_\varepsilon$ , $1000n < n^{1+\varepsilon}$ . Así que cualquier elección de potencia mayor que $1$ acaba dominando $1000n$ . Por tanto, si agrupamos las tasas de crecimiento por potencias de $n$ , $1000n$ tierras en el " $n$ ". Pero Big- $O$ no sólo agrupa por potencias de $n$ una simple escalera de funciones distinguidas por Big- $O$ son exponenciales iterados. Big- $O$ distingue entre $n$ , $\mathrm{e}^n$ , $\mathrm{e}^{\mathrm{e}^n}$ etc. (Para un ejemplo de complejidad doblemente exponencial, véase "Algoritmo de Buchberger"). Big- $O$ distingue los poderes de $n$ . Grande- $O$ distingue los logaritmos iterados. En resumen, Big- $O$ distingue gran diferencias en el orden de crecimiento e ignora pequeño diferencias. El límite entre "grande" y "pequeño" está implícito en la definición de Big-. $O$ . Si, en una aplicación concreta, es preferible un punto de corte diferente, entonces utilice una medida de orden de crecimiento diferente.
El segundo problema es la medición del tiempo de ejecución en el peor de los casos. Pregunta: ¿Cuál es el tiempo de ejecución del algoritmo de detección de primos: "Prueba a dividir por 2, luego por 3, luego por 4, ... hasta la raíz cuadrada del número dado"? Varía. Para la mitad de los números enteros, este algoritmo se detiene después de una división. Para un tercio del resto, se detiene después de dos divisiones. Para una quinta parte del resto, se detiene después de tres divisiones. En el peor de los casos (es decir, cuando la entrada es realmente primo), el algoritmo realiza el peor número de divisiones. Si su resumen del algoritmo debe advertir cuando el tiempo de ejecución puede ser largo, entonces su resumen necesita informar del peor caso de tiempo. Tenga en cuenta que en esta configuración, también podemos informar del tiempo medio (aunque este cálculo es difícil). En general, para determinadas entradas, un algoritmo puede ser mucho más rápido que en el peor de los casos. Pero siempre, no es peor que su tiempo en el peor de los casos, así que si puede presupuestar ese tiempo en su calendario, puede estar seguro de obtener una respuesta antes de que sea necesaria. (Comentarios similares se aplican a la complejidad espacial. Si puede asignar el espacio del peor caso a su cálculo, puede estar seguro de que se completará sin abortar por falta de espacio).
Tu tercer punto no se sitúa en el contexto en el que se plantean realmente estas preguntas. Normalmente, uno implementa un algoritmo. Se conoce el orden de crecimiento de su complejidad en el peor de los casos. Sin embargo, los requisitos reales de tiempo y espacio del algoritmo son más matizados que el orden de crecimiento. Una implementación concreta puede tener una complejidad temporal $10^{-3}n^2 + 53 n + 10^5$ (corresponde vagamente a "hacer realmente el trabajo") ${} + {}$ "leer la entrada, escanear a través de tablas de búsqueda, y escribir la salida" ${} + {}$ "inicialización y otras tareas domésticas"). Cuando $n$ es pequeño, está dominado por los gastos fijos. Cuando $n$ es medio, éste está dominado por las actividades lineales. Una vez $n$ es lo suficientemente grande, sólo importa el término cuadrático principal. Sospecho que has estado pensando en estimaciones monomiales de la complejidad, por lo que no has pensado en la transición en el mundo real entre los órdenes de crecimiento de las distintas partes de una implementación. Fíjate en que los términos no principales son algo que podemos reducir variando la implementación: quizá podamos hacer una instantánea del contexto inicializado y cargarlo, reduciendo las contribuciones lineales y constantes a la complejidad. El término de orden principal, sin embargo, es algo con lo que estamos atascados. Podemos variar su coeficiente eligiendo hardware diferente, quizás hasta por un factor de un millón. Sin embargo, las dos preguntas a las que todo el mundo quiere respuesta son "¿cuánto tiempo tardaremos en responder a las preguntas que pretendemos hacer?" y "¿cuánto peor será si tenemos que hacer preguntas un poco más difíciles?".
El problema es que lo único que se suele saber es "el algoritmo que se ha aplicado es $O(n \log_2 n)$ ". Así que ejecute el algoritmo en pequeñas instancias de problemas de prueba para tratar de determinar dónde se produce el cambio de dominado por términos de orden inferior a dominado por el término principal y, a continuación, un pequeño número de problemas de prueba más grandes para garantizar que la tasa observada de crecimiento es la misma que la tasa teórica de crecimiento. Obsérvese que en ningún momento sirve de nada conocer el coeficiente teórico del término de orden principal, ya que primero ha sido anegado por los términos de orden inferior y luego por los diversos factores de escala implícitos inherentes a la aplicación. Una vez que conozca la tasa de crecimiento empírica de su implementación (y suponiendo que conozca la complejidad de entrada prevista), podrá empezar a responder a las dos preguntas.