Notação O grande aninhada

8

Digamos que eu tenho um gráfico |G|com arestas. Eu quero executar o BFS no que tem um tempo de execução de .|E|=O(V2)GO(V+E)

Parece natural escrever que o tempo de execução neste gráfico seria e, em seguida, simplificaria para .O(O(V2)+V)O(V2)

Existem armadilhas para usar esse atalho "remove-the-anested-O" (não apenas nesse caso, mas de maneira mais geral)?

The Unfun Cat
fonte
4
Se você trabalhar com a definição de big-O, verá que Os aninhados são naturais e redundantes e que a regra de eliminar o O interno está correta.
Dave Clarke
Como V está em O (V ^ 2), acho que você poderia substituir O (V ^ 2) por V se não soubesse o que estava fazendo?
The Unfun Cat
3
Se você não sabe o que está fazendo, pode fazer coisas arbitrariamente erradas.
9338 Dave Clarke #
4
De fato. = não está = em terras grandes.
Dave12
3
Veja também esta excelente pergunta sobre math.SE about = na notação Landau.
Raphael

Respostas:

14

Deixe-me começar com uma recomendação: trate a notação Landau da mesma maneira que você deve tratar o arredondamento: arredondar raramente, arredondar tarde. Se você souber algo mais preciso do queO(.), use-o até concluir todos os cálculos e faça o Landauify no final.


Quanto à questão, vamos examinar esse abuso de notação¹. Como interpretaríamos algo comohO(f+O(g))? Devemos substituirOcom sua definição de dentro para fora. Então, nós temos

gO(g).hO(f+g)

e depois

gO(g).d>0.n.h(n)d(f(n)+g(n))

que é equivalente a

c>0.d>0.n.h(n)d(f(n)+cg(n)).

Como certamente² d(f(n)+cg(n))cd(f(n)+g(n)), vemos que isso é equivalente a hO(f+g); a perda de precisão é ignorada porO de qualquer forma.


E quanto a outras combinações, digamos hO(f+Ω(g))? Se tentarmos o mesmo aqui, obtemos

gΩ(g).hO(f+g).

Mas isso é uma tautologia: hé certamente delimitado acima por algo arbitrariamente grande. Portanto, combinar limites superior e inferior dessa maneira não é significativo.


  1. O(.)e os outros símbolos do Landau mapeiam funções para classes funcionais. Alimentá-lo com uma classe de função não é imediatamente significativo.
  2. Pelo menos se considerarmos apenas funções positivas, que podemos assumir com segurança ao falar sobre tempos de execução. Não tenho certeza se isso funciona em geral.
Rafael
fonte
2

Eu só queria adicionar isso porque o encontrei recentemente. Embora este atalho seja bom com adição e multiplicação (quando não estiver misturandoO com Ω; veja a resposta aceita), deve-se tomar cuidado ao usar expoentes. Por exemplo:

O(nO(m))O(nm).
Neste exemplo, n2m pertence à primeira classe, mas não à segunda.
jadhachem
fonte
1

Por definição, O(g) é um conjunto e se você usar essa notação aninhada, você teria um conjunto em um conjunto, o que estaria errado.

A definição da notação O

O(g)={f|c>0x0>0x>x0:|f(x)|c|g(x)|}

O erro

Você usou termos como O(O(n)+k) onde k e n são funções e O(n)é um conjunto. Mas qual é o resultado de uma função adicionada a um conjunto? Não está definido!

Versão correta

Em vez de usar os símbolos do Landau aninhados, você pode fazer o seguinte: O(m+k),mO(n)

Odin
fonte
2
Sim, mas a notação Landau é frequentemente abusada por (suposta) facilidade de uso, por isso é melhor garantir que todos entendam a mesma coisa. Veja aqui uma abordagem estruturada.
Raphael
0

Na seção 9.3 "OManipulação "do livro Concrete Mathematics (Second Edition), Knuth listou algumas regras de manipulação noO-notation (A seguir, assumo que ambos f(n) e g(n)são positivos; observe que a ordem das regras foi alterada).

(1).nm=O(nm),mm(3).f(n)=O(f(n))(5).O(O(f(n)))=O(f(n))(4).cO(f(n))=O(f(n))(2).O(f(n))+O(g(n))=O(f(n)+g(n))(6).O(f(n))O(g(n))=O(f(n)g(n))=f(n)O(g(n))

By (3), you can wrap/unwrap a function f(n) with an O-notation. Then by (5), you can actually wrap/unwrap (or called, nest) it arbitrarily finite times. Using (4), you can also add/remove constant multiplication factors to/from O.

Then, (2) and (6) allow you to manipulate nested O-notations in the way compatible with + and ×.

hengxin
fonte