Pular para o conteúdo

Algoritmos e estruturas de dados · Fundamentos · 6 min de leitura

Big-O: complexidade de tempo e espaço

A régua para comparar algoritmos: como o número de passos cresce quando a entrada cresce — de O(1) a O(2ⁿ), com exemplos do dia a dia.

O(1) → O(log n)1O(log n) → O(n)2O(n) → O(n log n)3O(n log n) → O(n²)4O(n²) → O(2ⁿ)5O(1) — 1 passoO(1)1 passoO(log n) — ≈ 10 passosO(log n)≈ 10 passosO(n) — 1.000 passosO(n)1.000 passosO(n log n) — ≈ 10.000 passosO(n log n)≈ 10.000 passosO(n²) — 1.000.000 passosO(n²)1.000.000 passosO(2ⁿ) — número com 302 dígitosO(2ⁿ)número com 302 dígitos

Arraste para o lado para ver o diagrama inteiro.

Siga a numeração: cada degrau cresce mais rápido que o anterior. Com 1.000 itens, O(log n) faz uns 10 passos e O(n²) faz um milhão.

O que o Big-O mede

Big-O descreve como o custo de um algoritmo cresce quando a entrada (n) cresce, ignorando constantes e detalhes da máquina. Não diz "quantos milissegundos", e sim "se dobrar a entrada, o que acontece": em O(n) o tempo dobra, em O(n²) quadruplica, em O(log n) aumenta um passo só.

Como calcular

  • Laços em sequência somam: O(n) + O(n) = O(n).
  • Laços aninhados multiplicam: um laço de n dentro de outro de n é O(n²).
  • Dividir pela metade a cada passo dá O(log n) (busca binária).
  • Fique com o termo dominante e descarte constantes: O(3n² + 5n + 100) = O(n²).

Pior caso, caso médio e espaço

Normalmente falamos do pior caso (a garantia). Às vezes o caso médio importa mais: tabela hash é O(1) em média e O(n) no pior caso. Big-O também mede memória extra — uma cópia do array custa O(n) de espaço, um contador custa O(1).

No código: antes e depois

✗ AntesKotlin
// O(n²): compara cada item com todos os outros
fun temRepetido(ids: List<Int>): Boolean {
    for (i in ids.indices)
        for (j in i + 1 until ids.size)
            if (ids[i] == ids[j]) return true
    return false
}
✓ DepoisKotlin
// O(n) de tempo e O(n) de espaço: um conjunto lembra o que já passou
fun temRepetido(ids: List<Int>): Boolean {
    val vistos = HashSet<Int>()
    for (id in ids) if (!vistos.add(id)) return true
    return false
}

Trocar o laço aninhado por um HashSet troca tempo por memória: com 100 mil ids, a primeira versão faz cerca de 5 bilhões de comparações; a segunda, 100 mil inserções.

Em resumo

Exercícios

Responda e confira na hora. Complexidades valem com ou sem espaços, como O(n log n).

  1. Um laço percorre os n itens e, dentro dele, outro laço percorre os n itens de novo. Qual a complexidade?

    Ver a solução

    Resposta: O(n²). Para cada um dos n itens de fora, o laço de dentro roda n vezes: n × n = n².

  2. Simplifique O(3n² + 5n + 100).

    Ver a solução

    Resposta: O(n²). Quando n cresce, 3n² domina 5n e 100; e a constante 3 é descartada.

  3. Um algoritmo O(n²) leva 1 segundo com n = 1.000. Quantos segundos ele leva com n = 10.000?

    Ver a solução

    Resposta: 100. A entrada ficou 10 vezes maior; em O(n²) o tempo cresce 10² = 100 vezes.

Perguntar à IA

Monte um prompt pronto sobre Big-O: complexidade de tempo e espaço na sua linguagem e no seu caso, e abra num chat gratuito.

ChatGPT Claude Perplexity

O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.

Referências

Continue aprendendo

Todos os temas de algoritmos e estruturas de dados →