La notación Big O es una notación matemática que describe el comportamiento límite de una función cuando el argumento tiende hacia un valor particular o hacia el infinito. Big O es miembro de una familia de notaciones inventadas por los matemáticos alemanes Paul Bachmann , [1] Edmund Landau , [2] y otros, llamadas colectivamente notación Bachmann-Landau o notación asintótica . La letra O fue elegida por Bachmann para representar Ordnung , es decir, el orden de aproximación .
En informática , la notación O mayúscula se utiliza para clasificar algoritmos según cómo crecen sus requisitos de tiempo de ejecución o espacio a medida que crece el tamaño de entrada. [3] En teoría analítica de números , la notación O mayúscula se utiliza a menudo para expresar un límite en la diferencia entre una función aritmética y una aproximación mejor entendida; un ejemplo famoso de tal diferencia es el término restante en el teorema de los números primos . La notación O mayúscula también se utiliza en muchos otros campos para proporcionar estimaciones similares.
La notación O mayúscula caracteriza las funciones según sus tasas de crecimiento: distintas funciones con la misma tasa de crecimiento asintótico pueden representarse utilizando la misma notación O. Se utiliza la letra O porque la tasa de crecimiento de una función también se conoce como el orden de la función . Una descripción de una función en términos de notación O mayúscula generalmente solo proporciona un límite superior para la tasa de crecimiento de la función.
Asociadas con la notación O grande hay varias notaciones relacionadas, que utilizan los símbolos o , Ω, ω y Θ , para describir otros tipos de límites en las tasas de crecimiento asintótico. [3]
Sea la función a estimar una función de valor real o complejo , y sea la función de comparación una función de valor real. Dejemos que ambas funciones se definan en algún subconjunto ilimitado de los números reales positivos , y sean distintas de cero (a menudo, pero no necesariamente, estrictamente positivas) para todos los valores suficientemente grandes de [4] Se escribe y se lee " es grande O de " o más a menudo " es del orden de " si el valor absoluto de es como máximo un múltiplo constante positivo del valor absoluto de para todos los valores suficientemente grandes de Es decir, si existe un número real positivo y un número real tal que En muchos contextos, la suposición de que estamos interesados en la tasa de crecimiento a medida que la variable tiende a infinito o a cero se deja sin establecer, y se escribe de forma más sencilla que La notación también se puede utilizar para describir el comportamiento de cerca de algún número real (a menudo, ): decimos si existen números positivos y tales que para todos definidos con Como es distinto de cero para valores adecuadamente grandes (o pequeños) de ambas definiciones se pueden unificar utilizando el límite superior : si Y en ambas definiciones el punto límite (sea o no) un punto de clúster de los dominios de e i. es decir, en cada entorno de deben existir infinitos puntos en común. Además, como se señala en el artículo sobre el límite inferior y el límite superior , el (al menos en la línea de números reales extendida ) siempre existe.
En informática, es común una definición ligeramente más restrictiva: y se requiere que ambos sean funciones desde algún subconjunto ilimitado de los números enteros positivos hasta los números reales no negativos; entonces, si existen números enteros positivos y tales que para todos [5]
En el uso típico, la notación O es asintótica, es decir, se refiere a valores x muy grandes . En este contexto, la contribución de los términos que crecen "más rápidamente" hará que los demás sean irrelevantes. Como resultado, se pueden aplicar las siguientes reglas de simplificación:
Por ejemplo, sea f ( x ) = 6 x 4 − 2 x 3 + 5 , y supongamos que deseamos simplificar esta función, utilizando la notación O , para describir su tasa de crecimiento a medida que x tiende al infinito. Esta función es la suma de tres términos: 6 x 4 , −2 x 3 y 5 . De estos tres términos, el que tiene la tasa de crecimiento más alta es el que tiene el mayor exponente en función de x , es decir, 6 x 4 . Ahora se puede aplicar la segunda regla: 6 x 4 es un producto de 6 y x 4 en el que el primer factor no depende de x . Omitir este factor da como resultado la forma simplificada x 4 . Por lo tanto, decimos que f ( x ) es una "O grande" de x 4 . Matemáticamente, podemos escribir f ( x ) = O ( x 4 ) . Se puede confirmar este cálculo usando la definición formal: sea f ( x ) = 6 x 4 − 2 x 3 + 5 y g ( x ) = x 4 . Aplicando la definición formal de arriba, la afirmación de que f ( x ) = O ( x 4 ) es equivalente a su desarrollo, para alguna elección adecuada de un número real x 0 y un número real positivo M y para todo x > x 0 . Para probar esto, sea x 0 = 1 y M = 13 . Entonces, para todo x > x 0 : entonces
La notación Big O tiene dos áreas principales de aplicación:
En ambas aplicaciones, la función g ( x ) que aparece dentro de O (·) se elige típicamente para que sea lo más simple posible, omitiendo factores constantes y términos de orden inferior.
Hay dos usos formalmente cercanos, pero notablemente diferentes, de esta notación: [ cita requerida ]
Sin embargo, esta distinción es sólo práctica y no de principio: la definición formal de la "gran O" es la misma para ambos casos, sólo que con diferentes límites para el argumento de la función. [ ¿ Investigación original? ]
La notación O grande es útil cuando se analizan algoritmos para determinar su eficiencia. Por ejemplo, el tiempo (o la cantidad de pasos) que se necesitan para completar un problema de tamaño n puede ser T ( n ) = 4 n 2 − 2 n + 2 . A medida que n se hace grande, el término n 2 pasará a dominar, de modo que todos los demás términos pueden ignorarse; por ejemplo, cuando n = 500 , el término 4 n 2 es 1000 veces más grande que el término 2 n . Ignorar este último tendría un efecto insignificante en el valor de la expresión para la mayoría de los propósitos. Además, los coeficientes se vuelven irrelevantes si los comparamos con cualquier otro orden de expresión, como una expresión que contenga un término n 3 o n 4 . Incluso si T ( n ) = 1.000.000 n 2 , si U ( n ) = n 3 , este último siempre superará al primero una vez que n crezca más de 1.000.000 , es decir, T (1.000.000) = 1.000.000 3 = U (1.000.000) . Además, el número de pasos depende de los detalles del modelo de máquina en el que se ejecuta el algoritmo, pero los diferentes tipos de máquinas suelen variar solo por un factor constante en el número de pasos necesarios para ejecutar un algoritmo. Por lo tanto, la notación O mayúscula captura lo que queda: escribimos
o
y decir que el algoritmo tiene una complejidad temporal de orden n 2. El signo " = " no pretende expresar "es igual a" en su sentido matemático normal, sino más bien un "es" más coloquial, por lo que la segunda expresión a veces se considera más precisa (ver la discusión sobre el "signo igual" a continuación) mientras que la primera es considerada por algunos como un abuso de notación . [6]
La O mayúscula también se puede utilizar para describir el término de error en una aproximación a una función matemática. Los términos más significativos se escriben explícitamente y luego los términos menos significativos se resumen en un único término O mayúscula. Consideremos, por ejemplo, la serie exponencial y dos expresiones de la misma que son válidas cuando x es pequeño:
La expresión del medio (la que tiene O ( x 3 )) significa que el valor absoluto del error e x − (1 + x + x 2 /2) es como máximo algunas veces constantes | x 3 | cuando x está lo suficientemente cerca de 0.
Si la función f puede escribirse como una suma finita de otras funciones, entonces la que crece más rápidamente determina el orden de f ( n ) . Por ejemplo,
En particular, si una función puede estar acotada por un polinomio en n , entonces, como n tiende a infinito , se pueden ignorar los términos de orden inferior del polinomio. Los conjuntos O ( n c ) y O ( c n ) son muy diferentes. Si c es mayor que uno, entonces este último crece mucho más rápido. Una función que crece más rápido que n c para cualquier c se llama superpolinomio . Una que crece más lentamente que cualquier función exponencial de la forma c n se llama subexponencial . Un algoritmo puede requerir tiempo que sea tanto superpolinomio como subexponencial; ejemplos de esto incluyen los algoritmos más rápidos conocidos para la factorización de números enteros y la función n log n .
Podemos ignorar cualquier potencia de n dentro de los logaritmos. El conjunto O (log n ) es exactamente el mismo que O (log( n c )) . Los logaritmos difieren solo por un factor constante (ya que log( n c ) = c log n ) y, por lo tanto, la notación O grande ignora eso. De manera similar, los logaritmos con diferentes bases constantes son equivalentes. Por otro lado, los exponenciales con diferentes bases no son del mismo orden. Por ejemplo, 2 n y 3 n no son del mismo orden.
Cambiar las unidades puede afectar o no el orden del algoritmo resultante. Cambiar las unidades es equivalente a multiplicar la variable apropiada por una constante donde sea que aparezca. Por ejemplo, si un algoritmo se ejecuta en el orden de n 2 , reemplazar n por cn significa que el algoritmo se ejecuta en el orden de c 2 n 2 , y la notación O grande ignora la constante c 2 . Esto se puede escribir como c 2 n 2 = O( n 2 ) . Sin embargo, si un algoritmo se ejecuta en el orden de 2 n , reemplazar n por cn da 2 cn = (2 c ) n . Esto no es equivalente a 2 n en general. Cambiar las variables también puede afectar el orden del algoritmo resultante. Por ejemplo, si el tiempo de ejecución de un algoritmo es O ( n ) cuando se mide en términos de la cantidad n de dígitos de un número de entrada x , entonces su tiempo de ejecución es O (log x ) cuando se mide como una función del número de entrada x en sí, porque n = O (log x ) .
Si y entonces . Se sigue que si y entonces . En otras palabras, esta segunda afirmación dice que es un cono convexo .
Sea k una constante distinta de cero. Entonces . En otras palabras, si , entonces
La O mayúscula (y la o minúscula, Ω, etc.) también se puede utilizar con múltiples variables. Para definir la O mayúscula formalmente para múltiples variables, supongamos que y son dos funciones definidas en algún subconjunto de . Decimos
si y sólo si existen constantes y tales que para todos con para algunos [7] De manera equivalente, la condición de que para algunos puede escribirse , donde denota la norma de Chebyshev . Por ejemplo, la afirmación
afirma que existen constantes C y M tales que
siempre que se cumpla o . Esta definición permite que todas las coordenadas de aumenten hasta el infinito. En particular, la afirmación
(es decir, ) es bastante diferente de
(es decir, ).
Según esta definición, el subconjunto en el que se define una función es significativo al generalizar enunciados del contexto univariante al contexto multivariante. Por ejemplo, si y , entonces si restringimos y a , pero no si están definidos en .
Esta no es la única generalización de O grande a funciones multivariadas y, en la práctica, existe cierta inconsistencia en la elección de la definición. [8]
La afirmación " f ( x ) es O [ g ( x ) ] ", tal como se definió anteriormente, se escribe generalmente como f ( x ) = O [ g ( x ) ] . Algunos consideran que esto es un abuso de notación , ya que el uso del signo igual podría ser engañoso, ya que sugiere una simetría que esta afirmación no tiene. Como dice de Bruijn , O [ x ] = O [ x 2 ] es verdadera, pero O [ x 2 ] = O [ x ] no lo es. [9] Knuth describe tales afirmaciones como "igualdades unidireccionales", ya que si los lados pudieran invertirse, "podríamos deducir cosas ridículas como n = n 2 a partir de las identidades n = O [ n 2 ] y n 2 = O [ n 2 ] ". [10] En otra carta, Knuth también señaló que
Por estas razones, sería más preciso utilizar la notación de conjuntos y escribir f ( x ) ∈ O [ g ( x ) ] (que se lee como: " f ( x ) es un elemento de O [ g ( x ) ] ", o " f ( x ) está en el conjunto O [ g ( x ) ] "), pensando en O [ g ( x ) ] como la clase de todas las funciones h ( x ) tales que | h ( x ) | ≤ C | g ( x ) | para algún número real positivo C . [10] Sin embargo, el uso del signo igual es habitual. [9] [10]
La notación O grande también se puede utilizar junto con otros operadores aritméticos en ecuaciones más complicadas. Por ejemplo, h ( x ) + O ( f ( x )) denota la colección de funciones que tienen el crecimiento de h ( x ) más una parte cuyo crecimiento está limitado al de f ( x ). Por lo tanto,
expresa lo mismo que
Supongamos que se está desarrollando un algoritmo para operar sobre un conjunto de n elementos. Sus desarrolladores están interesados en encontrar una función T ( n ) que exprese cuánto tiempo tardará en ejecutarse el algoritmo (en alguna medida arbitraria de tiempo) en términos del número de elementos en el conjunto de entrada. El algoritmo funciona llamando primero a una subrutina para ordenar los elementos del conjunto y luego realizar sus propias operaciones. La ordenación tiene una complejidad temporal conocida de O ( n 2 ), y después de que se ejecuta la subrutina, el algoritmo debe realizar 55 n 3 + 2 n + 10 pasos adicionales antes de terminar. Por lo tanto, la complejidad temporal total del algoritmo se puede expresar como T ( n ) = 55 n 3 + O ( n 2 ) . Aquí los términos 2 n + 10 se subsumen dentro del O ( n 2 ) de crecimiento más rápido. Nuevamente, este uso ignora parte del significado formal del símbolo "=", pero permite utilizar la notación O grande como una especie de marcador de posición conveniente.
En un uso más complicado, O (·) puede aparecer en diferentes lugares en una ecuación, incluso varias veces en cada lado. Por ejemplo, lo siguiente es cierto para : El significado de tales afirmaciones es el siguiente: para cualquier función que satisfaga cada O (·) en el lado izquierdo, hay algunas funciones que satisfacen cada O (·) en el lado derecho, de modo que al sustituir todas estas funciones en la ecuación los dos lados son iguales. Por ejemplo, la tercera ecuación anterior significa: "Para cualquier función f ( n ) = O (1), hay alguna función g ( n ) = O ( e n ) tal que n f ( n ) = g ( n )". En términos de la "notación de conjuntos" anterior, el significado es que la clase de funciones representadas por el lado izquierdo es un subconjunto de la clase de funciones representadas por el lado derecho. En este uso, el "=" es un símbolo formal que, a diferencia del uso habitual de "=", no es una relación simétrica . Así, por ejemplo, n O (1) = O ( e n ) no implica la afirmación falsa O ( e n ) = n O (1) .
La O grande se escribe como una "O" mayúscula en cursiva, como en el siguiente ejemplo: . [12] [13] En TeX , se produce simplemente escribiendo O dentro del modo matemático. A diferencia de las notaciones de Bachmann–Landau con nombre griego, no necesita un símbolo especial. Sin embargo, algunos autores usan la variante caligráfica en su lugar. [14] [15]
A continuación se incluye una lista de clases de funciones que se encuentran comúnmente al analizar el tiempo de ejecución de un algoritmo. En cada caso, c es una constante positiva y n aumenta sin límite. Las funciones de crecimiento más lento generalmente se enumeran primero.
El enunciado se debilita a veces para derivar fórmulas más simples para la complejidad asintótica. Para cualquier y , es un subconjunto de para cualquier , por lo que puede considerarse como un polinomio con un orden mayor.
La notación O grande se utiliza ampliamente en informática. Junto con otras notaciones relacionadas, forma la familia de notaciones de Bachmann-Landau. [ cita requerida ]
Intuitivamente, la afirmación " f ( x ) es o ( g ( x )) " (léase " f ( x ) es un poquito de g ( x ) " o " f ( x ) es de orden inferior a g ( x ) ") significa que g ( x ) crece mucho más rápido que f ( x ) o, equivalentemente, f ( x ) crece mucho más lento que g ( x ) . Como antes, sea f una función real o compleja y g una función real, ambas definidas en algún subconjunto no acotado de los números reales positivos , de modo que g ( x ) sea estrictamente positivo para todos los valores suficientemente grandes de x . Se escribe
si para cada constante positiva ε existe una constante tal que
Por ejemplo, uno tiene
La diferencia entre la definición de la notación O grande y la definición de O pequeña es que mientras que la primera tiene que ser verdadera para al menos una constante M , la segunda debe cumplirse para cada constante positiva ε , por pequeña que sea. [17] De esta manera, la notación O pequeña hace una declaración más fuerte que la notación O grande correspondiente: cada función que es O pequeña de g también es O grande de g , pero no cada función que es O grande de g es O pequeña de g . Por ejemplo, pero .
Si g ( x ) es distinto de cero, o al menos se vuelve distinto de cero más allá de cierto punto, la relación es equivalente a
Little-o respeta una serie de operaciones aritméticas. Por ejemplo,
También satisface una relación de transitividad :
Otra notación asintótica es , que se lee "omega grande". [18] Hay dos definiciones generalizadas e incompatibles de la afirmación
donde a es un número real, o , donde f y g son funciones reales definidas en un entorno de a , y donde g es positivo en este entorno.
La definición de Hardy-Littlewood se utiliza principalmente en la teoría analítica de números , y la definición de Knuth principalmente en la teoría de la complejidad computacional ; las definiciones no son equivalentes.
En 1914, GH Hardy y JE Littlewood introdujeron el nuevo símbolo [19] que se define de la siguiente manera:
Así es la negación de
En 1916 los mismos autores introdujeron los dos nuevos símbolos y los definieron como: [20]
Estos símbolos fueron utilizados por E. Landau , con los mismos significados, en 1924. [21] Los autores que siguieron a Landau, sin embargo, utilizan una notación diferente para las mismas definiciones: [ cita requerida ] El símbolo ha sido reemplazado por la notación actual con la misma definición y se convirtió en
Estos tres símbolos , así como (lo que significa que y se satisfacen ambos), se utilizan actualmente en la teoría analítica de números . [22] [23]
Tenemos
y más precisamente
Tenemos
y más precisamente
sin embargo
En 1976, Donald Knuth publicó un artículo para justificar su uso del símbolo -para describir una propiedad más fuerte. [24] Knuth escribió: "Para todas las aplicaciones que he visto hasta ahora en informática, un requisito más fuerte... es mucho más apropiado". Definió
con el comentario: "Aunque he cambiado la definición de Hardy y Littlewood de , me siento justificado en hacerlo porque su definición no es de ninguna manera de uso amplio, y porque hay otras formas de decir lo que quieren decir en los casos comparativamente raros en que se aplica su definición". [24]
Las definiciones de límite suponen que es suficientemente grande . La tabla está (parcialmente) ordenada del más pequeño al más grande, en el sentido de que (la versión de Knuth de) en funciones corresponde a en la línea real [27] (la versión de Hardy–Littlewood de , sin embargo, no corresponde a ninguna descripción de este tipo).
La informática utiliza las notaciones big , big Theta , little , little omega y la notación big Omega de Knuth . [28] La teoría analítica de números a menudo utiliza las notaciones big , small , Hardy's , [29] Hardy–Littlewood big Omega (con o sin los subíndices +, − o ±) y . [22] La notación small omega no se utiliza tan a menudo en el análisis. [30]
De manera informal, especialmente en informática, la notación O grande a menudo se puede usar de manera algo diferente para describir un límite asintótico estricto , donde el uso de la notación Theta grande Θ podría ser más apropiado en un contexto dado. [31] Por ejemplo, al considerar una función T ( n ) = 73 n 3 + 22 n 2 + 58, todas las siguientes son generalmente aceptables, pero los límites más estrictos (como los números 2 y 3 a continuación) generalmente se prefieren fuertemente sobre los límites más flexibles (como el número 1 a continuación).
Las afirmaciones equivalentes en inglés son respectivamente:
Por lo tanto, si bien las tres afirmaciones son verdaderas, cada vez se incluye más información en cada una de ellas. Sin embargo, en algunos campos, la notación O mayúscula (número 2 en las listas anteriores) se usaría con más frecuencia que la notación Theta mayúscula (elementos numerados 3 en las listas anteriores). Por ejemplo, si T ( n ) representa el tiempo de ejecución de un algoritmo recientemente desarrollado para un tamaño de entrada n , los inventores y usuarios del algoritmo podrían estar más inclinados a establecer un límite asintótico superior sobre cuánto tiempo tomará ejecutarse sin hacer una declaración explícita sobre el límite asintótico inferior.
En su libro Introducción a los algoritmos , Cormen , Leiserson , Rivest y Stein consideran el conjunto de funciones f que satisfacen
En una notación correcta, este conjunto puede, por ejemplo, llamarse O ( g ), donde
[32]
Los autores afirman que el uso del operador de igualdad (=) para denotar la pertenencia a un conjunto en lugar del operador de pertenencia a un conjunto (∈) es un abuso de la notación, pero que hacerlo tiene ventajas. [6] Dentro de una ecuación o desigualdad, el uso de la notación asintótica representa una función anónima en el conjunto O ( g ), que elimina los términos de orden inferior y ayuda a reducir el desorden innecesario en las ecuaciones, por ejemplo: [33]
Otra notación que a veces se utiliza en informática es Õ (léase soft-O ), que oculta factores polilogarítmicos. Hay dos definiciones en uso: algunos autores utilizan f ( n ) = Õ ( g ( n )) como abreviatura de f ( n ) = O ( g ( n ) log k n ) para algún k , mientras que otros la utilizan como abreviatura de f ( n ) = O ( g ( n ) log k g ( n )) . [34] Cuando g ( n ) es polinomial en n , no hay diferencia; sin embargo, la última definición permite decir, por ejemplo, que mientras que la primera definición permite para cualquier constante k . Algunos autores escriben O * con el mismo propósito que la última definición. [35] Básicamente, se trata de una notación O grande , que ignora los factores logarítmicos porque los efectos de la tasa de crecimiento de alguna otra función superlogarítmica indican una explosión de la tasa de crecimiento para parámetros de entrada de gran tamaño que es más importante para predecir un mal rendimiento en tiempo de ejecución que los efectos de punto más fino aportados por el factor o factores de crecimiento logarítmico. Esta notación se utiliza a menudo para obviar la "critica" dentro de las tasas de crecimiento que se indican como demasiado estrechamente limitadas para los asuntos en cuestión (ya que log k n es siempre o ( n ε ) para cualquier constante k y cualquier ε > 0 ).
Además, la notación L , definida como
es conveniente para funciones que están entre polinómicas y exponenciales en términos de .
La generalización a funciones que toman valores en cualquier espacio vectorial normado es sencilla (reemplazando valores absolutos por normas), donde f y g no necesitan tomar sus valores en el mismo espacio. También es posible una generalización a funciones g que toman valores en cualquier grupo topológico [ cita requerida ] . El "proceso limitante" x → x o también puede generalizarse introduciendo una base de filtro arbitraria, es decir, a redes dirigidas f y g . La notación o puede usarse para definir derivadas y diferenciabilidad en espacios bastante generales, y también equivalencia (asintótica) de funciones,
que es una relación de equivalencia y una noción más restrictiva que la relación " f es Θ( g )" de arriba. (Se reduce a lim f / g = 1 si f y g son funciones reales positivas). Por ejemplo, 2 x es Θ( x ), pero 2 x − x no es o ( x ).
El símbolo O fue introducido por primera vez por el teórico de números Paul Bachmann en 1894, en el segundo volumen de su libro Analytische Zahlentheorie (" teoría analítica de números "). [1] El teórico de números Edmund Landau lo adoptó, y así se inspiró para introducir en 1909 la notación o; [2] por lo que ahora ambos se llaman símbolos de Landau. Estas notaciones se utilizaron en matemáticas aplicadas durante la década de 1950 para el análisis asintótico. [36] El símbolo (en el sentido de "no es una o de") fue introducido en 1914 por Hardy y Littlewood. [19] Hardy y Littlewood también introdujeron en 1916 los símbolos ("derecha") e ("izquierda"), [20] precursores de los símbolos modernos ("no es menor que una o minúscula de") y ("no es mayor que una o minúscula de"). Por lo tanto, los símbolos Omega (con sus significados originales) a veces también se denominan "símbolos de Landau". Esta notación se empezó a utilizar comúnmente en la teoría de números al menos desde la década de 1950. [37]
El símbolo , aunque había sido usado antes con diferentes significados, [27] recibió su definición moderna por Landau en 1909 [38] y por Hardy en 1910. [39] Justo arriba en la misma página de su tratado Hardy definió el símbolo , donde significa que tanto como se satisfacen. La notación todavía se usa actualmente en la teoría analítica de números. [40] [29] En su tratado Hardy también propuso el símbolo , donde significa que para alguna constante .
En la década de 1970, la gran O fue popularizada en la ciencia informática por Donald Knuth , quien propuso una notación diferente para Hardy y propuso una definición diferente para la notación Omega de Hardy y Littlewood. [24]
Otros dos símbolos acuñados por Hardy fueron (en términos de la notación O moderna)
(Sin embargo, Hardy nunca definió ni utilizó la notación , ni , como se ha informado a veces). Hardy introdujo los símbolos y (así como los otros símbolos ya mencionados) en su tratado de 1910 "Órdenes del infinito", y los utilizó solo en tres artículos (1910-1913). En sus casi 400 artículos y libros restantes utilizó sistemáticamente los símbolos de Landau O y o.
Los símbolos de Hardy y (así como ) ya no se utilizan. Por otro lado, en la década de 1930, [41] el teórico de números ruso Ivan Matveyevich Vinogradov introdujo su notación , que se ha utilizado cada vez más en la teoría de números en lugar de la notación . Tenemos
y con frecuencia se utilizan ambas notaciones en el mismo artículo.
La O mayúscula originalmente significaba "orden de" ("Ordnung", Bachmann 1894), y por lo tanto es una letra latina. Ni Bachmann ni Landau la llamaron nunca "ómicron". Mucho más tarde (1976) Knuth consideró que el símbolo era un ómicron mayúscula , [24] probablemente en referencia a su definición del símbolo Omega . El dígito cero no debería utilizarse.
Como θ ( g ( n )) es un conjunto, podríamos escribir " f ( n ) ∈ θ ( g ( n ))" para indicar que f ( n ) es un miembro de θ ( g ( n )). En cambio, normalmente escribiremos f ( n ) = θ ( g ( n )) para expresar la misma noción. Puede que te confundas porque abusamos de la igualdad de esta manera, pero veremos más adelante en esta sección que hacerlo tiene sus ventajas.
Cuando sólo tenemos un límite superior asintótico, utilizamos la notación O. Para una función dada g ( n ), denotamos por O ( g ( n )) (pronunciado "oh grande de g de n " o a veces simplemente "oh de g de n ") el conjunto de funciones O ( g ( n )) = { f ( n ) : existen constantes positivas c y n 0 tales que 0 ≤ f ( n ) ≤ cg ( n ) para todo n ≥ n 0 }
Cuando la notación asintótica aparece sola (es decir, no dentro de una fórmula mayor) en el lado derecho de una ecuación (o desigualdad), como en n = O(n 2 ), ya hemos definido el signo igual para significar pertenencia al conjunto: n ∈ O(n 2 ). En general, sin embargo, cuando la notación asintótica aparece en una fórmula, la interpretamos como que representa alguna función anónima que no nos importa nombrar. Por ejemplo, la fórmula 2 n 2 + 3 n + 1 = 2 n 2 + θ ( n ) significa que 2 n 2 + 3 n + 1 = 2 n 2 + f ( n ), donde f ( n ) es alguna función en el conjunto θ ( n ). En este caso, dejamos que f ( n ) = 3 n + 1, que de hecho está en θ ( n ). El uso de la notación asintótica de esta manera puede ayudar a eliminar detalles innecesarios y desorden en una ecuación.