“动态”编程与“普通”编程有何不同?

时间:2012-02-28 22:54:52

标签: algorithm dynamic-programming

每当我看到计算机竞赛的解决方案时,我总会看到“动态编程”这个术语。我用Google搜索了这个术语并阅读了一些文章,但它们都没有提供编程VS“动态”编程的简单示例。那么“动态”编程与“普通”编程有何不同? (请简单说明!)

4 个答案:

答案 0 :(得分:4)

Dynamic Programming在与Linear Programming一起使用的意义上更多地使用编程 - 一种解决问题的机制。

我最近阅读的一个描述(但不能再回忆起来源 - [引证需要])表明divide and conquer中常用的recursion方法是一种自上而下解决问题的方法虽然动态编程是一种解决问题的自下而上的方法。

维基百科的文章建议计算Fibonocci sequence是动态编程的绝佳用法 - 当您计算它们以进一步在算法中使用时,memoize会产生结果,以避免重新计算类似的结果。 / p>

Knuth's algorithm for line-breaking paragraphs是动态编程的另一个很好的例子:如果你考虑在每个单词之间插入换行符的可能性(甚至在连字点处打破 单词内的行),感觉像唯一的算法将指数 - 或更糟。但是,通过跟踪与先前换行符相关的“不良”,Knuth的算法实际上在线性时间中以输入的大小运行。 (我必须承认,我并不完全理解Knuth的算法 - 只是它非常聪明。)

答案 1 :(得分:3)

通过“普通”编程,我认为你的意思是C ++ / Java / C#编程,对吧?

动态编程在这个意义上不是“编程”。它不是编写代码,而是“编程”这个词在解决复杂问题的背景下使用,将其分解为更简单的问题。

答案 2 :(得分:0)

动态编程并不是真正的“编程”,而是表查找[和存储] - 这就是牺牲了一点空间来提高时间复杂度[相当多]。

答案 3 :(得分:0)

我知道这是一个老帖子,但我有同样的问题,所以我在这里回答。

动态编程有两个属性:

  1. 最佳子结构:通过将最优解与本地子问题相结合,可以找到全局最优解。例如,fib(x)= fib(x-1)+ fib(x-2)
  2. 重叠子问题:找到最佳解决方案 涉及多次解决同样的问题。例如,在Fibonocci序列中多次计算fib(x)
  3. 根据上述定义/属性,尚不清楚某些问题是否属于"元素是否属于集合"?或"如何找到一组的总和"可以归类为动态编程吗?我可以将集合划分为子集(全局求解)并将其加起来(获得全局答案)。此外,在子集中,我多次进行求和。

    我在书中找到了一个段落,我认为它提供了非常有用的技巧来区分"动态编程"(DP)和"划分和征服算法"(D& C)。

    1. 在D& C子问题中,它们比原始问题小得多。相比之下,DP涉及解决仅比原始问题略小的问题。例如,计算Fib(19)并不比计算Fib(20)小得多。虽然十个元素的计算总和远小于一千万个元素的总和。

    2. D& C算法的效率不依赖于算法的结构化,因此重复解决相同的问题。相反,只有当不同子问题的数量明显小于子问题的总数时,DP才有效。