Contar Antes de Programar: Complexidade, Restrições e Medição
por Frank de Alcantara em 30/09/2026
- 1. Contar Antes de Programar: Complexidade, Restrições e Medição
- 2. A Máquina por Baixo do Algoritmo: Tipos, Cache e Desvios
- 3. Treino T01: Contando Antes de Codificar
- 4. Caixa de Ferramentas I: Tipos, Números e Trabalho em Tempo de Compilação
- 5. Caixa de Ferramentas II: Vetores, Matrizes, Vistas e Algoritmos
- 6. Treino T02: Pagar Uma Vez, Perguntar Sempre
- 7. Entrada e Saída de Alto Desempenho
- 8. Treino T03: Alimentando a Máquina
- 9. Busca Binária: Comprar Informação pela Metade
- 10. Ordenar por Comparação: o Limite, a Biblioteca e a Seleção
- 11. Ordenar sem Comparar: Contagem, Radix e a Escolha da Ferramenta
- 12. Treino T04: Comprar Informação
- 13. Somas de Prefixo e Arrays de Diferenças: Integrar e Derivar em Tempo Constante
- 14. Janelas que Deslizam: Deque Monotônico, Dois Ponteiros, Kadane e Sparse Table
- 15. Bits como Conjuntos: Máscaras, popcount e Bitsets de Muitas Palavras
- 16. Hash de Prefixo, Seleção em Três Partes e o Algoritmo de Mo
- 17. Treino T05: Intervalos com Orçamento
- 18. Pilhas, Filas, Heaps e Contêineres Associativos: o Estado que Sobrevive à Pergunta Seguinte
Nesta série, a curiosa leitora vai estudar os algoritmos e as estruturas de dados que decidem as competições de programação e, com a mesma frequência, decidem o desempenho de sistemas reais. O ponto de vista será sempre o de quem precisa entregar um programa que responde certo e responde a tempo. Cada técnica aparecerá junto com o problema que a obriga a existir, com a matemática que a justifica, com um exemplo pequeno rastreado passo a passo e com a implementação em C++23. Pelo menos, eu vou tentar.
O combinado é o mesmo das séries Transformers e Redes para Engenharia de Software: os exemplos de código são em C++23, completos quando precisam ser completos, e a leitora refaz na linguagem que preferir. Os programas integrais, em versões clássicas e modernas, ficam no repositório competitive-code, organizado por capítulos. Os artigos mostram os fragmentos necessários para entender cada ideia e indicam o arquivo completo. Os laboratórios rodam no navegador, sem instalar nada.
Antes do primeiro algoritmo, precisamos de uma régua. Algoritmos são comparados pelo trabalho que realizam, e trabalho só pode ser comparado depois de contado. Este artigo ensina a contar o trabalho de laços e de funções recursivas, a traduzir essa contagem na notação que a área usa, a ler os limites de entrada de um problema como uma lista de algoritmos que ainda estão vivos e a medir o tempo de um programa de um jeito que resista à desconfiança. Parece muito para um primeiro artigo. É o mínimo para que os próximos façam sentido.
1. O veredito que a correção não evita
Uma competição de programação apresenta um problema, um conjunto de restrições sobre a entrada e um limite de tempo, tipicamente um ou dois segundos por arquivo de teste. A participante envia um programa. Um juiz, que é apenas outro programa, executa a solução em dezenas de entradas secretas, compara as saídas com as respostas esperadas e mede o tempo de cada execução. O veredito só é aceito quando todas as saídas estão corretas e todas as execuções terminam dentro do limite.
Vamos considerar um programa que compara todos os pares de elementos de uma entrada com
Um trilhão de comparações. Um processador moderno executa algo entre
Correto não basta.
A programação de alto desempenho conhece a mesma verdade com outros nomes. O juiz pode ser uma usuária impaciente, um cliente com um contrato de latência, um sensor que envia dados mais depressa do que o programa consegue processar ou uma simulação que precisa terminar antes da reunião de amanhã. Sempre existe um juiz. A diferença entre uma competição e um sistema real está apenas na clareza com que o limite foi escrito.
Este artigo completo contém estratégias práticas e dados exclusivos reservados para nossos membros cadastrados.
Continuar com Google Acesso gratuito e instantâneo com sua conta Google(Updated: )