赞
踩
动态规划
应用动态规划方法求解的最优化问题应该具备的两个要素:
1、最优子结构
2、子问题重叠
最优子结构
如果一个问题的最优解包含其子问题的最优解,则称该问题具有最优子结构性质。动态规划方法要求问题具有这样性质,是因为在动态规划方法中,一个问题的最优解是通过组合子问题的最优解得到的。
确定一个问题是否具有最优子结构性质的方法:
1、一个问题是否可以划分为多个子问题。
2、在步骤1中,存在一个最优解的划分方法。
3、确定在最优解划分方法中所产生的子问题的性质。
4、证明子问题的解是原问题的最优解的一部分。
当然,对于不同的问题来说,最优子结构的形式也是不同的,主要体现在两个方面:
1、原问题的最优解涉及多少个子问题。就是说最优子结构中的子问题数是不确定的,但对于子问题的划分在保证最优子结构性质的情况下应使子问题尽量简单,易于求解。
2、在确定最优解使用那些子问题时,需要考察多少种选择。因为我们只是知道我们所采用的划分方法会产生一个最优解,但并不确定是哪一种具体的划分方法,所以就需要考察所有可能产生最优解的划分方法。
基于以上,对于动态规划算法的运行时间可以用子问题的总数和每个子问题的考察规模的乘积来粗略的估计该算法的运行时间。
在确定最优子结构时,还有重要的一点就是要保持各个子问题的独立性,也就是说子问题是无关的,一个子问题的解不影响另一个子问题的解。
重叠子问题
适用动态规划方法的最优化问题还应该具备的第二个性质是子问题空间必须足够“小”。就是在子问题的求解中,总是会出现相同的更小的子问题,而不是一直生成新的更小的子问题。
这是因为在动态规划算法中对于对问题的中间过程的解进行存储,只有这些子问题的解会被多次利用时,这样的存储才是有意义的,才能够更大的减少运行所需的时间,这也是动态规划方法和一般的递归方法的主要区别。
动态规划方法的具体实现
动态规划方法其实是一种特殊的递归方法。因为应用动态规划方法的问题所具有的重叠子问题性质,使得动态规划方法可以通过对中间结果的存储而减少这些子问题的重复计算从而减少了运行时间。这是一种典型的空间换时间,但收益是巨大的。特别是子问题的重复求解次数非常多的时候。
动态规划有两种等价的实现方法:
1、带备忘的自顶向下法:该方法的过程相似与普通的递归方法,其不同之处就是对于一个子问题,首先查表,看是否有该问题的解的一个缓存,如果有,那么直接返回,否则的话就按照一般的递归过程进行求解,对每一个求解了的子问题都进行存储。
2、自底向上法:因为所有的问题都依赖于更小的问题,那么就可以先对小问题进行求解,然后存储小问题的解,然后依次向上求解更大一点的问题,直到原问题得到解。
两种实现方法的具有相同的渐近运行时间,但第二种方法的时间复杂性函数通常具有更小的系数。因为在第一种方法中,具体的实现往往是通过递归形式,而在第二种方法中采用的是迭代的形式,所以第二种方法节约了递归产生的开销。
但是第二种方法中,会对所有的子问题都进行求解,第一种方法只根据需求求解,所以如果在原问题求解中很多子问题是完全不必求解的话,第一种方法将更有优势。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。