Às vezes vejo Θ (n) com o símbolo Θ estranho com algo no meio, e às vezes apenas O (n). É apenas preguiça de digitar, porque ninguém sabe como digitar esse símbolo ou significa algo diferente?
Às vezes vejo Θ (n) com o símbolo Θ estranho com algo no meio, e às vezes apenas O (n). É apenas preguiça de digitar, porque ninguém sabe como digitar esse símbolo ou significa algo diferente?
Respostas:
Se um algoritmo é de Θ (g (n)), isso significa que o tempo de execução do algoritmo à medida que n (tamanho da entrada) aumenta é proporcional a g (n).
Se um algoritmo é de O (g (n)), significa que o tempo de execução do algoritmo à medida que n aumenta é no máximo proporcional a g (n).
Normalmente, mesmo quando as pessoas falam sobre O (g (n)), elas realmente significam Θ (g (n)), mas tecnicamente, há uma diferença.
O (n) representa o limite superior. Θ (n) significa limite estreito. Ω (n) representa o limite inferior.
f (x) = Θ (g (x)) se f (x) = O (g (x)) ef (x) = Ω (g (x))
Basicamente, quando dizemos que um algoritmo é O (n), também é O (n 2 ), O (n 1000000 ), O (2 n ), ... mas um algoritmo Θ (n) não é Θ (n 2 ) .
De fato, uma vez que f (n) = Θ (g (n)) significa que valores suficientemente grandes de n, f (n) podem ser ligados dentro de c 1 g (n) e c 2 g (n) para alguns valores de c 1 e c 2 , isto é, a taxa de crescimento de f é igual a assintoticamente g: g pode ser um limite inferior e e um limite superior de f. Isso implica diretamente que f pode ser um limite inferior e um limite superior de g também. Consequentemente,
f (x) = Θ (g (x)) se g (x) = Θ (f (x))
Da mesma forma, para mostrar f (n) = Θ (g (n)), basta mostrar que g é um limite superior de f (isto é, f (n) = O (g (n))) ef é um limite inferior de g (isto é, f (n) = Ω (g (n)), que é exatamente a mesma coisa que g (n) = O (f (n))). Conciso,
f (x) = Θ (g (x)) se f (x) = O (g (x)) eg (x) = O (f (x))
Também existem ω
notações oh e omega ( ) que representam limites superiores e inferiores inferiores de uma função.
Para resumir:
f(x) = O(g(x))
(oh grande) significa que a taxa de crescimento def(x)
é assintoticamente menor ou igual à taxa de crescimento deg(x)
.
f(x) = Ω(g(x))
(ômega grande) significa que a taxa de crescimento def(x)
é assintoticamente maior ou igual à taxa de crescimento deg(x)
f(x) = o(g(x))
(pouco-oh) significa que a taxa de crescimento def(x)
é assintoticamente menor que a taxa de crescimento deg(x)
.
f(x) = ω(g(x))
(ômega-pequeno) significa que a taxa de crescimento def(x)
é assintoticamente maior que a taxa de crescimento deg(x)
f(x) = Θ(g(x))
(teta) significa que a taxa de crescimento def(x)
é assintoticamente igual à taxa de crescimento deg(x)
Para uma discussão mais detalhada, você pode ler a definição na Wikipedia ou consultar um livro clássico como Introdução aos Algoritmos, de Cormen et al.
>= \Omega(...)
significa isso ? Entendo se dissermos que é membro \Omega(...)
, mas se for maior que isso? Que sentido isso faz?
Existe uma maneira simples (um truque, eu acho) de lembrar qual notação significa o que.
Todas as notações Big-O podem ser consideradas como tendo uma barra.
Ao olhar para Ω, a barra está na parte inferior, portanto é um limite inferior (assintótico).
Ao olhar para Θ, o bar está obviamente no meio. Portanto, é um limite estreito (assintótico).
Ao escrever O, você geralmente termina no topo e desenha um rabisco. Portanto, O (n) é o limite superior da função. Para ser justo, este não funciona com a maioria das fontes, mas é a justificativa original dos nomes.
um é grande "O"
um é Big Theta
http://en.wikipedia.org/wiki/Big_O_notation
Big O significa que seu algoritmo será executado em não mais etapas do que em determinada expressão (n ^ 2)
Big Omega significa que seu algoritmo será executado em menos etapas do que na expressão fornecida (n ^ 2)
Quando ambas as condições são verdadeiras para a mesma expressão, você pode usar a notação teta grande ....
Em vez de fornecer uma definição teórica, que já está lindamente resumida aqui, darei um exemplo simples:
Suponha que o tempo de execução de f(i)
é O(1)
. Abaixo está um fragmento de código cujo tempo de execução assintótico é Θ(n)
. Ele sempre chama a função f(...)
n
vezes. Tanto o limite inferior quanto o superior são n.
for(int i=0; i<n; i++){
f(i);
}
O segundo fragmento de código abaixo tem o tempo de execução assintótico de O(n)
. Ele chama a função f(...)
na maioria das n
vezes. O limite superior é n, mas o limite inferior pode ser Ω(1)
ou Ω(log(n))
, dependendo do que acontecer dentro f2(i)
.
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}
Θ(n)
aumentado linearmente à medida que n aumenta, por exemplo, o tempo de execução T pode ser expresso como T (n) = a * n + b. Para valores pequenos de n (por exemplo, n = 1 ou 2), essa pode não ser a melhor maneira de descrever o comportamento - talvez você tenha algum código de inicialização que demore muito mais que f (i).
Theta é uma maneira abreviada de se referir a uma situação especial em que o grande O e o Ômega são os mesmos.
Assim, se alguém reivindica The Theta is expression q
, então eles também estão necessariamente reivindicando isso Big O is expression q
e Omega is expression q
.
Analogia aproximada:
Se: Theta afirma: "Esse animal tem 5 patas". segue-se que: Big O é verdadeiro ("Esse animal tem menos que ou igual a 5 pernas.") e Omega é verdadeiro ("Esse animal tem mais que ou igual a 5 pernas".)
É apenas uma analogia grosseira, porque as expressões não são necessariamente números específicos, mas funções de ordens variadas de magnitude, como log (n), n, n ^ 2, (etc.).
Um gráfico pode facilitar a compreensão das respostas anteriores:
Em inglês,
À esquerda, observe que há um limite superior e um inferior que são da mesma ordem de magnitude (ou seja, g (n) ). Ignore as constantes e, se o limite superior e o limite inferior tiverem a mesma ordem de magnitude, pode-se dizer validamente que f (n) = Θ (g (n)) ou f (n) está no grande teta de g (n) .
Começando pelo direito, o exemplo mais simples, ele está dizendo que o limite superior g (n) é simplesmente a ordem de magnitude e ignora a constante c (assim como toda grande notação O ).
f(n)
pertence a O(n)
se existe positivo k
comof(n)<=k*n
f(n)
pertence a Θ(n)
se existe positivo k1
, k2
comok1*n<=f(n)<=k2*n
Vamos considerar f(n) > 0
e g(n) > 0
para todos n
. Não há problema em considerar isso, porque o algoritmo real mais rápido possui pelo menos uma operação e conclui sua execução após o início. Isso simplificará o cálculo, porque podemos usar o valor ( f(n)
) em vez do valor absoluto ( |f(n)|
).
f(n) = O(g(n))
Geral:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ g(n)
Para g(n) = n
:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ n
Exemplos:
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
Contra-exemplos:
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))
Geral:
f(n)
0 < lim ──────── < ∞
n➜∞ g(n)
Para g(n) = n
:
f(n)
0 < lim ──────── < ∞
n➜∞ n
Exemplos:
Expression Value of the limit
------------------------------------------------
n = Θ(n) 1
1/2*n = Θ(n) 1/2
2*n = Θ(n) 2
n+log(n) = Θ(n) 1
Contra-exemplos:
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
Conclusão: consideramos grande O, grande θ e grande Ω como a mesma coisa.
Por quê? Vou dizer o motivo abaixo:
Primeiramente, vou esclarecer uma afirmação errada, algumas pessoas pensam que apenas nos importamos com a pior complexidade de tempo, por isso sempre usamos O grande ao invés de grande θ. Eu vou dizer que esse homem está mentindo. Os limites superior e inferior são usados para descrever uma função, não para descrever a complexidade do tempo. A pior função de tempo tem seu limite superior e inferior; a melhor função de tempo também tem seu limite superior e inferior.
Para explicar claramente a relação entre o grande O e o grande θ, explicarei a relação entre o grande O e o pequeno o primeiro. A partir da definição, podemos saber facilmente que o pequeno é um subconjunto do O grande. Por exemplo:
T (n) = n ^ 2 + n, podemos dizer T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4). Mas para o pequeno o, T (n) = o (n ^ 2) não atende à definição de pequeno o. Portanto, apenas T (n) = o (n ^ 3), T (n) = o (n ^ 4) estão corretos para o pequeno. O redundante T (n) = O (n ^ 2) é o quê? É grande θ!
Geralmente, dizemos que grande O é O (n ^ 2), dificilmente dizendo T (n) = O (n ^ 3), T (n) = O (n ^ 4). Por quê? Porque consideramos grande O como grande θ inconscientemente.
Da mesma forma, também consideramos grande Ω como grande θ inconscientemente.
Em uma palavra, grande O, grande θ e grande Ω não são a mesma coisa das definições, mas são a mesma coisa na nossa boca e cérebro.