📘 CodingMarble Learn

Complexidade de Algoritmos: Com que Rapidez o Trabalho Cresce?

Vários algoritmos podem resolver o mesmo problema, mas alguns precisam de muito mais passos. Medimos um algoritmo contando seus passos básicos conforme o tamanho da entrada n cresce, e não em segundos de cronômetro. A notação Big O dá nome a esse crescimento: O(1) constante, O(log n) logarítmico, O(n) linear, O(n log n) e O(n²) quadrático. A busca linear é O(n), a busca binária é O(log n); o bubble sort é O(n²), o merge sort é O(n log n). A memória usada é a complexidade de espaço.

🎬 História passo a passo

  1. Encontre o número 13 em 16 caixas abrindo uma por uma. Cada caixa aberta é um passo. Isso é a busca linear: até n passos.
  2. Se as caixas estão em ordem, abra a do meio e descarte a metade errada. Repita. A busca binária encontra o 13 em apenas 4 passos.
  3. Agora compare cinco tipos de algoritmo com n = 16. A altura da barra mostra o número de passos. Alguns ficam pequenos, um fica enorme.
  4. Dobre a entrada de 8 para 16. O(n) dobra, O(n²) fica quatro vezes maior e O(log n) cresce só 1.
  5. Ordenando 1000 itens: o bubble sort precisa de cerca de um milhão de comparações, o merge sort só de cerca de dez mil. A taxa de crescimento importa mais para entradas grandes.
  6. Sua vez: mova o controle de n de 2 até 1024. Veja qual barra dispara mais rápido.

Dica: arraste a cena 3D para girar. Use dois dedos para dar zoom.

🤔 Dúvidas comuns, esclarecidas

Por que não simplesmente medir o programa com um cronômetro?

O tempo muda de computador para computador. A contagem de passos não. O passo 1 conta caixas abertas, não segundos.

Por que a busca binária pode pular metade das caixas?

As caixas estão em ordem. Se a do meio é menor que o alvo, tudo à esquerda dela também é menor, então nenhuma delas pode ser a resposta. Veja as caixas cinzas no passo 2.

Por que jogamos fora as constantes no Big O?

O Big O fala de com que rapidez o trabalho cresce. 2n e n dobram quando n dobra, então crescem do mesmo jeito. O passo 4 mostra a dobra.

O(n²) é sempre mais lento que O(n log n)?

Para n bem pequeno, pode até ser mais rápido, mas conforme n cresce, n² passa à frente depressa. No passo 5, com n = 1000, a diferença é de cerca de 100 vezes.

O que log n significa de verdade aqui?

log₂ n é quantas vezes você pode dividir n ao meio até chegar a 1. Para 1024 são 10. Mova o controle no último passo e veja a barra azul crescer só 1 cada vez que n dobra.

Muitos algoritmos para um mesmo problema

Um algoritmo é um conjunto de passos exatos para resolver um problema. A maioria dos problemas pode ser resolvida por mais de um algoritmo. Por exemplo, para achar um nome numa lista você pode conferir todos os nomes ou, se a lista estiver em ordem, pode ir dividindo-a ao meio.

Os dois dão a resposta certa. A diferença é a eficiência: quanto trabalho e quanta memória cada um precisa. Um bom programador escolhe o algoritmo que continua rápido quando os dados ficam grandes.

Comparando algoritmos pelo tempo gasto

Medir com um cronômetro não é justo: um computador rápido faz um algoritmo lento parecer bom. Por isso contamos os passos básicos (comparações, trocas, somas) em função do tamanho da entrada n.

Melhor caso, caso médio e pior caso

O melhor caso é a entrada mais sortuda (o 13 está na primeira caixa: 1 passo). O pior caso é a mais azarada (o 13 não está lá: n passos). Em geral usamos o pior caso, porque ele é uma garantia: o algoritmo nunca será mais lento do que isso.

Complexidade de tempo e de espaço

A complexidade de tempo diz como o número de passos cresce com n. A complexidade de espaço diz como a memória extra cresce com n. O merge sort é rápido, mas precisa de memória extra; o bubble sort quase não precisa de memória extra, mas é lento.

Notação Big O

O Big O descreve a taxa de crescimento, ignorando detalhes pequenos. Ficamos só com o termo maior e jogamos fora os números constantes: 3n² + 5n + 2 vira O(n²), porque, para n grande, a parte n² é quase tudo.

Big ONomen = 16n = 1000Exemplo
O(1)constante11ler o item 5 de um vetor
O(log n)logarítmico4cerca de 10busca binária
O(n)linear161000busca linear, achar o maior
O(n log n)n log n64cerca de 10.000merge sort
O(n²)quadrático2561.000.000bubble sort, laços aninhados

Regra rápida para o código: um laço sobre n itens é O(n); um laço dentro de outro é O(n²); dividir o problema ao meio a cada vez é O(log n).

Eficiência da busca linear e da busca binária

A busca linear confere os itens um por um. Pior caso: n comparações, ou seja, O(n). Funciona em qualquer lista, ordenada ou não.

