Los recursos que he encontrado sobre la complejidad del tiempo no tienen claro cuándo está bien ignorar los términos en una ecuación de complejidad del tiempo, específicamente con ejemplos no polinómicos.
Para mí está claro que dada algo de la forma n 2 + n + 1, los dos últimos términos son insignificantes.
Específicamente, dadas dos categorizaciones, 2 n y n * (2 n ), ¿la segunda está en el mismo orden que la primera? ¿Importa la n multiplicación adicional allí? Por lo general, los recursos solo dicen que x n es exponencial y crece mucho más rápido ... luego continúe.
Puedo entender por qué no lo haría, ya que 2 n superará en gran medida a n, pero debido a que no se suman, sería muy importante al comparar las dos ecuaciones, de hecho, la diferencia entre ellas siempre será un factor de n, lo que parece importante por decir lo menos.
n! = o((n+1)!)
es decir, crece estrictamente más lentamente asintóticamente.Respuestas:
Tendrá que ir a la definición formal de la gran O (
O
) para responder esta pregunta.La definición es que
f(x)
pertenece aO(g(x))
si y solo si el límite existe, es decir, no es infinito. En resumen, esto significa que existe una constante , de modo que el valor de nunca es mayor que .limsupx → ∞ (f(x)/g(x))
M
f(x)/g(x)
M
En el caso de su pregunta let and let . Entonces es lo que seguirá creciendo infinitamente. Por lo tanto , no pertenece a .
f(n) = n ⋅ 2n
g(n) = 2n
f(n)/g(n)
n
f(n)
O(g(n))
fuente
O(f(x)/g(x))
; La notificación big-O es una forma abreviada de un conjunto de funciones, no una sola función cuyo valor puede limitar. Sin embargo, creo que es cierto que puedes demostrarlof(x) = O(g(x))
silim(x->infinity) f(x)/g(x)
existe.lim sup
lugar delim
.x
, no para todos los valores dex
.Una forma rápida de ver que
n⋅2ⁿ
es más grande es hacer un cambio de variable. Dejarm = 2ⁿ
. Luegon⋅2ⁿ = ( log₂m )⋅m
(tomando el logaritmo de base 2 en ambos lados de losm = 2ⁿ
dadosn = log₂m
), y puede mostrar fácilmente quem log₂m
crece más rápido quem
.fuente
lg
? ¿Logaritmo en base 2?lg
es la notación ISO para un logaritmo de base 10, en lugar del uso agnóstico de base más comúnmente utilizado cuando se discuten los tiempos de ejecución asintóticos. Ver en.wikipedia.org/wiki/Logarithm#Particular_basesEstoy de acuerdo en que
n⋅2ⁿ
no estáO(2ⁿ)
, pero pensé que debería ser más explícito ya que el límite de uso superior no siempre se cumple.Por la definición formal de Big-O:
f(n)
está enO(g(n))
si existen constantesc > 0
yn₀ ≥ 0
tal que para todo lon ≥ n₀
que tenemosf(n) ≤ c⋅g(n)
. Se puede demostrar fácilmente que no existen tales constantes paraf(n) = n⋅2ⁿ
yg(n) = 2ⁿ
. Sin embargo, se puede demostrar queg(n)
está adentroO(f(n))
.En otras palabras,
n⋅2ⁿ
es menor delimitado por2ⁿ
. Esto es intuitivo. Aunque ambos son exponenciales y, por lo tanto, es poco probable que se usen en la mayoría de las circunstancias prácticas, no podemos decir que sean del mismo orden porque2ⁿ
necesariamente crecen más lentamente quen⋅2ⁿ
.fuente
f(n) = 2*2^n
Creo que quisiste decirn*2^n
?No discuto con otras respuestas que dicen que
n⋅2ⁿ
crece más rápido que2ⁿ
. Peron⋅2ⁿ
crece todavía es solo exponencial.Cuando hablamos de algoritmos, a menudo decimos que la complejidad del tiempo crece es exponencial. Por lo tanto, consideramos que
2ⁿ
,3ⁿ
,eⁿ
,2.000001ⁿ
, o de nuestron⋅2ⁿ
ser mismo grupo de complejidad exponencial con crece.Para darle un poco de sentido matemático, consideramos que una función
f(x)
crece (no más rápido que) exponencialmente si existe tal constantec > 1
, eso .f(x) = O(cx)
Para
n⋅2ⁿ
la constantec
puede ser cualquier número mayor que2
, tomemos3
. Luego:n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿ
y esto es menos que1
para cualquieran
.Entonces
2ⁿ
crece más lento quen⋅2ⁿ
, el último a su vez crece más lento que2.000001ⁿ
. Pero los tres crecen exponencialmente.fuente
Usted preguntó "¿el segundo está en el mismo orden que el primero? ¿Importa la n multiplicación adicional allí?" Estas son dos preguntas diferentes con dos respuestas diferentes.
n 2 ^ n crece asintóticamente más rápido que 2 ^ n. Esa es la pregunta contestada.
Pero podría preguntar "si el algoritmo A toma 2 ^ n nanosegundos, y el algoritmo B toma n 2 ^ n nanosegundos, ¿cuál es el n más grande donde puedo encontrar una solución en un segundo / minuto / hora / día / mes / año? Y las respuestas son n = 29/35/41/46/51/54 vs. 25/30/36/40/45/49. No hay mucha diferencia en la práctica.
El tamaño del mayor problema que se puede resolver en el tiempo T es O (ln T) en ambos casos.
fuente