¿Cuál es la diferencia entre Θ (n) y O (n)?


427

A veces veo Θ (n) con el extraño símbolo Θ con algo en el medio, y a veces solo O (n). ¿Es solo la pereza de escribir porque nadie sabe cómo escribir este símbolo, o significa algo diferente?


8
No es obvio, pero esta pregunta es un duplicado de esta stackoverflow.com/questions/464078/… de ayer.
Bill the Lizard

Respuestas:


600

Breve explicación:

Si un algoritmo es de Θ (g (n)), significa que el tiempo de ejecución del algoritmo a medida que n (tamaño de entrada) aumenta es proporcional a g (n).

Si un algoritmo es de O (g (n)), significa que el tiempo de ejecución del algoritmo a medida que n aumenta es, como máximo, proporcional a g (n).

Normalmente, incluso cuando las personas hablan de O (g (n)) en realidad quieren decir Θ (g (n)) pero técnicamente, hay una diferencia.


Más técnicamente:

O (n) representa el límite superior. Θ (n) significa límite apretado. Ω (n) representa el límite inferior.

f (x) = Θ (g (x)) iff f (x) = O (g (x)) yf (x) = Ω (g (x))

Básicamente, cuando decimos que un algoritmo es de O (n), también es O (n 2 ), O (n 1000000 ), O (2 n ), ... pero un algoritmo Θ (n) no es Θ (n 2 ) .

De hecho, dado que f (n) = Θ (g (n)) significa valores suficientemente grandes de n, f (n) puede vincularse dentro de c 1 g (n) y c 2 g (n) para algunos valores de c 1 y c 2 , es decir, la tasa de crecimiento de f es asintóticamente igual a g: g puede ser un límite inferior y y un límite superior de f. Esto implica directamente que f puede ser un límite inferior y también un límite superior de g. Por consiguiente,

f (x) = Θ (g (x)) iff g (x) = Θ (f (x))

De manera similar, para mostrar f (n) = Θ (g (n)), es suficiente mostrar que g es un límite superior de f (es decir, f (n) = O (g (n))) yf es un límite inferior de g (es decir, f (n) = Ω (g (n)), que es exactamente lo mismo que g (n) = O (f (n))). Concisamente

f (x) = Θ (g (x)) iff f (x) = O (g (x)) y g (x) = O (f (x))


También hay ωanotaciones little-oh y little-omega ( ) que representan los límites superiores e inferiores sueltos de una función.

Para resumir:

f(x) = O(g(x))(big-oh) significa que la tasa de crecimiento de f(x)asintóticamente es menor o igual que la tasa de crecimiento de g(x).

f(x) = Ω(g(x))(big-omega) significa que la tasa de crecimiento de f(x)asintóticamente es mayor o igual que la tasa de crecimiento deg(x)

f(x) = o(g(x))(little-oh) significa que la tasa de crecimiento de f(x)es asintóticamente menor que la tasa de crecimiento de g(x).

f(x) = ω(g(x))(little-omega) significa que la tasa de crecimiento de f(x)es asintóticamente mayor que la tasa de crecimiento deg(x)

f(x) = Θ(g(x))(theta) significa que la tasa de crecimiento de f(x)es asintóticamente igual a la tasa de crecimiento deg(x)

Para una discusión más detallada, puede leer la definición en Wikipedia o consultar un libro de texto clásico como Introducción a los algoritmos de Cormen et al.


1
Si "Si un algoritmo es de O (g (n)), significa que el tiempo de ejecución del algoritmo a medida que n aumenta es como máximo proporcional a g (n)". Entonces, ¿cómo se dice que "Básicamente cuando decimos que un algoritmo es de O (n), también es O (n2), O (n1000000), O (2n)"?
Andy897

@ Andy897 Se deduce de la definición de "proporcional". De Wikipedia: "En matemáticas, dos variables son proporcionales si un cambio en uno siempre va acompañado de un cambio en el otro, y si los cambios siempre están relacionados mediante el uso de un multiplicador constante. La constante se llama coeficiente de proporcionalidad o proporcionalidad constante."
Mehrdad Afshari

Que >= \Omega(...)significa Entiendo si decimos que es miembro de \Omega(...), pero si es mayor que eso? ¿Qué sentido tiene?
Johannes Schaub - litb

328

Hay una manera simple (un truco, supongo) para recordar qué notación significa qué.

Se puede considerar que todas las anotaciones Big-O tienen una barra.

Al mirar un Ω, la barra está en la parte inferior, por lo que es un límite inferior (asintótico).

Al mirar un Θ, la barra está obviamente en el medio. Por lo tanto, es un límite apretado (asintótico).

