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

Tyler McHenry
fonte
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.

Craig Gidney
fonte
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 ( NloglogloglogN ). 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. :)

agorenst
fonte