Hay múltiples anotaciones , como u etc. Me preguntaba si hay variaciones de las que en realidad son como u , o si son matemáticamente incorrectas.
¿O sería correcto decir que es posible mejorar un a un ? Todavía no puedo y no necesito calcular tiempos de ejecución y no necesito mejorar nada, pero necesitaría saber si así describe sus funciones en realidad.
Respuestas:
Sí,O(2n2) u O ( log( n2) ) son variaciones válidas.
Sin embargo, rara vez los verá si los ve, en especial en los resultados finales. La razón es queO ( 2 n2) es O ( n2) . Del mismo modo, O ( log( n2) ) es O ( logn ) . Eso podría sorprender a los principiantes. Sin embargo, esas igualdades son más o menos la razón por la cual se introdujeron las grandes anotaciones O , para ocultar un factor constante multiplicativo que a menudo es difícil de precisar y relativamente insignificante.
No es una mejora en absoluto si la complejidad temporal de un algoritmo se cambia deO ( 5 n2) a O (3 n2) o de Ω ( 5 n2) a Ω ( 3 n2) , porque O ( 5 n2) es O ( 3 n2) mientras que Ω ( 5 n2) es Ω ( 3 n2) . Por lo tanto, es incorrecto decir que la complejidad temporal se ha mejorado deO ( 5 n2) aO(3n2) . Es correcto decir que la complejidad temporal de un algoritmo mejora de5n2 a3n2 , por supuesto.
Ejercicio 1. Demuestre queO(5n2)=O(3n2)=O(n2) .
Ejercicio 2. Demuestre queO(logn)=O(log(n2)) .
Ejercicio 3. Demuestre queΩ(n2+n)=Ω(n2) .
fuente
Siempre eres libre de no usar esta notación en absoluto. Es decir, puede determinar una funciónf(n) mayor precisión posible y luego tratar de mejorarla. Por ejemplo, es posible que tenga un algoritmo de clasificación que haga f(n) comparaciones, por lo que podría intentar encontrar otro algoritmo de clasificación que solo haga comparaciones g(n) . Por supuesto, todo tipo de funciones f(n) existen (en teoría) y también pueden aparecer (en la práctica).
En lugar de tratar la notación Big Oh como una magia misteriosa en la que tienes que consultar a los magos para preguntar si puedes hacer algo, debes mirar su definición . Respete la definición y luego haga lo que sea necesario para hacer su trabajo.
fuente
Si bien la respuesta aceptada es bastante buena, todavía no toca la razón real por la cualO(n)=O(2n) .
La notación Big-O describe escalabilidad
En esencia, la notación Big-O no es una descripción de cuánto tiempo tarda un algoritmo en ejecutarse. Tampoco es una descripción de cuántos pasos, líneas de código o comparaciones realiza un algoritmo. Es más útil cuando se usa para describir cómo un algoritmo escala con el número de entradas.
Tome una búsqueda binaria, por ejemplo. Dada una lista ordenada, ¿cómo encuentra un valor arbitrario dentro de ella? Bueno, podrías comenzar por el medio. Como la lista está ordenada, el valor medio le indicará en qué mitad de la lista se encuentra su valor objetivo. Por lo tanto, la lista que debe buscar ahora se divide por la mitad. Esto se puede aplicar de forma recursiva, luego ir al centro de la nueva lista, y así sucesivamente hasta que el tamaño de la lista sea 1 y haya encontrado su valor (o no exista en la lista). Duplicar el tamaño de la lista solo agrega un paso adicional al algoritmo, que es una relación logarítmica. Por lo tanto, este algoritmo esO(logn) . El logaritmo es la base 2, pero eso no importa: el núcleo de la relación es que multiplicar la lista por un valor constante solo agrega un valor constante al tiempo.
Contraste una búsqueda estándar a través de una lista no ordenada: la única forma de buscar un valor en este caso es verificar cada uno. El peor de los casos (que es lo que Big-O implica específicamente) es que su valor está al final, lo que significa que para una lista de tamañon , debe verificar n valores. Duplicar el tamaño de la lista duplica el número de veces que debe verificar, que es una relación lineal. O(n) . Pero incluso si tuviera que realizar dos operaciones en cada valor, algún procesamiento, por ejemplo, la relación lineal aún se mantiene. O(2n) simplemente no es útil como descriptor, ya que describiría exactamente la misma escalabilidad que O(n) .
Aprecio que muchas de estas respuestas te estén diciendo básicamente que llegues a esta conclusión tú mismo leyendo la definición de Big-O. Pero esta comprensión intuitiva me llevó bastante tiempo comprender y, por lo tanto, te lo explico lo más claramente posible.
fuente
Puedes escribirO ( f) para cualquier funciónF Y eso tiene un sentido perfecto. Según la definición,sol(n)=O(f(n)) if there is some constant c such that g(n)≤cf(n) for all large enough n . Nothing in that definition says that f must be some sort of "nice" function.
But, as other answers have pointed out,g(n)=O(f(n)) and g(n)=O(2f(n)) describe exactly the same situation: if g(n)≤cf(n) for all all large enough n , then we also have g(n)≤c22f(n) , so g(n)=O(2f(n)) , also (taking the constant to be c/2 ).
As a side issue, don't write "logn2 ", because it's not 100% clear what it means. You could say that it obviously means log(n2) but almost everybody would write that as 2logn , so it puts doubt in the reader's mind.
Also, note that big-O notation has nothing to do with runtimes per se. It's just a notation for relationships between functions. Those functions are often used to measure the runtimes of algorithms but that's just one application, just like measuring people's heights is just one application of numbers.
fuente
Look at the definition of O(f(n)), and you see that for example O(2n^2) and O(n^2) are exactly the same. Changing an algorithm from 5n^2 to 3n^2 operations is a 40 percent improvement. Changing from O(5n^2) to O(3n^2) isn’t actually any change, they are the same.
Again, read the definition of O(f(n)).
fuente
It may be helpful to understand that Big-O describes a set of functions. That isO(f(n))={g(n)|∃n,c>0:∀m>n:c×g(m)≤f(m)}
The usage of= is kind of unfortunate and using ∈ would make that relationship a lot clearer. but the set notation symbols are a bit difficult to type so now we are stuck with the current convention.
This then shows thatO(n)=O(2n) Or that constant factors don't matter when defining the Big O.
fuente