Tengo un problema de tarea para mi clase de algoritmos que me pide que calcule el tamaño máximo de un problema que puede resolverse en un número dado de operaciones usando un algoritmo O (n log n) (es decir: n log n = c). Pude obtener una respuesta al aproximarme, pero ¿hay una forma clara de obtener una respuesta exacta?Cómo calcular n log n = c
Respuesta
No existe una fórmula cerrada para esta ecuación. Básicamente, se puede transformar la ecuación:
n log n = c
log(n^n) = c
n^n = exp(c)
Entonces, esta ecuación tiene una solución de la forma:
n = exp(W(c))
donde W es Lambert W function (véase especialmente "Ejemplo 2"). Se demostró que W
no se puede expresar usando operaciones elementales. Sin embargo, f(n)=n*log(n)
es una función monótona. Puede simplemente usar bisección (aquí en Python):
import math
def nlogn(c):
lower = 0.0
upper = 10e10
while True:
middle = (lower+upper)/2
if lower == middle or middle == upper:
return middle
if middle*math.log(middle, 2) > c:
upper = middle
else:
lower = middle
la notación O sólo le da el mayor término de la ecuación. Es decir, el rendimiento de su algoritmo O (n log n) en realidad podría estar mejor representado por c = (n log n) + n + 53.
Esto significa que sin conocer la naturaleza exacta del rendimiento de su algoritmo no lo haría No se puede calcular el número exacto de operaciones requeridas para procesar una determinada cantidad de datos.
Pero es posible calcular que el número máximo de operaciones requeridas para procesar un conjunto de datos de tamaño n es mayor que un cierto número o, a la inversa, el mayor problema que se puede resolver, utilizando ese algoritmo y ese número de operaciones, es más pequeño que un cierto número.
La notación O es útil para comparar 2 algoritmos, es decir, un O (n^2) algoritmo es más rápido que un O (n^3) algoritmo etc.
ver Wikipedia para obtener más información.
Sí, calcular las raíces de "n Log [n] == c" no es equivalente a "calcular el tamaño máximo de un problema ..." –
Su explicación es cierta, pero para este problema en particular, podemos suponer que el algoritmo es exactamente n log n. Probablemente debería haber dicho eso en el problema. – jlewis42
- 1. ¿Es log (n!) = Θ (n · log (n))?
- 2. Big-O complejidad de c^n + n * (log n)^2 + (10 * n)^c
- 3. ¿Qué significa O (log (log (n)))) - competitivo?
- 4. ¿Es posible calcular la mediana de una lista de números mejor que O (n log n)?
- 5. ¿Qué es O (log * N)?
- 6. Explicación intuitiva de por qué QuickSort es n log n?
- 7. ¿Por qué está ordenando una cadena O (n log n)?
- 8. ¿Existe un término abreviado para O (n log n)?
- 9. ¿Es O (log n) siempre más rápido que O (n)
- 10. Diferencia entre O (n) y O (log (n)) - ¿cuál es mejor y qué es exactamente O (log (n))?
- 11. Calcular n-arias producto cartesiano
- 12. ¿Podemos calcular esto en menos de O (n * n) ... (nlogn o n)
- 13. Regex (C#): Reemplace \ n con \ r \ n
- 14. Calcular ruta de arco n-dimensional
- 15. ¿Cómo resolver: T (n) = T (n - 1) + n
- 16. Algoritmo para encontrar el punto especial k en el tiempo O (n log n)
- 17. C#: N Para Loops
- 18. C# Gráficos n Gráficos
- 19. ¿Cuál es la prueba de (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 20. Generar números aleatorios de -n a n en C
- 21. Reemplazando "\ r \ n" por "\ n"
- 22. ¿Cuál es la diferencia entre '\ n' o "\ n" en C++?
- 23. ¿Existe alguna forma más elegante de calcular x = (y/n) + (y% n? 1: 0)?
- 24. Algoritmo C++ para N! pedidos
- 25. Algoritmo más rápido para calcular (a^(2^N))% m?
- 26. árboles N-arios en C
- 27. Cálculo del logaritmo Base-n en Ruby
- 28. diferencia entre PHP \ r \ n \ n
- 29. Arquitectura/diseño N-Tiered vs N-Laye
- 30. ConfigurationManager.AppSettings convierte "\ n" en "\\ n" ¿por qué?
c/ProductLog [c]? –