O((n^3)/4)
no tiene sentido en términos de notación de O grande, ya que está destinado a medir la complejidad como una proporción del argumento. Dividir por 4 no tiene ningún efecto ya que eso cambia el valor de la razón pero no su naturaleza.
Todos estos son equivalentes:
O(n^3)
O(n^3/4)
O(n^3*1e6)
Otros términos sólo tienen sentido cuando incluyen un término n
, tales como:
O(n^3/log(n))
O(n^3 * 10^n)
Como Anthony Kanago señala con razón, que es la convención a:
- Mantenga el término con la mayor tasa de crecimiento por sumas:
O(n^2+n) = O(n^2)
.
- deshacerse de las constantes de los productos:
O(n^2/4) = O(n^2)
.
Como nota aparte, no siempre estoy de acuerdo con esa primera regla en todos los casos. Es una buena regla para decidir la tasa máxima de crecimiento de una función, pero para cosas como la comparación de algoritmos (a) donde puedes poner un límite al parámetro de entrada, algo como O(n^4+n^3+n^2+n)
es notablemente peor que O(n^4)
.
En ese caso, se debe incluir cualquier término que dependa del parámetro de entrada. De hecho, incluso los términos constantes pueden ser útiles allí. Compare por ejemplo O(n+1e100)
contra O(n^2)
- este último superará al primero durante bastante tiempo, hasta que n
sea lo suficientemente grande como para tener un efecto sobre el término constante.
(a) Hay, por supuesto, aquellos que dicen que no se debe utilizar en una forma tal, sino el pragmatismo menudo supera el dogmatismo en el mundo real :-)
n/4 * n * n = (n^3)/4 –
Un compilador inteligente sería probablemente optimice este nido de bucle para que sea O (1), ya que en realidad no hace nada. – tgamblin
Un compilador "inteligente" lo dejaría solo a menos que se indique lo contrario: puede ser un ciclo de tiempo en un sistema integrado que controla el flujo sanguíneo a través de una máquina de diálisis :-) – paxdiablo