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 comoh∈O(f+O(g))? Devemos substituirOcom sua definição de dentro para fora. Então, nós temos
∃g′∈ O(g).h ∈ O(f+g′)
e depois
∃g′∈O(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 ) + c g(n))≤cd(f(n)+g(n)), vemos que isso é equivalente a h∈O(f+g); a perda de precisão é ignorada porO de qualquer forma.
E quanto a outras combinações, digamos h∈O(f+Ω(g))? Se tentarmos o mesmo aqui, obtemos
∃g′∈Ω(g).h∈O(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.
- 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.
- 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.