La notación O grande es un medio libre de unidad para medir la variación del rendimiento, por lo tanto, impermeable a los costos relativos de las primitivas computacionales.
En pocas palabras: la
notación Big O es un tipo de medida relativamente libre de unidades (en oposición a la medida absoluta). Solo puede medir la variación del rendimiento, no el rendimiento absoluto, para el cual las constantes son muy importantes. La ventaja es que esto lo hace en gran medida independiente de la implementación, al permitir un análisis más simple que puede ignorar los costos relativos de las operaciones elementales, siempre que estos costos tengan límites superiores e inferiores fijos positivos. Pero la consecuencia es que los factores constantes no tienen sentido . Aún así, incluso para su propósito previsto, el análisis de la complejidad asintótica puede ser cuestionado por otros motivos y debe considerarse con cuidado. Por ejemplo, el tamaño de entrada sin formato puede no ser el parámetro correcto a considerar.
Un primer comentario es que su pregunta no está formulada con precisión. Cuando descuidas la constante en 3 n , de hecho hay un "cambio de tres veces", pero ambos varían al mismo ritmo, y no puedes afirmar que "[una] cosa varía 3 veces más rápidamente que la otra".33n
Una buena razón para ignorar la constante en la notación de Landau es que no tenemos una unidad en la que podamos confiar. Cuando alguien dice que A vive dos veces más lejos de ti que B, esto tiene significado independientemente de cualquier unidad. Podemos estar de acuerdo, aunque midas distancias en pulgadas mientras yo lo hago en años luz. Pero la medición de la distancia absoluta requiere unidades específicas, y su formulación numérica depende de la unidad elegida.
El tiempo real que tarda un algoritmo depende del tiempo de ejecución de las operaciones elementales, que depende mucho de la máquina. Puede contar el número de operaciones elementales, pero no hay razón para creer que todas tomen el mismo tiempo, y siempre es posible combinar varias operaciones en una sola, o por el contrario descomponer una operación en operaciones más pequeñas, de modo que el número de operaciones no es realmente significativo, a menos que esté de acuerdo con una máquina virtual de referencia. Ser una referencia independiente es una ventaja.
Otra vista de la ventaja del enfoque es que todo lo que le importa en el análisis es contar el número de operaciones elementales, siempre que su costo tenga un límite superior y un límite inferior positivo. No tiene que preocuparse por el costo individual.
Sin embargo, el precio a pagar por esa ventaja es que la evaluación del costo de cómputo se da con una unidad no especificada, y el tiempo de cómputo, por ejemplo, podría ser nanosegundos o milenios; ni siquiera tratamos de saberlo. En otras palabras, los factores constantes no tienen sentido, ya que cambiar las unidades es inseparable del cambio del factor constante , y no se utilizan unidades de referencia.
Como señaló Patrick87 , esto es suficiente para comprender cómo se escala un algoritmo con respecto al tamaño de entrada, pero no dará una medida absoluta de rendimiento, salvo depender de una unidad de referencia. Se puede deshacer una máquina abstracta de referencia común cuando uno realmente desea comparar el rendimiento de algoritmos distintos, pero es más difícil asegurarse de que la comparación no esté sesgada por los detalles de realización. En la complejidad asintótica, este riesgo se evita porque compara el algoritmo consigo mismo.
De todos modos, solo un programador ingenuo dependería exclusivamente de la complejidad asintótica para elegir un algoritmo. Existen muchos otros criterios, incluida la constante no contada y el costo real de las operaciones elementales. Además, la complejidad del peor de los casos puede ser un indicador deficiente, porque la fuente de la peor complejidad del caso puede ocurrir raramente, y en fragmentos de la entrada lo suficientemente pequeños como para que tenga un impacto limitado. Por ejemplo, los analizadores generales de las gramáticas adyacentes a los árboles tienen una complejidad teórica , y son bastante utilizables en la práctica. El peor caso que conozco es la
inferencia de tipo polimórfico Damas-Hindley-MilnerO(n6)algoritmo utilizado para ML, que tiene una complejidad exponencial en el peor de los casos. Pero eso no parece molestar a los usuarios de ML ni evitar la escritura de programas muy grandes en ML. Hay más que la constante que importa. En realidad, el análisis asintótico relaciona una medida del costo de un cálculo con alguna medida de la complejidad de la entrada. Pero el tamaño bruto puede no ser la medida correcta.
La complejidad es como la capacidad de decisión, puede ser teóricamente mala, pero eso puede ser irrelevante para la mayoría del espacio de datos ... a veces. El análisis de complejidad asintótica es una herramienta buena y bien diseñada, con sus ventajas y limitaciones, como todas las herramientas. Con o sin explicitar la constante, que puede no tener sentido, es necesario usar el juicio.