Algoritmos
Algoritmo é um passo a passo finito para resolver um problema.
Só que no mundo real, não basta “resolver de algum jeito”.
Você precisa resolver de um jeito que seja:
- correto
- compreensível
- testável
- viável quando a entrada cresce
O que diferencia um algoritmo bom de um algoritmo meia-boca
Seção intitulada “O que diferencia um algoritmo bom de um algoritmo meia-boca”Um algoritmo bom:
- devolve a resposta certa
- termina em tempo finito
- é fácil de entender e revisar
- escala de forma razoável
Um algoritmo ruim geralmente faz uma destas coisas:
- quebra em caso de borda
- só funciona no exemplo feliz
- fica lento demais quando cresce
- é tão confuso que ninguém quer tocar
Primeiro: corretude. Depois: performance.
Seção intitulada “Primeiro: corretude. Depois: performance.”Muita gente quer falar de Big-O cedo demais.
Só que antes de otimizar, você precisa garantir que a solução:
- realmente resolve o problema
- cobre os casos importantes
- tem uma ideia consistente
Regra prática:
solução correta e simples > solução “genial” e errada
Como pensar antes de implementar
Seção intitulada “Como pensar antes de implementar”Antes de abrir o editor, responde:
- qual é a entrada?
- qual é a saída?
- quais restrições existem?
- qual é o caso mais simples?
- o que pode dar errado?
Esse processo evita muita digitação inútil.
Complexidade: o mínimo que você precisa sentir
Seção intitulada “Complexidade: o mínimo que você precisa sentir”Você não precisa decorar todas as fórmulas agora.
Mas precisa sentir a diferença entre:
O(1): custo constanteO(log n): cresce devagarO(n): cresce linearmenteO(n²): cresce rápido e começa a machucar
Exemplo mental:
- comparar cada item com cada item costuma explodir
- passar uma vez pela coleção costuma ser saudável
Em projeto real, isso separa:
- “funciona na demo”
- de “aguenta produção”
Famílias clássicas de estratégia
Seção intitulada “Famílias clássicas de estratégia”Força bruta
Seção intitulada “Força bruta”Tenta tudo até achar resposta.
Boa quando:
- o problema é pequeno
- você quer validar a ideia
- precisa de uma primeira solução correta
Ruim quando:
- o espaço de busca explode
Dividir para conquistar
Seção intitulada “Dividir para conquistar”Você quebra o problema em partes menores, resolve e depois combina.
Exemplos clássicos:
- merge sort
- binary search
Você toma a melhor decisão local em cada passo.
Funciona muito bem em alguns problemas. Em outros, dá resposta errada com confiança.
Programação dinâmica
Seção intitulada “Programação dinâmica”Você guarda resultados parciais para não recalcular.
É poderosa, mas só faz sentido quando existe:
- subproblema repetido
- estrutura ótima reutilizável
Processo recomendado para resolver problema
Seção intitulada “Processo recomendado para resolver problema”- entenda o enunciado sem pressa
- faça 2 ou 3 exemplos manuais
- escreva pseudocódigo
- implemente a versão simples
- teste casos de borda
- só então pense em otimização
Esse fluxo parece mais lento no começo.
Na prática, ele economiza tempo.
Exemplo direto
Seção intitulada “Exemplo direto”Problema:
“Encontrar duplicados em uma lista.”
Solução 1
Seção intitulada “Solução 1”Comparar todo mundo com todo mundo.
- simples
- correta
- custo ruim:
O(n²)
Solução 2
Seção intitulada “Solução 2”Passar pela lista guardando os vistos em um Set.
- simples
- correta
- custo melhor: perto de
O(n)
Esse tipo de comparação é o coração do raciocínio algorítmico.
Erros comuns
Seção intitulada “Erros comuns”- otimizar cedo demais
- ignorar caso vazio
- ignorar valor nulo
- não provar para si mesmo por que a solução funciona
- complicar um problema que pedia solução direta
Quando otimizar de verdade
Seção intitulada “Quando otimizar de verdade”Você deve pensar seriamente em otimização quando:
- a entrada pode crescer muito
- a operação roda toda hora
- o custo já virou gargalo real
- há requisito claro de performance
Se não existe gargalo real, às vezes a melhor decisão é manter a solução simples.
Exercícios que realmente constroem base
Seção intitulada “Exercícios que realmente constroem base”- busca linear
- busca binária
- encontrar maior e menor valor
- remover duplicados
- contar frequência de elementos
- ordenar por inserção ou seleção
Em cada exercício, pergunte:
- está certo?
- está claro?
- dá para explicar?
- dá para melhorar?
Checklist rápido
Seção intitulada “Checklist rápido”- Você separa corretude de otimização?
- Você pensa em entrada, saída e restrições?
- Você testa caso simples e caso de borda?
- Você consegue explicar por que sua solução funciona?
Se sim, seu raciocínio algorítmico já está ficando forte de verdade.
Próximas ações
Seção intitulada “Próximas ações”- Consolide com Estruturas de Dados e Algoritmos
- Depois aplique esse raciocínio em Projetos