n * log ny n / log n contra el tiempo de ejecución polinómico


14

Entiendo que es más rápido que Θ ( n log n ) y más lento que Θ ( n / log n ) . Lo que me resulta difícil de entender es cómo comparar Θ ( n log n ) y Θ ( n / log n ) con Θ ( n f ) donde 0 < f < 1 .Θ(n)Θ(nlogn)Θ(n/logn)Θ(nlogn)Θ(n/logn)Θ(nf)0<f<1

Por ejemplo, ¿cómo decidimos vs. Θ ( n 2 / 3 ) o Θ ( n 1 / 3 )Θ(n/logn)Θ(n2/3)Θ(n1/3)

Me gustaría tener algunas instrucciones para proceder en tales casos. Gracias.

Respuestas:


3

Si solo dibuja un par de gráficos, estará en buena forma. Wolfram Alpha es un gran recurso para este tipo de investigaciones:

ecuaciones

Grafico

Generado por este enlace . Tenga en cuenta que en el gráfico, log (x) es el logaritmo natural, razón por la cual la ecuación de un gráfico se ve un poco divertida.



Además de estar de acuerdo con Raphael, esta imagen daría una idea mucho mejor , elegir un rango aún mayor permite que la segunda función desaparezca, lo que puede ser confuso.
phant0m

9

es el inverso de 2 n . Así como 2 n crece más rápido que cualquier polinomio n k, independientemente de cuán grande sea una k finita, log n crecerá más lentamente que cualquier función polinomial n k, independientemente de cuán pequeño sea un cero positivo, k .logn2n2nnkklognnkk

n/lognnkk<1n/lognn/n1k

n1k>lognnn/logn>nkk<1n


3

Para muchos algoritmos, a veces sucede que las constantes son diferentes, lo que hace que una u otra sea más rápida o más lenta para tamaños de datos más pequeños, y no están tan bien ordenadas por la complejidad algorítmica.

Dicho esto, si solo consideramos los tamaños de datos súper grandes , es decir. cuál finalmente gana, luego O(n^f)es más rápido que O(n/log n)para 0 < f < 1.

Una gran parte de la complejidad algorítmica es determinar qué algoritmo es finalmente más rápido, por lo tanto, saber que O(n^f)es más rápido que O(n/log n)para 0 < f < 1, a menudo es suficiente.

Una regla general es que multiplicar (o dividir) por log neventualmente será insignificante en comparación con multiplicar (o dividir) por n^fcualquiera f > 0.

Para mostrar esto más claramente, consideremos lo que sucede cuando n aumenta.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

¿Notar cuál disminuye más rápidamente? Es la n^fcolumna.

Incluso si festuviera más cerca de 1, la n^fcolumna comenzará más lentamente, pero a medida que n se duplica, la velocidad de cambio del denominador se acelera, mientras que el denominador de la n/log ncolumna parece cambiar a una velocidad constante.

Tracemos un caso particular en un gráfico

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Fuente: Wolfram Alpha

Seleccioné O(n^k)tal que kestá bastante cerca de 1 (at 0.9). También seleccioné las constantes para que inicialmente O(n^k)sea ​​más lento. Sin embargo, tenga en cuenta que finalmente "gana" al final, y lleva menos tiempo que O(n/log n).


¿Qué pasa con n / log n

Eso fue un error tipográfico, eso es lo que quise decir al principio. De todos modos, agregué un gráfico más apropiado que muestra que n^keventualmente es más rápido, incluso si las constantes se seleccionan de modo que inicialmente sea más lento.

3

nfnn1fn2/3=n/n1/3

nlognvs.nn1f.

lognnεε>0


1

Al comparar los tiempos de ejecución, siempre es útil compararlos utilizando grandes valores de n. Para mí, esto ayuda a desarrollar la intuición sobre qué función es más lenta

En su caso, piense en n = 10 ^ 10 y a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Por lo tanto, O (n ^ a) es más rápido que O (n / logn), cuando 0 <a <1 he usado solo un valor, sin embargo, puede usar múltiples valores para construir la intuición sobre la función


1
No escriba O(10^9), pero el punto principal acerca de intentar algunos números para construir la intuición es correcto.

Fallar. Esto no es correcto. Sustituiste una sola constante n, que puede estar sesgada. Si elijo diferentes constantes, podría hacer que cualquier algoritmo se vea mejor. La notación Big O se usa para establecer tendencias en lo que será más rápido a largo plazo. Para hacer esto, debe poder demostrar que es más rápido para n grande, incluso si es más lento cuando n es más pequeño.

Gracias. Parte de valores múltiples agregados y para considerar números más grandes

Cabe señalar que solo porque f (a)> g (a) para alguna constante a, no necesariamente implica que O (f (x))> O (g (x)). Esto es útil para construir la intuición, pero es insuficiente para componer una prueba rigurosa. Para demostrar que esta relación se mantiene, debe demostrar que esto es cierto para TODAS las n grandes, no solo una n grande. Del mismo modo, debe demostrar que es cierto para todos los polinomios de grado positivo <1.

1

fg

nα1(logn)α2(loglogn)α3nβ1(logn)β2(loglogn)β3(α1,α2,α3)<(β1,β2,β3)

(2,10)<(3,5)(2,10)>(2,5)

Aplicado a su ejemplo:

O(n/logn)(1,1,0)

O(n2/3)(2/3,0,0)

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

Se podría decir: los poderes de n dominan los poderes del registro, que dominan los poderes del registro.

Fuente: Matemáticas concretas, p. 441

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.