多语言展示
当前在线:517今日阅读:26今日分享:39

快速学习算法:[1]动态规划

通俗的讲,算法就是任何良定义的计算过程,该过程输入某个值或值的集合并输出某个值或值的集合。对于一些递归问题,我们可以通过适当操作提高其效率,下面就由小编为大家讲解算法中的动态规划一类问题,为简单起见,小编选择python开发环境讲解。
工具/原料
1

电脑

2

python环境

方法/步骤
1

发现问题:举个简单递归例子,著名的斐波那契数列,1、1、2、3、 5、 8...,我们可以使用递归的方法解决任意序号为n的斐波那契数,根据其递归式,如图,小编在写出如下代码,并经过测试发现是正确的

2

但是从递归树中,不难发现许多计算规模相同的子问题被重复计算,如图所示,为计算fib(5),由于递归调用,需要调用fib(4)和fib(3),fib(4)递归调用fib(3)和fib(2),相同的子问题fib(3)被重复计算,对时间和空间造成了浪费

3

仔细观察我们发现,这个问题有一下几个特点:1、该问题包含一个最优子结构;何为最优子结构?即一个问题的最优解包含其子问题的最优解,就称此问题具有最优子结构性质。在斐波那契数列问题中,不难发现其最优子结构表现在其递归式,即 当n>1时,f(n)=f(n-1)+f(n-2)

4

2、该问题是有不断求解重叠子问题而解出的;例如,求解fib(5)时,我们两次求解相同的问题fib(3),fib(3)是fib(5)的重叠子问题

5

3、重构子问题解得到最终解;在本题中,此特点即是递归的返回调用特点

6

综上,对于重复的解,不妨设计一个数组储存这些解的结果,将时间复杂性转换为空间复杂性,如图,小编修改了代码

7

接下来我们测试一下,效果非常明显,这也是小编选择python环境的原因啦,如图,我们使用修改后的fib2计算fib2(100000),小编秒得答案;而使用先前的递归方案计算fib(100000),不仅没有计算出,反而报错(python递归层有限制)注:小编是 i7的本本,ubuntu14.04环境下测试的

8

至此,小编总结一下应用动态规划的方法:1、刻画一个最优解的结构特征;2、递归地定义最优解的解;3、计算最优解的解,通常采用自底向上的方法,即任何子问题的求解依赖于更小的子问题的求解,当按照顺序求解子问题时,它所依赖的那些子问题已经全部解决;4、利用计算出的信息构造一个最优解~~

注意事项

对于C环境下的固定数组大小问题,可采用动态分配解决

推荐信息