Programação dinâmica não é magia
- Programação dinâmica é uma técnica usada para resolver problemas complexos, dividindo-os em problemas menores.
- Essa técnica é natural, e muitos algoritmos comuns são aplicações de programação dinâmica a problemas específicos.
- Para ajudar a entender programação dinâmica, o texto oferece uma introdução mais fácil e uma explicação detalhada.
Reclamação
- Engenharia de software frequentemente é péssima em dar nomes.
- Termos como 'bootstrap', 'daemon', 'cascading style sheets', 'cookie' e 'inteligência artificial' são vagos ou podem induzir a erro.
- O termo 'programação dinâmica' também, por si só, não tem relação com algo 'dinâmico'; na prática, é uma ideia usada em projeto de algoritmos.
Cache básico
- Ao tentar resolver um problema dividindo-o em pequenos problemas parecidos, pode ser necessário resolver os mesmos subproblemas várias vezes.
- Usando a sequência de Fibonacci como exemplo, uma implementação recursiva simples repete o mesmo cálculo muitas vezes.
- É possível evitar cálculos duplicados armazenando os resultados em cache (ou usando memoização).
Cache otimizado
- Com memoização, você mantém a recursão, mas calcula cada coisa apenas quando ela é necessária.
- Em vez disso, também é possível adotar uma abordagem que calcula antecipadamente tudo o que será necessário.
- Esse método resolve o problema sem chamadas recursivas, e isso é justamente programação dinâmica.
Distância de edição
- A distância de edição entre duas strings é o número mínimo de edições necessárias para transformar uma string na outra.
- A distância de edição pode ser calculada com substituição, inserção e remoção de caracteres, e isso pode ser resolvido de forma eficiente com programação dinâmica.
- É preciso encontrar uma forma de derivar a solução completa a partir das soluções dos problemas menores.
Advent of Code, Dia 12
- No problema do Advent of Code de 12 de dezembro de 2023, é preciso resolver um nonograma 1D.
- Dá para resolver por força bruta, mas isso tem complexidade exponencial.
- Em vez disso, é possível aplicar programação dinâmica para resolver de forma eficiente.
Conclusão
- Programação dinâmica não é fácil, mas também não está fora do alcance da maioria dos programadores.
- Se você entender como dividir um problema em problemas menores, poderá usar memoização em várias situações, o que representa uma grande melhoria em relação a implementações ingênuas.
- Ao dominar programação dinâmica, você passa a entender toda uma classe de algoritmos, compreende melhor os trade-offs e abre caminho para outras otimizações.
Opinião do GN⁺
- Programação dinâmica é uma técnica importante para resolver problemas complexos com eficiência, reduzindo cálculos redundantes ao armazenar em cache as soluções dos subproblemas em vez de recalculá-las com uma abordagem puramente recursiva.
- Este artigo é muito útil para engenheiros de software iniciantes que querem entender os conceitos básicos de programação dinâmica.
- Os exemplos de sequência de Fibonacci e distância de edição ajudam a compreender o conceito de programação dinâmica e oferecem um bom ponto de partida para aplicá-lo na resolução de problemas reais.
1 comentários
Comentários do Hacker News
O fato de o artigo explicar algoritmos de programação dinâmica (DP) como cache para recursão é um ponto positivo.
Gostou da forma como o artigo primeiro trata o problema de maneira recursiva, depois adiciona cache gradualmente e por fim reduz o cache ao tamanho necessário.
Uma das aplicações mais interessantes de programação dinâmica é o alinhamento pareado de sequências de ácidos nucleicos/proteínas.
Compartilha uma experiência com um professor de algoritmos excepcional.
Compartilha um link para o texto Programação dinâmica não é magia negra.
Diz que, por ter aprendido programação principalmente sozinho, provavelmente não saberia o que fazer se numa entrevista de emprego pedissem para usar programação dinâmica.
O nome "programação dinâmica" pode não parecer vir da área de programação.
Levanta a dúvida se é errado pensar apenas em "memoization" quando se ouve "programação dinâmica".
Programação dinâmica não é magia negra; o difícil é provar que algo pode ser programado dinamicamente e demonstrar sua correção.
Para dominar programação dinâmica, recomenda o livro de algoritmos DPV e o curso da Udacity do Georgia Tech.