Início / Análise de Complexidade / Casos de Análise (melhor, médio, pior)
📊 Casos de Análise (melhor, médio, pior)
Vídeo em breve
Notações como O, Θ e Ω descrevem crescimento.
Também é importante responder uma pergunta fundamental:
o algoritmo se comporta sempre do mesmo jeito?
A resposta é: nem sempre.
Dependendo da entrada, a quantidade de trabalho pode mudar bastante. Por isso, analisamos algoritmos em diferentes casos.
O que são casos de análise?
Casos de análise são diferentes cenários de execução de um mesmo algoritmo.
Os três mais comuns são:
- Melhor caso: a entrada mais favorável possível
- Caso médio: o comportamento esperado em entradas "típicas"
- Pior caso: a entrada mais desfavorável possível
Esses casos não mudam o algoritmo. O que muda é a situação em que ele está sendo executado.
Exemplo clássico: busca linear
Considere este algoritmo:
def encontrar_item(lista, alvo):
for item in lista:
if item == alvo:
return True
return False
Esse algoritmo percorre a lista até encontrar o valor desejado ou até acabar a lista.
Melhor caso
O melhor caso acontece quando o alvo está logo no primeiro elemento.
Nesse cenário, o algoritmo faz apenas 1 comparação.
Podemos descrever esse caso como:
Θ(1)
Pior caso
O pior caso acontece quando:
- o
alvoestá no último elemento, ou - o
alvonão está na lista
Nesse cenário, o algoritmo precisa percorrer toda a entrada.
Podemos descrever esse caso como:
Θ(n)
Caso médio
O caso médio representa o comportamento esperado para entradas comuns. Na busca linear, em uma visão simplificada, isso costuma significar olhar aproximadamente metade da lista antes de encontrar o alvo.
Mesmo assim, o crescimento continua sendo proporcional a n.
Por isso, o caso médio também é linear:
Θ(n)
Por que o pior caso aparece tanto?
Em muitos contextos, usamos o pior caso porque ele oferece uma garantia.
Se dizemos que um algoritmo é O(n²) no pior caso, estamos dizendo:
"mesmo na situação mais desfavorável, ele não cresce mais do que isso."
Essa visão é útil porque:
- ajuda a evitar surpresas
- facilita comparar soluções
- dá uma noção de segurança sobre o limite de custo
Isso não significa que o algoritmo sempre atinge o pior caso. Significa apenas que esse é o teto mais relevante para a análise escolhida.
Melhor caso pode enganar
Olhar só para o melhor caso pode passar uma impressão otimista demais.
Volte ao exemplo da busca linear:
- melhor caso: encontra de primeira
- pior caso: percorre toda a lista
Se eu analisar apenas o melhor caso, posso concluir que a busca linear é "rápida". Mas isso esconde o fato de que, em muitas entradas, ela ainda pode precisar percorrer quase tudo.
Caso médio exige mais cuidado
O caso médio parece intuitivo, mas costuma ser mais difícil de calcular com precisão.
Para fazer uma análise média rigorosa, normalmente precisamos assumir algo sobre a distribuição das entradas:
- quais entradas são mais prováveis?
- todas acontecem com a mesma frequência?
- o valor procurado costuma existir ou não?
Sem esse contexto, o "caso médio" pode virar apenas um chute.
Por isso, em conteúdos introdutórios, o pior caso costuma aparecer mais.
Outro exemplo: verificar duplicatas
Considere uma estratégia simples:
def tem_duplicata(lista):
for i in range(len(lista)):
for j in range(i + 1, len(lista)):
if lista[i] == lista[j]:
return True
return False
Melhor caso
Se os primeiros elementos já formarem uma duplicata, o algoritmo para cedo.
Nesse caso, ele pode fazer poucas comparações.
Pior caso
Se não houver duplicatas, ele precisará testar muitas combinações.
Esse é o cenário mais caro.
O detalhe importante aqui é: um algoritmo pode parar cedo em algumas entradas e ainda assim ter um pior caso bem mais pesado.
Como isso se conecta com O, Ω e Θ?
As notações e os casos se combinam.
Por exemplo, podemos dizer:
- "a busca linear tem pior caso
O(n)" - "a busca linear tem melhor caso
Ω(1)" - "o pior caso desse algoritmo é
Θ(n²)"
O importante é sempre deixar claro de qual caso você está falando.
Sem isso, a análise pode ficar ambígua.
Resumo
- Um mesmo algoritmo pode ter custos diferentes dependendo da entrada.
- Os principais casos são: melhor, médio e pior.
- O pior caso é muito usado porque oferece uma garantia.
- O melhor caso isolado pode ser enganoso.
- O caso médio costuma exigir hipóteses adicionais sobre as entradas.
Comparar diferentes classes de crescimento ajuda a perceber quais algoritmos continuam viáveis quando a entrada aumenta.