Qual é a diferença entre Θ (n) e O (n)?


427

À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?


8
Não é óbvio, mas esta pergunta é uma duplicata deste stackoverflow.com/questions/464078/… de ontem.
Bill o Lagarto

Respostas:


600

Breve explicação:

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.


Mais tecnicamente:

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 de f(x)é assintoticamente menor ou igual à taxa de crescimento de g(x).

f(x) = Ω(g(x))(ômega grande) significa que a taxa de crescimento de f(x)é assintoticamente maior ou igual à taxa de crescimento deg(x)

f(x) = o(g(x))(pouco-oh) significa que a taxa de crescimento de f(x)é assintoticamente menor que a taxa de crescimento de g(x).

f(x) = ω(g(x))(ômega-pequeno) significa que a taxa de crescimento de f(x)é assintoticamente maior que a taxa de crescimento deg(x)

f(x) = Θ(g(x))(teta) significa que a taxa de crescimento de f(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.


1
Se "Se um algoritmo é de O (g (n)), significa que o tempo de execução do algoritmo à medida que n se torna maior é no máximo proporcional a g (n)." Então, como você diz que "Basicamente, quando dizemos que um algoritmo é O (n), também é O (n2), O (n1000000), O (2n)"?
precisa saber é o seguinte

@ Andy897 Segue-se da definição de "proporcional". Da Wikipedia: "Em matemática, duas variáveis ​​são proporcionais se uma mudança em uma é sempre acompanhada por uma mudança na outra, e se as mudanças são sempre relacionadas pelo uso de um multiplicador constante. A constante é chamada de coeficiente de proporcionalidade ou proporcionalidade. constante."
Mehrdad Afshari

O que >= \Omega(...)significa isso ? Entendo se dissermos que é membro \Omega(...), mas se for maior que isso? Que sentido isso faz?
Johannes Schaub - litb

328

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.


5
Eu geralmente nunca vou abaixo de 3-4 respostas em qualquer pergunta. Valeu a pena a viagem. Obrigado por compartilhar o truque. : D
impossível

56

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 ....


20
Mas está errado! O número de etapas é delimitado acima por n ^ 2 à medida que n se torna muito grande. No entanto, um algoritmo executado em etapas n ^ 2 + c executa mais que n ^ 2 etapas, mas ainda é O (n ^ 2). A notação Big-O descreve apenas o comportamento assintótico .
HenryR

1
Este não é um fim, tudo será tudo definição. É apenas um ponto de partida ... Já que estamos falando de notações assintóticas quando n se aproxima do infinito. A constante C se torna um não fator.
l_39217_l

1
Embora eu goste da simplicidade desta resposta, deve-se notar que um algoritmo O (n ^ 2) pode muito bem levar 1.000.000.000 * n ^ 2 etapas para executar, o que certamente é muito maior que n ^ 2. Um algoritmo sendo O (n ^ 2) significa apenas que não será necessário mais que k * n ^ 2 etapas para executar, onde k é um número real positivo.
MarredCheese

38

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(...) nvezes. 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);
}

O que você quer dizer com "tempo de execução assintótico"?
usar o seguinte código

1
Assintótico, neste contexto, significa "para n suficientemente grande". O tempo de execução do fragmento de código cujo tempo de execução assintótico é Θ(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).
Kara deniz

11

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 qe 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.).


11

Um gráfico pode facilitar a compreensão das respostas anteriores:

Notação Same - mesma ordem | Notação O - Limite superior

Θ (n) - mesma ordem O (n) - Limite superior

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 ).


Você estragou as palavras e gráficos.
22418 kushalvm

@kushalvm, obrigado por sua honestidade. Você poderia gentilmente explicar o que você quer dizer especificamente? Pelo bem do meu aprendizado e de outros que possam se confundir com esta resposta. :-)
Ricardo

A última linha do último parágrafo não deveria ser f (n) é o teta de g (n)?
precisa saber é

@kushalvm, obrigado por esclarecer. Alterei o texto da última linha do parágrafo antes da última para corrigir meu erro de inglês.
Ricardo

veja mais sobre a pronúncia
Ricardo


3

Usando limites

Vamos considerar f(n) > 0e g(n) > 0para 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)|).

  1. 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))                 ∞
    
  2. 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
    

2

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.


Por que este conteúdo está formatado como uma cotação? É uma citação de uma fonte externa? Nesse caso, a fonte deve estar vinculada ou identificada. Caso contrário, a formatação da cotação deve ser removida.
Mark Amery
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.