Al escribir O, generalmente termina en la parte superior y dibuja un garabato. Por lo tanto, O (n) es el límite superior de la función. Para ser justos, este no funciona con la mayoría de las fuentes, pero es la justificación original de los nombres.


55
Por lo general, nunca voy por debajo de 3-4 respuestas en ninguna pregunta. Esto valió la pena el viaje. Gracias por compartir el truco. : D
imposible

56

uno es "O" grande

uno es Big Theta

http://en.wikipedia.org/wiki/Big_O_notation

Big O significa que su algoritmo se ejecutará en no más pasos que en la expresión dada (n ^ 2)

Big Omega significa que su algoritmo se ejecutará en no menos pasos que en la expresión dada (n ^ 2)

Cuando ambas condiciones son verdaderas para la misma expresión, puede usar la notación theta grande ...


20
Pero está mal! El número de pasos está limitado anteriormente por n ^ 2 ya que n se hace muy grande. Sin embargo, un algoritmo que se ejecuta en n ^ 2 + c pasos requiere más de n ^ 2 pasos, pero sigue siendo O (n ^ 2). La notación Big-O solo describe el comportamiento asintótico .
HenryR

1
Este no es un fin, todo será definición. Es solo un punto de partida ... Ya que estamos hablando de notaciones asintóticas cuando n se acerca al infinito. La constante C se convierte en un no factor.
l_39217_l

1
Si bien me gusta la simplicidad de esta respuesta, debe tenerse en cuenta que un algoritmo O (n ^ 2) bien podría tomar 1,000,000,000 * n ^ 2 pasos para ejecutarse, lo que ciertamente es mucho más grande que n ^ 2. Un algoritmo que sea O (n ^ 2) solo significa que no tomará más de k * n ^ 2 pasos para ejecutarse, donde k es un número real positivo.
MarredCheese

38

En lugar de proporcionar una definición teórica, que ya se resumen maravillosamente aquí, daré un ejemplo simple:

Suponga que el tiempo de ejecución de f(i)es O(1). A continuación se muestra un fragmento de código cuyo tiempo de ejecución asintótico es Θ(n). Es siempre llama a la función f(...) ntiempos. Tanto el límite inferior como el superior es n.

for(int i=0; i<n; i++){
    f(i);
}

El segundo fragmento de código a continuación tiene el tiempo de ejecución asintótico de O(n). Llama a la función la f(...) mayoría de las n veces. El límite superior es n, pero el límite inferior podría ser Ω(1)o Ω(log(n)), dependiendo de lo que ocurra dentro f2(i).

for(int i=0; i<n; i++){
    if( f2(i) ) break;
    f(i);
}

¿Qué quieres decir con "tiempo de ejecución asintótico"?
chopper draw lion4

1
Asintótico en este contexto significa "para n lo suficientemente grande". El tiempo de ejecución del fragmento de código cuyo tiempo de ejecución asintótico Θ(n)crecerá linealmente a medida que n aumenta, por ejemplo, el tiempo de ejecución T puede expresarse como T (n) = a * n + b. Para valores pequeños de n (p. Ej., N = 1 o 2), esta puede no ser la mejor manera de describir el comportamiento; quizás tenga algún código de inicialización que tarde mucho más que f (i).
kara deniz

11

Theta es una forma abreviada de referirse a una situación especial donde la gran O y Omega son iguales.

Por lo tanto, si uno reclama The Theta is expression q, entonces también necesariamente están reclamando eso Big O is expression qy Omega is expression q.


Analogía aproximada:

Si: Theta dice: "Ese animal tiene 5 patas". entonces se deduce que: Big O es cierto ("Ese animal tiene menos de o igual a 5 patas") y Omega es cierto ("Ese animal tiene más de o igual a 5 patas").

Es solo una analogía aproximada porque las expresiones no son necesariamente números específicos, sino que funcionan de diferentes órdenes de magnitud, como log (n), n, n ^ 2, (etc.).


11

Un cuadro podría facilitar la comprensión de las respuestas anteriores:

Θ-Notación - Mismo orden | Notación O: límite superior

Θ (n) - Mismo orden O (n) - Límite superior

En inglés,

A la izquierda, observe que hay un límite superior y un límite inferior que son ambos del mismo orden de magnitud (es decir, g (n) ). Ignore las constantes, y si el límite superior y el límite inferior tienen el mismo orden de magnitud, se puede decir válidamente f (n) = Θ (g (n)) o f (n) está en theta grande de g (n) .

Comenzando con la derecha, el ejemplo más simple, es decir que el límite superior g (n) es simplemente el orden de magnitud e ignora la constante c (al igual que toda la notación O grande ).


