Diferença entre a notação Big-O e Little-O


Respostas:


442

f ∈ O (g) diz, essencialmente

Para pelo menos uma escolha de uma constante k > 0, é possível encontrar uma constante a tal que a desigualdade 0 <= f (x) <= kg (x) seja válida para todo x> a.

Observe que O (g) é o conjunto de todas as funções para as quais essa condição é válida.

f ∈ o (g) diz, essencialmente

Para cada escolha de uma constante k > 0, é possível encontrar uma constante a tal que a desigualdade 0 <= f (x) <kg (x) seja válida para todos os x> a.

Mais uma vez, observe que o (g) é um conjunto.

No Big-O, é necessário apenas encontrar um multiplicador específico k para o qual a desigualdade se mantém além de um mínimo de x .

Em Little-o, deve haver um x mínimo, após o qual a desigualdade se mantém, não importa quão pequeno você faça k , desde que não seja negativo ou zero.

Ambos descrevem os limites superiores, embora um pouco contra-intuitivamente, Little-o é a afirmação mais forte. Existe uma diferença muito maior entre as taxas de crescimento de f e g se f f o (g) do que se f ∈ O (g).

Uma ilustração da disparidade é a seguinte: f ∈ O (f) é verdadeiro, mas f ∈ o (f) é falso. Portanto, Big-O pode ser lido como "f ∈ O (g) significa que o crescimento assintótico de f não é mais rápido que g's", enquanto "f ∈ o (g) significa que o crescimento assintótico de f é estritamente mais lento que g's". É como <=versus <.

Mais especificamente, se o valor de g (x) é um múltiplo constante do valor de f (x), então f ∈ O (g) é verdadeiro. É por isso que você pode eliminar constantes ao trabalhar com notação big-O.

No entanto, para que f ∈ o (g) seja verdadeiro, g deve incluir uma potência mais alta de x em sua fórmula e, portanto, a separação relativa entre f (x) eg (x) deve realmente aumentar à medida que x aumenta.

Para usar exemplos puramente matemáticos (em vez de se referir a algoritmos):

O seguinte é verdadeiro para Big-O, mas não seria verdade se você usasse little-o:

  • x² ∈ O (x²)
  • x² ∈ O (x² + x)
  • x² ∈ O (200 * x²)

O seguinte é verdadeiro para little-o:

  • x² ∈ o (x³)
  • x² (o (x!)
  • ln (x) ∈ o (x)

Observe que, se f ∈ o (g), isso implica f ∈ O (g). por exemplo x² ∈ o (x³), portanto, também é verdade que x² ∈ O (x³), (novamente, pense em O como <=e o como <)


146
Sim - a diferença está em se as duas funções podem ser assintoticamente iguais. Intuitivamente, gosto de pensar no significado O-grande "não cresce mais rápido que" (ou seja, cresce na mesma proporção ou mais devagar) e o significado pouco-o "cresce estritamente mais lento que".
— Phil

12
Copie isso para a wikipedia? Isso é muito melhor do que o que está lá.
— cloudsurfin

1
@SA Sim. Esse é um caso mais complicado, onde a regra mais simples que eu dei sobre "poderes mais altos de x" não é obviamente aplicável. Mas se você observar as definições de limites mais rigorosas fornecidas na resposta da Strilanc abaixo, o que você quer saber é se lim n-> inf (2 ^ n / 3 ^ n) = 0. Desde (2 ^ n / 3 ^ n) = (2/3) ^ n e já que para qualquer 0 <= x <1, lim n-> inf (x ^ n) = 0, é verdade que 2 ^ n = o (3 ^ n).
— Tyler McHenry

1
Cuidado com "Em Little-o, deve haver um x mínimo, após o qual a desigualdade se mantém, não importa quão pequeno você faça k, desde que não seja negativo ou zero". Não é "para todo mundo que aexiste k: ...", é "para todo mundo que kexiste aaquilo: ..."
— GA1

1
"Em Little-o, deve haver um x mínimo, após o qual a desigualdade se mantém, não importa quão pequeno você faça k, contanto que não seja negativo ou zero". não, isso está incorreto.
— Filippo Costa

196

Big-O é tão pequeno quanto ≤é <. Big-O é um limite superior inclusivo, enquanto little-o é um limite superior estrito.

Por exemplo, a função f(n) = 3né:

  • na O(n²), o(n²)eO(n)
  • não em O(lg n), o(lg n)ouo(n)

Analogamente, o número 1é:

  • ≤ 2,, < 2e≤ 1
  • não ≤ 0, < 0ou< 1

Aqui está uma tabela, mostrando a ideia geral:

Big o table

(Nota: a tabela é um bom guia, mas sua definição de limite deve ser em termos do limite superior, em vez do limite normal. Por exemplo, 3 + (n mod 2) oscila entre 3 e 4 para sempre. É O(1)apesar de não ter um limite normal, porque ainda tem a lim sup: 4.)

Eu recomendo memorizar como a notação Big-O se converte em comparações assintóticas. As comparações são mais fáceis de lembrar, mas menos flexíveis, porque você não pode dizer coisas como n O (1) = P.


Eu tenho uma pergunta: qual é a diferença entre as linhas 3 e 4 (coluna de definições de limite)? Você poderia me mostrar um exemplo em que 4 contém (lim> 0), mas não 3?
— Homem mascarado

3
Oh, eu descobri. Big Omega é para lim> 0, Big Oh é para lim <infinito, Big Theta é quando ambas as condições são válidas, significando 0 <lim <infinito.
— Masked Man

Para f ∈ Ω (g), o limite no infinito não deve ser avaliado como> = 1? Da mesma forma para f ∈ O (g), 1 = <c <∞?
— user2963623

1
@ user2963623 Não, porque valores finitos estritamente acima de 0, incluindo valores entre 0 e 1, correspondem a "mesma complexidade assintótica, mas diferentes fatores constantes". Se você omitir valores abaixo de 1, há um corte no espaço de fator constante em vez de no espaço de complexidade assintótica.
— Craig Gidney

1
@ubadub Você transmite a operação de exponenciação pelo aparelho. É notação solta.
— Craig Gidney

45

Acho que, quando não consigo entender algo conceitualmente, pensar no porquê de alguém usar o X é útil para entender o X. (Para não dizer que você não tentou isso, estou apenas preparando o cenário).

[coisas que você sabe] Uma maneira comum de classificar algoritmos é por tempo de execução e, citando a grande complexidade de um algoritmo, você pode obter uma estimativa muito boa de qual é "melhor" - o que tiver a função "menor" no O! Mesmo no mundo real, O (N) é "melhor" que O (N²), exceto coisas tolas como constantes supermassas e coisas assim. [/ Coisas que você conhece]

Digamos que exista algum algoritmo que seja executado em O (N). Muito bom, né? Mas digamos que você (sua pessoa brilhante, você) crie um algoritmo executado em O ( N ⁄ loglogloglogN ). YAY! É mais rápido! Mas você se sentiria bobo escrevendo isso várias vezes quando estiver escrevendo sua tese. Então, você o escreve uma vez e pode dizer "Neste artigo, eu provei que o algoritmo X, anteriormente computável no tempo O (N), é de fato computável em o (n)".

Assim, todo mundo sabe que seu algoritmo é mais rápido - quanto não é claro, mas eles sabem que é mais rápido. Teoricamente. :)

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.