El orden de complejidad es solo una aproximación de límite superior e inferior, y solo se utiliza para analizar algoritmos para estimar la cantidad de tiempo que tomaría máxima y mínimamente completar una corrida de cómputo.
La clasificación es una de esas cosas que lleva mucho tiempo revisar un conjunto de datos una y otra vez, al igual que los algoritmos para problemas matemáticos numéricos difíciles, como la determinación de factores primos de grandes números o el modelado de redes neuronales, etc.
Por supuesto, cada algoritmo tiene un límite superior dado un límite superior en el número de puntos de datos, pero el punto es que hay formas más eficientes de llegar a los resultados finales que la fuerza bruta intentando cada combinación o permutación posible. Sin embargo, a veces incluso tienes que hacer eso.
Decir que un algoritmo se ejecuta en O (N) es decir que el tiempo que tarda en completarse es directamente proporcional al tamaño del conjunto de datos, como un límite superior. Por lo tanto, la clasificación de 100 elementos debería ser aproximadamente 10 veces más rápida que la clasificación de 1000 elementos, el peor de los casos para ambos.
Los algoritmos de encriptación están diseñados para que le tome O (2 ^ N) tiempo resolver el peor de los casos como su principal razón de ser. En ese caso, querrás que te lleve una eternidad (a menos que tengas las llaves).
N en la notación “Big O” no es una constante, sino un símbolo de un conjunto de datos finitos de N elementos con los que tratar u operaciones que realizar. Comprenda que un algoritmo podría tener muchos, muchos pasos y aún así tener un número Big O bajo. O (NlogN) se considera bastante bueno y generalmente es lo mejor que puede hacer para la mayoría de los algoritmos complejos.
Un algoritmo podría tener 500 pasos y seguir siendo O (N). Una tabla Hash podría tener un millón de entradas y aún tener tiempo de acceso O (logN) . (¡por eso las tablas hash son tan increíbles!)
O (N ^ 2) es normal para ordenar con métodos lineales como doble para bucles o ordenaciones recursivas.
Las bases de datos prueban todo tipo de algoritmos para tratar de acercarse a O (1) para búsquedas y O (N) para la colocación, pero esos son mínimos teóricos, O (logN) para búsquedas y O (NlogN) para la colocación sigue siendo bastante bueno para recuperación general datos.
La búsqueda binaria viene en magra y media en O (log N) . Eso significa que para cada aumento de 10 veces la cantidad de datos, agregará solo log (T) al peor de los casos. 100 artículos toman T = 2, 1000 artículos toman T = 3, 10,000 artículos T = 4….
Comprenda que el análisis del tiempo Big O para algoritmos puede ser útil para comprender los cuellos de botella en los programas y los gráficos de datos complejos, etc., y es un estudio valioso, pero como otros han dicho, generalmente no es una opción qué algoritmo usar, y sin una revisión real del código, realmente no sabes que ahí es donde está la desaceleración.
Las fórmulas matemáticas tienen su propio tiempo Big O dentro del código que se agrega a ese tiempo.
Digamos, por ejemplo, que necesita calcular las raíces cúbicas del cuadrado de un conjunto de 100 números (enteros). ¿Cuál es el orden de tal función?
N: 100
Cuadrar N toma una sola multiplicación por artículo. Si observa el código de máquina para multiplicar, verá que se puede hacer con aproximadamente 8–12 instrucciones de CPU para cualquier número en el conjunto de datos de ints. 12 * 100 = 1200. Muy lineal a medida que el tiempo crece proporcionalmente a una constante fija (C) multiplicada por el tamaño (N) del conjunto de datos a trabajar.
pero C * O (N) = O (CN) = O (N) ( C << N C insignificante para N)) por lo que la multiplicación es ~ O (N) con hardware especial. Usted ve que a medida que N crece exponencialmente, C permanece igual, por lo que se vuelve insignificante para N. O (N) .
Sin embargo, si decidiste que tienes que multiplicar por suma repetida, por alguna razón, eso implicaría agregar cada número a sí mismo la misma cantidad de veces que su valor. Cuanto mayor es el número, más operaciones de suma.
Si el número fuera 100, cuadrarlo requeriría 99 operaciones de suma. 99 es significativo en comparación con 100 (~ 10 ^ 2), por lo que debe tenerlo en cuenta. Eso significa que dado N hay N pasos para cada elemento. Entonces ahora tendría un algoritmo O (N * N) O (N ^ 2).
La raíz del cubo viene después. Eso es más complejo para calcular Big O en. Primero, ¿cómo se hace? Por división O por multiplicación y división. La forma más simple en que puedo pensar en la parte superior de mi cabeza a la 1 de la mañana es hacer una estimación excesiva / insuficiente.
elija un número aleatorio x menos que el orden base 2 de n. Cubicalo.
x ^ 3 = n? tómalo.
y = 2
lazo A:
x ^ 3> n? restar x / y de x. Inténtalo de nuevo.
x ^ 3> n? y = y + 1; ir a
Lazo B:
x ^ 3 x ^ 3 x ^ 3> n? y = y + 1; ir a
repita con (x, y) y continúe hasta X ^ 3 = n con suficientes dígitos para tomar como resultado.
Ahora suponiendo que x ^ 3 es O (N) , para cada elemento en el conjunto de datos, tiene entre N / 2 +2 viajes alrededor del bucle A y lo mismo para el peor caso del bucle B, entonces
para N números cada resultado toma:
N (N + (N / 2 + 2) + (N / 2 + 2) + C) = N (2N + 4 + C) = 2N ^ 2 + 4N + pasos CN.
reducir a 2 (N ^ 2 + (2 + C / 2) N) ==> O (N ^ 2 + N)
Probablemente equivocado, pero esa es la idea.
Entonces, procesar 1000 números de esta manera tomaría más de un millón de pasos.
Pero procesar 10,000 números de esta manera requeriría más de 100 millones de pasos. Un aumento de 10x resulta en un aumento de 100x tiempo para completar. Pero es la raíz cúbica el camino en curso. Podría hacerlo peor: comience con x = 1 y simplemente increméntelo en 1 hasta que x ^ 3 exceda n, luego vaya al siguiente punto decimal …
Entonces, a veces es importante, especialmente con algoritmos de bucle peludos.
TLDR; N puede ser cualquier número; N en sí no es una cantidad fija mayor o menor que cualquier constante .
O (C) = O (1); cualquier O con N en el numerador es de un orden superior a ese.
Incluso O (logN)> O (1).