Has estropeado las palabras y los gráficos.
kushalvm

@kushalvm, gracias por tu honestidad. ¿Podría explicar amablemente qué quiere decir específicamente? Por mi aprendizaje y otros que pueden confundirse con esta respuesta. :-)
Ricardo

¿No debería ser la última línea del último párrafo f (n) es la Theta de g (n)?
kushalvm

@kushalvm, gracias por aclararlo. Cambié el texto de la última línea del párrafo antes del último para corregir mi error en inglés.
Ricardo

ver más sobre la pronunciación
Ricardo


3

Usando límites

Consideremos f(n) > 0y g(n) > 0para todos n. Está bien considerar esto, porque el algoritmo real más rápido tiene al menos una operación y completa su ejecución después del inicio. Esto simplificará el cálculo, porque podemos usar el valor ( f(n)) en lugar del valor absoluto ( |f(n)|).

  1. f(n) = O(g(n))

    General:

              f(n)     
    0 ≤ lim ──────── < ∞
        n➜∞   g(n)
    

    Para g(n) = n:

              f(n)     
    0 ≤ lim ──────── < ∞
        n➜∞    n
    

    Ejemplos:

        Expression               Value of the limit
    ------------------------------------------------
    n        = O(n)                      1
    1/2*n    = O(n)                     1/2
    2*n      = O(n)                      2
    n+log(n) = O(n)                      1
    n        = O(n*log(n))               0
    n        = O(n²)                     0
    n        = O(nⁿ)                     0
    

    Contraejemplos:

        Expression                Value of the limit
    -------------------------------------------------
    n        ≠ O(log(n))                 ∞
    1/2*n    ≠ O(sqrt(n))                ∞
    2*n      ≠ O(1)                      ∞
    n+log(n) ≠ O(log(n))                 ∞
    
  2. f(n) = Θ(g(n))

    General:

              f(n)     
    0 < lim ──────── < ∞
        n➜∞   g(n)
    

    Para g(n) = n:

              f(n)     
    0 < lim ──────── < ∞
        n➜∞    n
    

    Ejemplos:

        Expression               Value of the limit
    ------------------------------------------------
    n        = Θ(n)                      1
    1/2*n    = Θ(n)                     1/2
    2*n      = Θ(n)                      2
    n+log(n) = Θ(n)                      1
    

    Contraejemplos:

        Expression                Value of the limit
    -------------------------------------------------
    n        ≠ Θ(log(n))                 ∞
    1/2*n    ≠ Θ(sqrt(n))                ∞
    2*n      ≠ Θ(1)                      ∞
    n+log(n) ≠ Θ(log(n))                 ∞
    n        ≠ Θ(n*log(n))               0
    n        ≠ Θ(n²)                     0
    n        ≠ Θ(nⁿ)                     0
    

2

Conclusión: consideramos grandes O, grandes θ y grandes Ω como lo mismo.

¿Por qué? Te diré la razón a continuación:

En primer lugar, aclararé una afirmación incorrecta, algunas personas piensan que solo nos importa la peor complejidad de tiempo, por lo que siempre usamos O grande en lugar de big grande. Diré que este hombre es una tontería. Los límites superior e inferior se usan para describir una función, no para describir la complejidad del tiempo. La función de peor tiempo tiene su límite superior e inferior; la mejor función de tiempo también tiene su límite superior e inferior.

Para explicar claramente la relación entre O grande y θ grande, explicaré primero la relación entre O grande y O pequeño. A partir de la definición, podemos saber fácilmente que una o pequeña es un subconjunto de una gran O. Por ejemplo:

T (n) = n ^ 2 + n, podemos decir T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4). Pero para la pequeña o, T (n) = o (n ^ 2) no cumple con la definición de pequeña o. Entonces, solo T (n) = o (n ^ 3), T (n) = o (n ^ 4) son correctos para o pequeño. El redundante T (n) = O (n ^ 2) es qué? Es grande θ!

Generalmente, decimos que O grande es O (n ^ 2), difícilmente decir T (n) = O (n ^ 3), T (n) = O (n ^ 4). ¿Por qué? Porque consideramos a la gran O como grande θ inconscientemente.

Del mismo modo, también consideramos grandes Ω como grandes θ inconscientemente.

En una palabra, grandes O, grandes θ y grandes Ω no son lo mismo de las definiciones, pero son lo mismo en nuestra boca y cerebro.


¿Por qué este contenido está formateado como una cita? ¿ Es una cita de una fuente externa? Si es así, la fuente debe estar vinculada o identificada de otra manera. De lo contrario, el formato de presupuesto debe eliminarse.
Mark Amery
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.