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?
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?
Respuestas:
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.
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 def(x)
asintóticamente es menor o igual que la tasa de crecimiento deg(x)
.
f(x) = Ω(g(x))
(big-omega) significa que la tasa de crecimiento def(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 def(x)
es asintóticamente menor que la tasa de crecimiento deg(x)
.
f(x) = ω(g(x))
(little-omega) significa que la tasa de crecimiento def(x)
es asintóticamente mayor que la tasa de crecimiento deg(x)
f(x) = Θ(g(x))
(theta) significa que la tasa de crecimiento def(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.
>= \Omega(...)
significa Entiendo si decimos que es miembro de \Omega(...)
, pero si es mayor que eso? ¿Qué sentido tiene?
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.
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 ...
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(...)
n
tiempos. 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);
}
Θ(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).
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 q
y 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.).
Un cuadro podría facilitar la comprensión de las respuestas anteriores:
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 ).
f(n)
pertenece a O(n)
si existe positivo k
comof(n)<=k*n
f(n)
pertenece a Θ(n)
si existe positivo k1
, k2
comok1*n<=f(n)<=k2*n
Consideremos f(n) > 0
y g(n) > 0
para 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)|
).
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)) ∞
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
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.