Módulo 3 · Análise assintótica de algoritmos
Notação O, Ω e Θ
Aula 3.1 · cerca de 18 minutos
A notação assintótica descreve como o custo cresce quando n vai ao infinito, ignorando constantes e termos menores. As definições formais:
f ∈ O(g) ⇔ ∃c>0, n₀ : f(n) ≤ c·g(n) para todo n ≥ n₀ (limite superior) f ∈ Ω(g) ⇔ ∃c>0, n₀ : f(n) ≥ c·g(n) para todo n ≥ n₀ (limite inferior) f ∈ Θ(g) ⇔ f ∈ O(g) e f ∈ Ω(g) (crescimento exato)
Quando alguém diz “esse algoritmo é O(n²)”, quase sempre quer dizer Θ(n²). O(n²) sozinho só garante que ele não é pior que quadrático.
A hierarquia
1 ≺ log n ≺ √n ≺ n ≺ n log n ≺ n² ≺ n³ ≺ 2ⁿ ≺ n! ≺ nⁿ
Uma regra prática: um computador faz na ordem de 10⁸ operações simples por segundo. Com n = 10⁶, n log n ≈ 2·10⁷ roda em frações de segundo; n² = 10¹² leva horas.
# Θ(n²): compara todos os pares
def tem_duplicata_lento(xs):
return any(xs[i] == xs[j]
for i in range(len(xs)) for j in range(i + 1, len(xs)))
# Θ(n) em média: um conjunto com hash
def tem_duplicata(xs):
return len(set(xs)) != len(xs)Dica: Para comparar duas funções, calcule lim f(n)/g(n). Se der 0, f cresce mais devagar; se der uma constante positiva, são Θ uma da outra; se der ∞, f cresce mais rápido.
Exercício 1
3n² + 100n log n + 7 pertence a qual Θ?
Exercício 2
log₂ n e log₁₀ n pertencem à mesma classe Θ?