A análise de algoritmos precisa de um tipo estranho de matemática que confunde
n2 com (3/2)n2 com 9999n2 com n2/1000 com n2+100n etc.
Esse tipo de matemática é "assintótico" (pois está interessado somente em valores grandes de n). Nessa matemática, as funções são classificadas em "ordens" (como as ordens religiosas que apareceram na Europa durante a Idade Média); todas as funções de uma mesma ordem são "equivalentes". As cinco funções acima, por exemplo, pertencem à mesma ordem.
Antes de dar uma definição do conceito de ordem, convém restringir a atenção a funções assintoticamente não-negativas, ou seja, funções f tais que f(n) >= 0 para todo n suficientemente grande. (Mais explicitamente: f é assintoticamente não-negativa se existe n0 tal que f(n) >= 0 para todo n maior que n0.)
DEFINIÇÃO BÁSICA: Dadas funções assintoticamente não-negativas f e g, dizemos que f está na ordem O de g, e escrevemos f = O(g), se0 <= f(n) <= c · g(n)
para algum c positivo e para todo n suficientemente grande. Em outras palavras, existe um número positivo c e um número n0 tais que f(n) <= c · g(n) para todo n maior que n0.
EXEMPLO: Se f(n) <= 9999 g(n) para todo n >= 1000 então f = O(g). (Mas cuidado: a recíproca não é verdadeira!)
EXEMPLO: Suponha que f(n) = (3/2)n2 + (7/2)n - 4 e que g(n) = n2. A tabela abaixo sugere que f(n) <= 2g(n) para n >= 6 e portanto parece que f(n) = O(g(n)).
n f(n) g(n) 0 -4 0 1 1 1 2 9 4 3 20 9 4 34 16 5 51 25 6 71 36 7 94 49 8 120 64
É fácil verificar que, de fato, f(n) = O(g(n)) com um cálculo mais grosseiro: f(n) <= 2n2 + 4n2 = 6n2 = 6g(n) para todo n.
10n = O(n) 10n2 = O(n) 10n55 = O(2n)
(3/2)n2 + (7/2)n - 4 = O(n) (3/2)n2 + (7/2)n - 4 = O(n2)
log2n = O(log3n) log3n = O(log2n)
A expressão "f = O(g)" tem o mesmo sabor que "f <= g". Agora precisamos de um conceito que tenha o sabor de "f >= g" e de um conceito que tenha o sabor de "f = g".
DEFINIÇÃO 2: Dadas funções assintoticamente não-negativas f e g, dizemos que f está na ordem Omega (veja dicionário) de g, e escrevemos f = Omega(g), sef(n) >= c · g(n) >= 0
para algum c positivo e para todo n suficientemente grande. Em outras palavras, existe um número positivo c e um número n0 tais que f(n) >= c · g(n) para todo n maior que n0.
EXEMPLO: Se f(n) >= g(n)/100000 para todo n >= 888 então f = Omega(g). (Mas cuidado: a recíproca não é verdadeira!)
Qual a relação entre O e Omega? Não é difícil verificar que f = O(g) se e somente se g = Omega(f).
DEFINIÇÃO 3: Dizemos que f e g estão na mesma ordem Theta (veja dicionário) e escrevemos f = Theta(g) sef = O(g) e f = Omega(g).
Trocando em miúdos, f = Theta(g) significa que c1g(n) <= f(n) <= c2g(n) para algum c1 positivo, algum c2 positivo, e para todo n suficientemente grande.
EXEMPO: As funções abaixo pertencem todas à ordem Theta(n2):
n2 , (3/2)n2 , 9999n2 , n2/1000 , n2+100n .
Quais das conjecturas abaixo são verdadeiras? Justifique.