Estoy resolviendo una pregunta de algoritmo y mi análisis es que se ejecutaría en O (2 ^ sqrt (n)). ¿Como de grande es? ¿Equivale a O (2 ^ n)? ¿Sigue siendo tiempo no polinómico?
big-o
algorithm-analysis
Gaara
fuente
fuente
Respuestas:
Esta es una pregunta interesante. Afortunadamente, una vez que sabes cómo resolverlo, no es particularmente difícil.
Para las funciones f : N → R + y g : N → R + , tenemos f ∈ O ( g ) si y sólo si sup lim n → ∞ f ( n ) / g ( n ) ∈ R .
Una función f : N → R + tiene a lo sumo crecimiento polinómico si y solo si existe una constante k ∈ N tal que f ∈ O ( n ↦ n k ). Vamos a resolver esto para k ∈ N arbitrario pero fijo .
lim sup n → ∞ 2 ( n 1/2 ) / n k =
lim n → ∞ 2 ( n 1/2 ) / n k =
lim n → ∞ e log (2) n 1/2 / e log ( n ) k =
lim n → ∞ e log (2) n 1/2 - log ( n ) k = ∞ ∉ R
La primera igualdad es verdadera porque ambos, el nominador y el denominador, son funciones estables que crecen monotónicamente. La segunda igualdad usa la identidad x y = e log ( x ) y . El límite no es finito porque el exponente en la expresión final no está limitado anteriormente. Sin dar una prueba formal, se puede suponer que se sabe que n 1/2 domina log ( n ) asintóticamente. Por lo tanto, la función en cuestión excede el crecimiento polinómico.
Sin embargo, su crecimiento es estrictamente menor que exponencial, donde exponencial se define (por mí, para este propósito) como O ( n ↦ 2 c n ) para c > 0. Mostrar esto es aún más directo.
lim sup n → ∞ 2 c n / 2 ( n 1/2 ) = lim n → ∞ 2 c n - n 1/2 = ∞ ∉ R
para cualquier c > 0. fijo . Por lo tanto, la complejidad de la función está en algún lugar verdaderamente entre polinomio y exponencial.
fuente
¿Como de grande es? Bueno, O (2 ^ sqrt (n)) es exactamente lo grande que es :-(
Para tener una idea de lo que significa, imagine que su algoritmo no sería solo O (2 ^ sqrt (n)), sino que en realidad requiere exactamente 2 ^ sqrt (n) nanosegundos en su computadora:
n = 100: 2 ^ 10 = 1024 nanosegundos. No hay tiempo en absoluto. n = 1000: 2 ^ 31.xxx = 2 mil millones de nanosegundos. Dos segundos, eso se nota. n = 10,000: 2 ^ 100 ≈ 10 ^ 30 nanosegundos = 10 ^ 21 segundos = 30 trillones de años.
Esto es mucho mejor que 2 ^ n nanosegundos, donde n = 100 tomaría 30 billones de años, pero aún así el tamaño de los problemas que puede resolver es bastante limitado. Si considera un problema "solucionable" si su computadora puede resolverlo en una semana, eso es aproximadamente 6 x 10 ^ 14 nanosegundos, eso es aproximadamente n = 2,400. Por otro lado, hasta n = 400 se pueden resolver en un milisegundo.
(En la práctica, para n = 10,000, tanto O (2 ^ sqrt (n)) como O (2 ^ n) toman exactamente el mismo tiempo: demasiado tiempo para esperarlo).
Excede cualquier polinomio. Tome otro algoritmo que tome n ^ 1000 segundos. Lo cual es prácticamente insoluble para n = 2. Este algoritmo lleva más tiempo hasta que n es de aproximadamente 885 millones. Pero realmente, a quién le importa? En ese momento, el número de años que toman ambos algoritmos es un número de 9,000 dígitos.
fuente