Existe uma diferença entre a programação dinâmica de cima para baixo e de baixo para cima?

33

Existe uma diferença fundamental entre a programação dinâmica de cima para baixo e de baixo para cima?

Em particular, existe um problema que pode ser resolvido de baixo para cima, mas não de cima para baixo? Ou a abordagem de baixo para cima é apenas um desenrolamento da recorrência na abordagem de cima para baixo?

user695652
fonte

Respostas:

27

Para usar o método de baixo para cima, você precisa ser capaz de determinar com eficiência qual é o "baixo", o que geralmente significa que você precisa de um espaço problemático com muita restrição. Se você sabe quais serão os cálculos de nível mais baixo e a ordem de dependência subindo, faz sentido executá-los iterativamente na ordem correta e armazenar esses resultados. Fatores fatoriais, Fibonacci ingênuo e a relação de recorrência de Euler para partições são bons exemplos de problemas adequados a essa abordagem.

Alguns problemas não têm uma ordem de fundo ou dependência facilmente determinada para os cálculos. As avaliações das posições de xadrez, por exemplo, são úteis memorizadas por posição, com a pontuação da avaliação armazenada para que não precise ser recalculada. As posições podem se repetir em vários níveis da árvore de pesquisa devido à movimentação da transposição e repetição, para que os resultados da avaliação sejam úteis. Mas não há como saber quais serão as posições nos níveis mais baixos da árvore sem descer recursivamente (e levando em consideração a poda intermediária), de modo que de cima para baixo é realmente a única abordagem viável.

Kyle Jones
fonte
4
  • Abordagem de cima para baixo: essa é a conseqüência direta da formulação recursiva de qualquer problema. Se a solução para qualquer problema puder ser formulada recursivamente usando a solução para seus subproblemas, e se os subproblemas estiverem sobrepostos, é possível memorizar ou armazenar facilmente as soluções para os subproblemas em uma tabela. Sempre que tentamos resolver um novo subproblema, primeiro verificamos a tabela para ver se ela já está resolvida. Se uma solução foi registrada, podemos usá-la diretamente, caso contrário, resolvemos o subproblema e adicionamos sua solução à tabela.

  • Abordagem de baixo para cima: depois que formulamos a solução de um problema de forma recursiva, como em termos de seus subproblemas, podemos tentar reformulá-lo de maneira de baixo para cima: tente resolver os subproblemas primeiro e use suas soluções para criar e chegar a soluções para sub-problemas maiores. Isso também é geralmente feito de forma tabular, gerando iterativamente soluções para subproblemas cada vez maiores, usando as soluções para subproblemas pequenos. Por exemplo, se já conhecemos os valores de F41 e F40, podemos calcular diretamente o valor de F42.

M.Shahzad
fonte