A busca binária precisa de uma lista ordenada. Olhe o item do meio; se ele for grande demais, descarte a metade da direita, senão a da esquerda. Cada passo divide a lista ao meio, então o pior caso é cerca de log₂ n + 1 comparações: O(log n). Para 1.000.000 de itens, são cerca de 20 passos em vez de 1.000.000.

Eficiência dos algoritmos de ordenação

Bubble sort, insertion sort e selection sort usam um laço dentro de outro, então fazem cerca de n²/2 comparações: O(n²). O insertion sort é O(n) no melhor caso (uma lista que já está ordenada).

O merge sort divide a lista ao meio cerca de log₂ n vezes e faz cerca de n de trabalho em cada nível: O(n log n). Ele precisa de O(n) de memória extra.

A busca binária precisa de uma lista ordenada. Se você busca só uma vez, ordenar antes (n log n) custa mais do que uma busca linear (n). Se você busca muitas vezes, ordenar uma vez compensa.

Pré-condições, pós-condições e armadilhas da recursão

Uma pré-condição é o que precisa ser verdade antes de o algoritmo começar (busca binária: a lista está ordenada). Uma pós-condição é o que fica garantido quando ele termina (ordenação: cada item é menor ou igual ao próximo). Escrevê-las ajuda a testar e a provar um algoritmo.

Recursão significa que uma função chama a si mesma para um problema menor. Erros comuns:

Experimente: corrida entre duas buscas

Escreva os números de 1 a 32 em papeizinhos e coloque-os em ordem, virados para baixo. Peça a um amigo que escolha um número secreto. Primeiro procure um por um e conte os papéis que virou. Depois procure sempre virando o papel do meio. Repita 5 vezes. Qual método nunca precisou de mais de 6 viradas? Confira com o controle deslizante no último passo do 3D (n = 32: log₂ 32 = 5).

Fórmulas e definições principais

Exemplos resolvidos

1. Uma lista tem 50 nomes. Quantas comparações a busca linear precisa no melhor e no pior caso?

Melhor caso: o nome é o primeiro → 1 comparação. Pior caso: o nome é o último ou não existe → 50 comparações. A busca linear é O(n).

2. Qual é o máximo de comparações que a busca binária precisa numa lista ordenada de 1024 itens?

Cada passo divide a lista ao meio: 1024 → 512 → 256 → 128 → 64 → 32 → 16 → 8 → 4 → 2 → 1. São 10 divisões, mais a última conferência: no máximo 11 comparações (log₂ 1024 = 10).

3. Dê o Big O de f(n) = 4n² + 10n + 7.

Fique com o maior termo (4n²) e jogue fora a constante 4: O(n²).

4. Um laço roda i de 1 até n e, dentro dele, outro laço roda j de 1 até n. Quantas vezes a linha de dentro é executada?

n vezes para cada um dos n valores de i: n × n = n². Complexidade de tempo O(n²).

5. Um programa O(n²) ordena 1000 itens em 2 segundos. Quanto tempo leva, aproximadamente, para 3000 itens?

n fica 3 vezes maior, então n² fica 3² = 9 vezes maior: cerca de 2 × 9 = 18 segundos.

6. Compare o bubble sort e o merge sort para n = 1000 itens.

Bubble sort: cerca de n²/2 = 500.000 comparações. Merge sort: cerca de n log₂ n = 1000 × 10 = 10.000. O merge sort faz cerca de 50 vezes menos trabalho, mas precisa de memória extra.

Erros comuns

Quiz de prática

1. Qual é a complexidade de tempo no pior caso da busca linear?
2. A busca binária só funciona se a lista estiver:
3. Se n dobra, um algoritmo O(n²) leva cerca de:
4. Qual ordenação é O(n log n)?
5. O Big O de 7n + 300 é:

Prática: responda você mesmo

Digite ou escolha sua resposta e aperte Conferir. Use a dica se travar; a solução completa aparece depois que você responder.

Perguntas frequentes

O que é complexidade de tempo, em palavras simples?

Ela diz como o número de passos de um algoritmo cresce quando a entrada fica maior. Por exemplo, O(n) significa que, se a entrada dobra, os passos dobram.

Qual é a diferença entre complexidade de tempo e de espaço?

A complexidade de tempo mede passos; a de espaço mede a memória extra. Um algoritmo pode ser rápido e usar muita memória, como o merge sort.

Qual é o Big O mais rápido?

O(1) (constante) é o melhor, depois O(log n), O(n), O(n log n), O(n²), e o exponencial O(2ⁿ) é o pior dos mais comuns.

Onde isso é ensinado

Canada (Ontario)Grade 12C. Designing Modular Programs
Ukraine11 класAlgorithms
England (GCSE, A level)Year 103.1 Fundamentals of algorithms
USA (Common Core, NGSS, AP)Grade 11Selection and Iteration
USA (Common Core, NGSS, AP)Grade 11Algorithms and Programming
South Korea고등학교 2학년Algorithms and programming
South Korea고등학교 3학년Abstraction and algorithms

Aprenda antes

Aprenda depois