ScholarGate
Assistente

Programação Dinâmica

Programação dinâmica é um paradigma de design de algoritmos que resolve problemas com subestrutura ótima e subproblemas sobrepostos, resolvendo cada subproblema uma vez e armazenando seu resultado para reutilização, transformando a recomputação exponencial em computação de tempo polinomial.

Encontrar tema com PaperMindEm breveFind papers & topics
Tools & resources
Baixar slides
Learn & explore
VídeoEm breve

Definition

Programação dinâmica é um método que resolve um problema de otimização ou contagem definindo seu valor recursivamente em termos de subproblemas sobrepostos e computando cada subproblema distinto exatamente uma vez, armazenando em cache o resultado para que possa ser reutilizado em vez de recomputado.

Scope

Este tópico abrange as duas características que tornam a programação dinâmica aplicável — subestrutura ótima e subproblemas sobrepostos — e os dois estilos de implementação, memoização top-down e tabulação bottom-up. Inclui problemas canônicos como a subsequência comum mais longa, distância de edição, problema da mochila, multiplicação de cadeia de matrizes e programas dinâmicos de caminho mais curto, juntamente com o design do espaço de estados e a análise das compensações de tempo e espaço. Exclui métodos de caminho mais curto específicos de grafos tratados em algoritmos de grafos, embora compartilhem o mesmo princípio subjacente.

Core questions

  • O problema possui subestrutura ótima que permite que uma solução ótima seja construída a partir de subsoluções ótimas?
  • Como o conjunto de subproblemas (o espaço de estados) é definido para que cada um se repita apenas um número polinomial de vezes?
  • A solução deve ser implementada de cima para baixo com memoização ou de baixo para cima com tabulação?
  • Como a tabela pode ser reconstruída para recuperar a solução ótima real, e não apenas seu valor?
  • Como o espaço pode ser reduzido quando apenas parte da tabela é necessária em cada etapa?

Key concepts

  • subestrutura ótima
  • subproblemas sobrepostos
  • princípio da otimalidade
  • memoização
  • tabulação
  • espaço de estados e recorrência
  • subsequência comum mais longa
  • distância de edição
  • problema da mochila

Key theories

Princípio da otimalidade
O princípio da otimalidade de Bellman afirma que uma política ótima tem a propriedade de que, quaisquer que sejam o estado inicial e a decisão, as decisões restantes devem constituir uma política ótima para o estado resultante — a base formal das recorrências da programação dinâmica.
Memoização versus tabulação
Um programa dinâmico pode ser realizado de cima para baixo adicionando um cache a uma formulação recursiva (memoização) ou de baixo para cima preenchendo uma tabela em ordem de dependência (tabulação); ambos computam cada subproblema uma vez, mas diferem na ordem de avaliação e no comportamento do espaço.

Clinical relevance

A programação dinâmica é onipresente na prática: alinhamento de sequências (Needleman-Wunsch, Smith-Waterman) em biologia computacional, distância de edição em verificação ortográfica e diferenças de controle de versão, o algoritmo de Viterbi em reconhecimento de fala e comunicações, e programas dinâmicos em pesquisa operacional, finanças e aprendizado por reforço.

History

Richard Bellman desenvolveu a programação dinâmica na década de 1950 enquanto estava na RAND Corporation, escolhendo o nome em parte para ser palatável aos patrocinadores da pesquisa. O princípio da otimalidade e a equação de Bellman tornaram-se fundamentais na pesquisa operacional, teoria de controle e ciência da computação, e a técnica foi posteriormente codificada como um paradigma algorítmico central em livros didáticos de algoritmos.

Key figures

  • Richard Bellman
  • Thomas H. Cormen
  • Jon Kleinberg
  • Éva Tardos

Related topics

Seminal works

  • bellman1957
  • cormen2009

Frequently asked questions

Qual é a diferença entre dividir para conquistar e programação dinâmica?
Ambos decompõem um problema em subproblemas, mas os subproblemas de dividir para conquistar são independentes e resolvidos uma vez, enquanto os subproblemas de programação dinâmica se sobrepõem e seriam recomputados muitas vezes por recursão ingênua. A programação dinâmica armazena em cache as soluções de subproblemas para evitar essa recomputação.
Quando a programação dinâmica não se aplica?
Ela requer subestrutura ótima e um conjunto de subproblemas distintos de tamanho polinomial. Se o problema não possui subestrutura ótima, ou se o espaço de estados natural é exponencial e não pode ser comprimido, a programação dinâmica é incorreta ou não é mais eficiente.

Methods for this concept

Related concepts